ZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlLnBhdGNoL2J1aWxkbm90ZXNfb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUucGF0Y2guaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlLnBhdGNoL2J1aWxkbm90ZXNfb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUucGF0Y2guaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVjYmRmNi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS5wYXRjaC9idWlsZG5vdGVzX29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlLnBhdGNoLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08bWV0YSBuYW1lPSJCdWlsZCIgY29udGVudD0iQnVpbGQiPgotPHRpdGxlPldUUCAzLjAuNCBQYXRjaGVzPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLTxoMT5XVFAgMy4wLjQgUGF0Y2hlczwvaDE+Ci0KLTxoMj5vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZTwvaDI+Ci0KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjY3MTQyJz4yNjcxNDI8L2E+LiBCdWlsZCBwYXRoIGVycm9ycyBhZnRlciByZXN0YXJ0IDxwPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEwZjllMC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XVFAgUGF0Y2hlcyBmb3Igb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1cCi1Db250YWlucyBmaXhlcyBkZXNjcmliZWQgaW4gdGhlIGZvbGxvd2luZyBidWdpbGxpYShzKTpcblwKLVxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yNjcxNDIgQnVpbGQgcGF0aCBlcnJvcnMgYWZ0ZXIgcmVzdGFydFxuXAotXG5cCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1TZXB0ZW1iZXIsIDIwMDhcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzNiM2NiLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fY29yZS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUucGF0Y2giCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4wLjQucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUiIHZlcnNpb249IjMuMC40LnYyMDA4MTEyMDAyNDgtN0M3X0VWTkVfRWtNTnRSdlk0VjZvMCIgcGF0Y2g9InRydWUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0gICAgICAgICAKLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0gICAgICAgICAKLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLmNsYXNzcGF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTg4OTQxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxjbGFzc3BhdGg+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iamVtdXRpbCIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InByb3BlcnR5X2ZpbGVzIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iamVtdXRpbC1ub253b3JrYm5lY2giLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLmN2c2lnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDQzY2M0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8uY3ZzaWdub3JlCkBAIC0wLDAgKzEsMyBAQAorYmluCitidWlsZC54bWwKK2phdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLm9wdGlvbnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NjU0MTcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5vcHRpb25zCkBAIC0wLDAgKzEsMyBAQAorb3JnLmVjbGlwc2UuamVtLnV0aWwvZGVidWcvbG9ndHJhY2U9ZmFsc2UKK29yZy5lY2xpcHNlLmplbS51dGlsL2RlYnVnL2xvZ3RyYWNlZmlsZT1mYWxzZQorb3JnLmVjbGlwc2UuamVtLnV0aWwvZGVidWcvbG9nbGV2ZWw9V0FSTklORwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZTQxMjAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5wcm9qZWN0CkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLmplbS51dGlsPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJjMjk1NAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCkBAIC0wLDAgKzEsMyBAQAorI1N1biBBcHIgMTUgMjE6MTU6NDUgRURUIDIwMDcKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitlbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjU3OWNjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTAsMCArMSwyOTIgQEAKKyNUdWUgSnVsIDMxIDIwOjM5OjQ4IEVEVCAyMDA3CitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jaz1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTE1MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19hbm5vdGF0aW9uX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXI9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JyZWFrc19jb21wYXJlX3RvX2Nhc2VzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfZW1wdHlfbGluZXM9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplPTQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3Npbmc9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Vsc2VfaW5faWZfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2ZpbmFsbHlfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV93aGlsZV9pbl9kb19zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm5vdGF0aW9uX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2s9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQ9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2U9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9mb3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luaXRzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9jb25zdGFudD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9zd2l0Y2g9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHNfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9MTUwCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjOGUxYmMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKQEAgLTAsMCArMSw4IEBACisjVHVlIEZlYiAyMSAxMDowOToxOSBFU1QgMjAwNgorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK2Zvcm1hdHRlcl9wcm9maWxlPV9qdmUKK2Zvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTEwCitvcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPWphdmE7amF2YXg7b3JnO29yZy5lY2xpcHNlLnd0cDtvcmcuZWNsaXBzZS5qZW07b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuY2RtO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmNkZTtvcmcuZWNsaXBzZS52ZS5pbnRlcm5hbC5qY207b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuamF2YTtvcmcuZWNsaXBzZS52ZTtjb207CitvcmcuZWNsaXBzZS5qZHQudWkub25kZW1hbmR0aHJlc2hvbGQ9Mworb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjQ2YjI4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCkBAIC0wLDAgKzEsMTIgQEAKKyNGcmkgTWF5IDEzIDEwOjEwOjA0IEVEVCAyMDA1Citjb21waWxlcnMucC5kZXByZWNhdGVkPTEKK2NvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCitjb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0yCitjb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCitjb21waWxlcnMucC51bmtub3duLWNsYXNzPTIKK2NvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0xCitjb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTIKK2NvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKK2NvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTIKK2NvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUwNWViYwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSwyNiBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wCitCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCitCdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmplbS51dGlsOyBzaW5nbGV0b246PXRydWUKK0J1bmRsZS1WZXJzaW9uOiAyLjAuMTAxLnF1YWxpZmllcgorQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW4KK0J1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKK0J1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2g7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvIiwKKyBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLm5hdHVyZTt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2gubmxzO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuamVtLnV0aWwsCisgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaCwKKyBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLm5hdHVyZSwKKyBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIsCisgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LAorIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eXJlbmRlciwKKyBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4KK1JlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAorIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKKyBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjQuMCwzLjAuMCkiLAorIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7YnVuZGxlLXZlcnNpb249IlsyLjQuMCwzLjAuMCkiLAorIG9yZy5lY2xpcHNlLnBlcmZtc3IuY29yZTtidW5kbGUtdmVyc2lvbj0iMS4wLjAiO3Jlc29sdXRpb246PW9wdGlvbmFsLAorIGNvbS5pYm0uaWN1O2J1bmRsZS12ZXJzaW9uPSJbMy44LjEuMSw0LjAuMCkiCitFY2xpcHNlLUxhenlTdGFydDogdHJ1ZQorQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL1BFUkZNU1JfUkVBRE1FLnR4dCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvUEVSRk1TUl9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNTEyNTgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL1BFUkZNU1JfUkVBRE1FLnR4dApAQCAtMCwwICsxLDEyIEBACitvcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUgY29kZSBjYW4gYmUgZm91bmQgaW4gdGhlIHBlcmZtc3IuamFyIGxvYWRlZCBhcyBiaW5hcnkgaW4gdGhpcworcHJvamVjdC4gU2luY2UgdGhpcyBpcyBvcHRpb25hbCwgd2UgbmVlZGVkIHRvIGJlIGFibGUgdG8gY29tcGlsZSB3aXRob3V0IHRoZSB0cnVlCitwbHVnaW4gYmVpbmcgYXZhaWxhYmxlLiBTbyB3ZSBjcmVhdGVkIHRoZSBzdHViIGphciBjb250YWluaW5nIGp1c3Qgd2hhdCB3ZSBuZWVkZWQuCisKK0lmIHRoZXJlIGlzIGEgbmVlZCB0byBjaGFuZ2UgYW55dGhpbmcgaW4gdGhlIHN0dWIgamFyLCB5b3Ugd2lsbCBuZWVkIHRvIGNoZWNrb3V0Cit0aGUgZm9sZGVyIG9yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViLiBUaGlzIHdpbGwgdGhlbgorYmUgYSBzZXBhcmF0ZSBwcm9qZWN0LiBZb3UgY2FuIHRoZW4gbWFrZSB0aGUgY2hhbmdlcyB0aGVyZSwgYW5kIHRoZW4gZm9sbG93aW5nIHRoZQorUkVBRE1FIGluIHRoYXQgcHJvamVjdCB0byBjcmVhdGUgYW5kIGNvbW1pdCB0aGUgY2hhbmdlcy4gCisKK1RoZSBqYXIgaXMgaW4gdGhpcyBwcm9qZWN0J3MgY2xhc3NwYXRoLCBidXQgaXQgaXMgbm90IGV4cG9ydGVkIGFuZCBpcyBub3QgaW4KK3RoZSBwbHVnaW4ueG1sIG9yIGJ1aWxkLnByb3BlcnRpZXMuIFRoaXMgbWVhbnMgaXQgd2lsbCBiZSBhdmFpbGFibGUgZm9yIGNvbXBpbGF0aW9uCitidXQgaXQgd29uJ3Qgc2hvdyB1cCBpbiB0aGUgcnVudGltZSB3b3JrYmVuY2guClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0ICJhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvUkVBRF9NRV9CRUZPUkVfQ0hBTkdJTkdfTUFOSUZFU1RcMDQxXDA0MVwwNDEiICJiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvUkVBRF9NRV9CRUZPUkVfQ0hBTkdJTkdfTUFOSUZFU1RcMDQxXDA0MVwwNDEiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxOGU5NGEKLS0tIC9kZXYvbnVsbAorKysgImIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9SRUFEX01FX0JFRk9SRV9DSEFOR0lOR19NQU5JRkVTVFwwNDFcMDQxXDA0MSIKQEAgLTAsMCArMSw4IEBACitEbyBub3QgaW5jbHVkZSBhIG5ldyBkZXBlbmRlbmN5IHBsdWdpbiB0byB0aGUgTUFOSUZFU1QgZm9yIHRoaXMgcGx1Z2luZCEhIQorCitUaGUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQgdGhpcyBwbHVnaW4gaXMgYWxzbyBleGVjdXRlZCBvdXRzaWRlIG9mIEVjbGlwc2UgZnJhbWV3b3JrLCBzdWNoIElCTSBXZWJzcGhlcmUgQXBwbGljYXRpb24gU2VydmVyIChjKSBJQk0uIFdlIGNhbm5vdCBhZGQKK25ldyBkZXBlbmRlbmNpZXMgdG8gdGhlIHBsdWdpbiBiZWNhdXNlIHRoZSBjdXJyZW50IHNldCBpcyBjb25zaWRlcmVkIHRvIGJlIEFQSS4gQWRkaW5nIGEgbmV3IHNldCB3aXRob3V0IGNvbnN1bHRpbmcgdGhvc2UgdXNlcnMgd291bGQgYnJlYWsKK3RoZW0uCisKK1RoZSBleHRlcm5hbCBBUEkgaXMgYW55dGhpbmcgaW4gdGhlIGplbXV0aWwtbm9ud29ya2JlbmNoIGZvbGRlci4gSWYgaXQgaXMgb25seSBmb3IgYSBjbGFzcyBpbiB0aGUgb3RoZXIgc291cmNlIGZvbGRlcihzKSBpdCBtYXkgYmUgT0sgc2luY2UgdGhleSB3b3VsZCBub3QgYmUgCit1c2luZyB0aGF0IGNvZGUuIEJ1dCBpdCB3b3VsZCBiZSBiZXN0IHRvIGNvbnN1bHQgd2l0aCB0aGVtIGZpcnN0LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvYWJvdXQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWNlYTU5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9hYm91dC5odG1sCkBAIC0wLDAgKzEsMjUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KKzxodG1sPjxoZWFkPjx0aXRsZT5BYm91dDwvdGl0bGU+CisKKworCis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj48L2hlYWQ+PGJvZHkgbGFuZz0iRU4tVVMiPgorPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+CisgCis8UD5KdW5lLCAyMDA4PC9QPgkKKzxoMz5MaWNlbnNlPC9oMz4KKworPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCitpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAorYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KK0ZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCitiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5CithcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCitwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKK2luZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50CithbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KKworPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEwZDg1MQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDI0IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMgCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCisgICAgICAgICAgICAgICAub3B0aW9ucyxcCisgICAgICAgICAgICAgICBhYm91dC5odG1sLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKKyAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCisgICAgICAgICAgICAgICAuCitzcmMuaW5jbHVkZXMgPSBzY2hlbWEvLFwKKyAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKK291dHB1dC4uID0gYmluLworc291cmNlLi4gPSBqZW11dGlsLyxcCisgICAgICAgICAgIHByb3BlcnR5X2ZpbGVzLyxcCisgICAgICAgICAgIGplbXV0aWwtbm9ud29ya2JuZWNoLworamFycy5jb21waWxlLm9yZGVyID0gLgorZXh0cmEuLiA9IC4vb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvcGVyZm1zci5qYXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC1ub253b3JrYm5lY2gvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL0xvZ0VudHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwtbm9ud29ya2JuZWNoL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9Mb2dFbnRyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MGJhZTcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwtbm9ud29ya2JuZWNoL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9Mb2dFbnRyeS5qYXZhCkBAIC0wLDAgKzEsMzI5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisKKworICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlcjsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CisKKy8qKgorICogVGhpcyBjbGFzcyBzaG91bGQgYmUgdXNlZCB3aGVuIGxvZ2dpbmcgaW5mb3JtYXRpb24gd2hpY2ggc2hvdWxkIGJlIGdyb3VwZWQgdG9nZXRoZXIuIEluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBldmVyeSB0aW1lIGl0CisgKiBpcyBuZWVkZWQsIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBjcmVhdGUgYW4gaW5zdGFuY2UgYW5kIHJldXNlIGl0LgorICogPHA+CisgKiBDdXJyZW50bHkgdGhlIG9ubHkgZmllbGRzIHRoYXQgYXJlIGxvZ2dlZCBhcmUgdGhlIHtAbGluayAjZ2V0VGV4dCgpfSBhbmQge0BsaW5rICNnZXRUYXJnZXRFeGNlcHRpb24oKX0uCisgKiAKKyAqIEBzaW5jZSAxLjAuMAorICovCitwdWJsaWMgY2xhc3MgTG9nRW50cnkgeworCisJcHJpdmF0ZSBpbnQgX2V4ZWN1dGlvbk1hcCA9IDA7CisKKwlwcml2YXRlIFRocm93YWJsZSBfY2F1Z2h0RXhjZXB0aW9uID0gbnVsbDsKKworCXByaXZhdGUgU3RyaW5nIF9wcm9wZXJ0aWVzRmlsZU5hbWUgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgbG9jYWxlT2ZPcmlnaW4gPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgc291cmNlSWRlbnRpZmllcjsKKworCXByaXZhdGUgU3RyaW5nIGVsYXBzZWRUaW1lOworCisJcHJpdmF0ZSBTdHJpbmcgdGV4dDsKKworCXByaXZhdGUgU3RyaW5nIG1lc3NhZ2VUeXBlSWRlbnRpZmllcjsKKworCS8qKgorCSAqIFRoZSBmaWxlIG5hbWUgcGFyYW1ldGVyIG11c3QgYmUgYSBuYW1lIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IFJlc291cmNlQnVuZGxlIHRvIGxvYWQgdGhlIHN0cmluZyBmcm9tIHRoZSAucHJvcGVydGllcyBmaWxlLiBUaGUgcGFyYW1ldGVyIG11c3Qgbm90CisJICogYmUgbnVsbCBvciB0aGUgZW1wdHkgc3RyaW5nLgorCSAqIAorCSAqIEBwYXJhbSBwcm9wZXJ0aWVzRmlsZU5hbWUKKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgTG9nRW50cnkoU3RyaW5nIHByb3BlcnRpZXNGaWxlTmFtZSkgeworCQlzZXRQcm9wZXJ0aWVzRmlsZU5hbWUocHJvcGVydGllc0ZpbGVOYW1lKTsKKwl9CisKKwkvKioKKwkgKiBEZWZhdWx0IENvbnN0cnVjdG9yCisJICovCisJcHVibGljIExvZ0VudHJ5KCkgeworCX0KKworCS8qKgorCSAqIEdldCBleGVjdXRpb24gbWFwCisJICogCisJICogQHJldHVybiBleGVjdXRpb24gbWFwCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIGludCBnZXRFeGVjdXRpb25NYXAoKSB7CisJCXJldHVybiBfZXhlY3V0aW9uTWFwOworCX0KKworCS8qKgorCSAqIEdldCB0aGUgcHJvcGVydGllcyBmaWxlIG5hbWUKKwkgKiAKKwkgKiBAcmV0dXJuIHByb3BlcnRpZXMgZmlsZSBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBzZXQuCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0aWVzRmlsZU5hbWUoKSB7CisJCXJldHVybiBfcHJvcGVydGllc0ZpbGVOYW1lOworCX0KKworCS8qKgorCSAqIEdldCB0YXJnZXQgZXhjZXB0aW9uCisJICogCisJICogQHJldHVybiB0YXJnZXQgZXhjZXB0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBzZXQuCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIFRocm93YWJsZSBnZXRUYXJnZXRFeGNlcHRpb24oKSB7CisJCXJldHVybiBfY2F1Z2h0RXhjZXB0aW9uOworCX0KKworCS8qKgorCSAqIEdldCBsb2NhbGUgb2Ygb3JpZ2luCisJICogCisJICogQHJldHVybiBsb2NhbGUgb2Ygb3JpZ2luIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBzZXQuCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIFN0cmluZyBnZXRMb2NhbGVPZk9yaWdpbigpIHsKKwkJcmV0dXJuIGxvY2FsZU9mT3JpZ2luOworCX0KKworCS8qKgorCSAqIEdldCBzb3VyY2UgaWRlbnRpZmllci4KKwkgKiAKKwkgKiBAcmV0dXJuIHNvdXJjZSBpZGVudGlmaWVyIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBzZXQuCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIFN0cmluZyBnZXRTb3VyY2VpZGVudGlmaWVyKCkgeworCQlyZXR1cm4gc291cmNlSWRlbnRpZmllcjsKKwl9CisKKwkvKioKKwkgKiBHZXQgZWxhcHNlZCB0aW1lCisJICogCisJICogQHJldHVybiBlbGFwc2VkIHRpbWUKKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEVsYXBzZWRUaW1lKCkgeworCQlyZXR1cm4gZWxhcHNlZFRpbWU7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBtZXNzYWdlIHR5cGUgaWRlbnRpZmllcgorCSAqIAorCSAqIEByZXR1cm4gbWVzc2FnZSB0eXBlIGlkZW50aWZpZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHNldC4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VUeXBlSWRlbnRpZmllcigpIHsKKwkJcmV0dXJuIG1lc3NhZ2VUeXBlSWRlbnRpZmllcjsKKwl9CisKKwkvKioKKwkgKiBTZXQgZXhlY3V0aW9uIG1hcAorCSAqIAorCSAqIEBwYXJhbSBtYXAKKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRFeGVjdXRpb25NYXAoaW50IG1hcCkgeworCQlfZXhlY3V0aW9uTWFwID0gbWFwOworCX0KKworCS8qKgorCSAqIFNldCBwcm9wZXJ0aWVzIGZpbGUgbmFtZQorCSAqIAorCSAqIEBwYXJhbSBmTmFtZQorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXNGaWxlTmFtZShTdHJpbmcgZk5hbWUpIHsKKwkJX3Byb3BlcnRpZXNGaWxlTmFtZSA9IGZOYW1lOworCX0KKworCS8qKgorCSAqIFNldCB0YXJnZXQgZXhjZXB0aW9uCisJICogCisJICogQHBhcmFtIGV4YworCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyB2b2lkIHNldFRhcmdldEV4Y2VwdGlvbihUaHJvd2FibGUgZXhjKSB7CisJCV9jYXVnaHRFeGNlcHRpb24gPSBleGM7CisJfQorCisJLyoqCisJICogQXBwZW5kIHN0YWNrdHJhY2Ugb2YgY3VycmVudCBzdGFjayAoYXQgdGhlIHRpbWUgb2YgY2FsbCB0byB0aGlzIG1ldGhvZCkgdG8gdGhlIHRleHQgYnVmZmVyLgorCSAqIAorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyB2b2lkIGFwcGVuZFN0YWNrVHJhY2UoKSB7CisJCS8vIEdyYWIgdGhlIHN0YWNrIHRyYWNlIGZyb20gdGhlIFRocmVhZCAuLi4KKwkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ5dGVPdXRwdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCVByaW50V3JpdGVyIHByaW50V3JpdGVyID0gbmV3IFByaW50V3JpdGVyKGJ5dGVPdXRwdXQpOworCQkvLyBDYW4ndCBjYWxsIFRocmVhZC5kdW1wU3RhY2soKSBiZWNhdXNlIGl0IGRvZXNuJ3QgdGFrZSBhIHdyaXRlciBhcyBpbnB1dC4KKwkJLy8gQ29weSBpdHMgbWVjaGFuaXNtIGluc3RlYWQuCisJCW5ldyBFeGNlcHRpb24oIlN0YWNrIHRyYWNlIikucHJpbnRTdGFja1RyYWNlKHByaW50V3JpdGVyKTsgLy8kTk9OLU5MUy0xJAorCQlwcmludFdyaXRlci5mbHVzaCgpOworCisJCS8vIGFuZCB1cGRhdGUgdGhlIHRleHQgdG8gdGhlIExvZ0VudHJ5J3MgdGV4dC4KKwkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJYnVmZmVyLmFwcGVuZChnZXRUZXh0KCkpOworCQlidWZmZXIuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCisJCWJ1ZmZlci5hcHBlbmQoYnl0ZU91dHB1dC50b1N0cmluZygpKTsKKwkJc2V0VGV4dChidWZmZXIudG9TdHJpbmcoKSk7CisJfQorCisJLyoqCisJICogR2V0IHRoZSB0ZXh0LgorCSAqIAorCSAqIEByZXR1cm4gdGV4dCBvciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Qgc2V0LgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKKwkJcmV0dXJuIHRleHQ7CisJfQorCisJLyoqCisJICogU2V0IHRoZSB0ZXh0CisJICogCisJICogQHBhcmFtIHN0cmluZworCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHN0cmluZykgeworCQl0ZXh0ID0gc3RyaW5nOworCX0KKworCS8qKgorCSAqIFNldCBldmVyeSBlbnRyeSB0byB0aGUgZGVmYXVsdCB2YWx1ZSBleGNlcHQgdGhlIHByb3BlcnRpZXMgZmlsZSBuYW1lLgorCSAqIAorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyB2b2lkIHJlc2V0KCkgeworCQlzZXRFeGVjdXRpb25NYXAoMCk7CisJCXNldFRhcmdldEV4Y2VwdGlvbihudWxsKTsKKwkJbG9jYWxlT2ZPcmlnaW4gPSBudWxsOworCQlzb3VyY2VJZGVudGlmaWVyID0gbnVsbDsKKwkJZWxhcHNlZFRpbWUgPSBudWxsOworCQlzZXRUZXh0KG51bGwpOworCX0KKworCS8qKgorCSAqIFNldCBsb2NhbGUgb2Ygb3JpZ2luLgorCSAqIAorCSAqIEBwYXJhbSBvcmlnaW4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRMb2NhbGVPZk9yaWdpbihTdHJpbmcgb3JpZ2luKSB7CisJCWxvY2FsZU9mT3JpZ2luID0gb3JpZ2luOworCX0KKworCS8qKgorCSAqIFNldCBzb3VyY2UgaWQuCisJICogCisJICogQHBhcmFtIGlkCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIHZvaWQgc2V0U291cmNlSUQoU3RyaW5nIGlkKSB7CisJCXNvdXJjZUlkZW50aWZpZXIgPSBpZDsKKwl9CisKKwkvKioKKwkgKiBTZXQgZWxhcHNlZCB0aW1lLgorCSAqIAorCSAqIEBwYXJhbSB0aW1lCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIHZvaWQgc2V0RWxhcHNlZFRpbWUobG9uZyB0aW1lKSB7CisJCWVsYXBzZWRUaW1lID0gU3RyaW5nLnZhbHVlT2YodGltZSk7CisJfQorCisJLyoqCisJICogU2V0IHNvdXJjZSBpZGVudGlmaWVyLgorCSAqIAorCSAqIEBwYXJhbSBzdHJpbmcKKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTb3VyY2VJZGVudGlmaWVyKFN0cmluZyBzdHJpbmcpIHsKKwkJc2V0U291cmNlSUQoc3RyaW5nKTsKKwl9CisKKwkvKioKKwkgKiBTZXQgbWVzc2FnZSB0eXBlIGlkZW50aWZpZXIuCisJICogCisJICogQHBhcmFtIHN0cmluZworCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI3NldFRleHQoU3RyaW5nKX0gaW5zdGVhZCBhbmQgY2FsbGluZyBpdCB3aXRoIHRoZSByZXN1bHQgb2Yge0BsaW5rIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0I2Zvcm1hdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0W10pfQorCSAqLworCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VUeXBlSWRlbnRpZmllcihTdHJpbmcgc3RyaW5nKSB7CisJCW1lc3NhZ2VUeXBlSWRlbnRpZmllciA9IHN0cmluZzsKKwl9CisKKwkvKioKKwkgKiBTZXQgbWVzc2FnZSB0eXBlIGlkLiBTYW1lIGFzIDxjb2RlPnNldE1lc3NhZ2VUeXBlSWRlbnRpZmllci48L2NvZGU+CisJICogQHBhcmFtIHN0cmluZworCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI3NldFRleHQoU3RyaW5nKX0gaW5zdGVhZCBhbmQgY2FsbGluZyBpdCB3aXRoIHRoZSByZXN1bHQgb2Yge0BsaW5rIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0I2Zvcm1hdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0W10pfQorCSAqLworCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VUeXBlSUQoU3RyaW5nIHN0cmluZykgeworCQlzZXRNZXNzYWdlVHlwZUlkZW50aWZpZXIoc3RyaW5nKTsKKwl9CisKKwkvKioKKwkgKiBTZXQgdG9rZW5zLiAoQ3VycmVudGx5IHRoaXMgaXMgaWdub3JlZCkuCisJICogCisJICogQHBhcmFtIHN0cmluZ3MKKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNzZXRUZXh0KFN0cmluZyl9IGluc3RlYWQgYW5kIGNhbGxpbmcgaXQgd2l0aCB0aGUgcmVzdWx0IG9mIHtAbGluayBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdCNmb3JtYXQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdFtdKX0KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUb2tlbnMoU3RyaW5nW10gc3RyaW5ncykgeworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCisJICovCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ5dGVPdXRwdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCVByaW50V3JpdGVyIHByaW50V3JpdGVyID0gbmV3IFByaW50V3JpdGVyKGJ5dGVPdXRwdXQpOworCQlpZiAodGV4dCAhPSBudWxsKQorCQkJcHJpbnRXcml0ZXIucHJpbnRsbih0ZXh0KTsKKwkJaWYgKF9jYXVnaHRFeGNlcHRpb24gIT0gbnVsbCkgeworCQkJX2NhdWdodEV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UocHJpbnRXcml0ZXIpOworCQl9CisJCXByaW50V3JpdGVyLmZsdXNoKCk7CisJCXJldHVybiBieXRlT3V0cHV0LnRvU3RyaW5nKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwtbm9ud29ya2JuZWNoL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eS9JTG9nUmVuZGVyZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC1ub253b3JrYm5lY2gvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5L0lMb2dSZW5kZXJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMWU5NTEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwtbm9ud29ya2JuZWNoL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eS9JTG9nUmVuZGVyZXIuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKworCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5OworCisvKioKKyAqIEJhc2ljIGxvZyByZW5kZXJlciBpbnRlcmZhY2UuIEl0IGlzIHJlcGxhY2VkIGJ5IHRoZSBleHRlbnNpb24gPGNvZGU+SUxvZ1JlbmRlcmVyMi48L2NvZGU+CisgKiAKKyAqIEBzaW5jZSAxLjAuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIElMb2dSZW5kZXJlciB7CisKKwkvKioKKwkgKiBMb2dnZWQgdG8gY29uc29sZS4KKwkgKi8KKwlmaW5hbCBwdWJsaWMgc3RhdGljIFN0cmluZyBDT05TT0xFX0RFU0NSSVBUSU9OID0gImNvbnNvbGUiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBMb2dnZWQgdG8gd29ya2JlbmNoLgorCSAqLworCWZpbmFsIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdPUktCRU5DSF9ERVNDUklQVElPTiA9ICJ3b3JrYmVuY2ggbG9nIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogTm90IGxvZ2dlZC4KKwkgKi8KKwlmaW5hbCBwdWJsaWMgc3RhdGljIFN0cmluZyBOT0xPR19ERVNDUklQVElPTiA9ICIiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBMb2cgbGV2ZWxzLiBUaGVzZSBhcmUgZGVwcmVjYXRlZCwgdXNlIDxjb2RlPmphdmEudXRpbC5sb2dnaW5nLkxldmVsPC9jb2RlPiBjb2RlcyBpbnN0ZWFkLgorCSAqLworCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IExPR19FUlJPUiA9IDA7CisKKwlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBMT0dfVFJBQ0UgPSAxOworCisJZmluYWwgcHVibGljIHN0YXRpYyBpbnQgTE9HX1dBUk5JTkcgPSAyOworCisJZmluYWwgcHVibGljIHN0YXRpYyBpbnQgTE9HX0lORk8gPSAzOworCisJZmluYWwgcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFBsdWdpbklEID0gIm9yZy5lY2xpcHNlLmplbS51dGlsIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogTG9nIHRoZSBzdHJpbmcgYXQgdGhlIHNwZWNpZmllZCB0eXBlLgorCSAqIAorCSAqIEBwYXJhbSBtc2cKKwkgKiBAcGFyYW0gdHlwZQorCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGxvZyhTdHJpbmcgbXNnLCBpbnQgdHlwZSk7CisKKwkvKioKKwkgKiBTdGFydCBvciBzdG9wIHRoZSB0cmFjaW5nLgorCSAqIAorCSAqIEBwYXJhbSBGbGFnCisJICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiB0byBzdGFydCB0aGUgdHJhY2luZy4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUcmFjZU1vZGUoYm9vbGVhbiBGbGFnKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwtbm9ud29ya2JuZWNoL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eS9JTG9nUmVuZGVyZXIyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwtbm9ud29ya2JuZWNoL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eS9JTG9nUmVuZGVyZXIyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVhNjcwZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC1ub253b3JrYm5lY2gvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5L0lMb2dSZW5kZXJlcjIuamF2YQpAQCAtMCwwICsxLDE1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKworCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5OworCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CisgCisvKioKKyAqIExvZyByZW5kZXJlciB0aGF0IHByb3ZpZGVzIG1vcmUgZnVuY3Rpb24uIEJhc2ljYWxseSBpdCBjYW4gaGFuZGxlCisgKiB0aGUgbG9nZ2luZyBvZiBzcGVjaWZpYyB0eXBlcyBpbiBhIGRpZmZlcmVudCBtYW5uZXIgdGhhbiB0aGUgZGVmYXVsdAorICogY29udmVyc2lvbiB0byBzdHJpbmcgc3VwcGxpZWQgYnkgTG9nZ2VyLgorICogCisgKiBJdCBhbHNvIHVzZXMgdGhlIExldmVsIGNsYXNzZXMgZnJvbSBqYXZhLnV0aWwubG9nZ2luZyBhcyB0aGUgbG9nZ2luZyBsZXZlbHMuCisgKiAKKyAqIEBzaW5jZSAxLjAuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIElMb2dSZW5kZXJlcjIgZXh0ZW5kcyBJTG9nUmVuZGVyZXIgeworCQorCS8qKgorCSAqIFdoZW4gTG9nZ2VyLnNldExldmVsKERFRkFVTFQpOiByZXN0b3JlIHRvIHdoYXQgdGhlIGRlZmF1bHQgbGV2ZWwgd2FzLgorCSAqIFdoZW4gbG9nKC4uLixERUZBVUxUKTogTG9nIGF0IHRoZSBkZWZhdWx0IGxldmVsIGZvciB0aGUgdHlwZSBvZiBvYmplY3QuCisJICovCisJc3RhdGljIGZpbmFsIExldmVsIERFRkFVTFQgPSBuZXcgTG9nZ2VyLkxvY2FsTGV2ZWwoIkRFRkFVTFQiLCBJbnRlZ2VyLk1BWF9WQUxVRS0xKTsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIFdoZW4gbG9nKC4uLixUUkFDRSkgOiBMb2cgb25seSB3aGVuIGluIHRyYWNlIG1vZGUuCisJICogRG9uJ3QgdXNlIGluIExvZ2dlci5zZXRMZXZlbCgpLiBIYXMgbm8gbWVhbmluZyBpbiB0aGF0IGNhc2UuCisJICovCisJc3RhdGljIGZpbmFsIExldmVsIFRSQUNFID0gbmV3IExvZ2dlci5Mb2NhbExldmVsKCJUUkFDRSIsIEludGVnZXIuTUFYX1ZBTFVFLTIpOwkgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogTG9nIHRoZSB0aHJvd2FibGUgYXQgdGhlIGdpdmVuIGxldmVsIChpZiBERUZBVUxULCB1c2UgZGVmYXVsdCBsZXZlbCBmb3IgYSB0aHJvd2FibGUpLgorCSAqIAorCSAqIEBwYXJhbSB0CisJICogQHBhcmFtIGxldmVsCisJICogQHJldHVybgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCVN0cmluZyBsb2coVGhyb3dhYmxlIHQsIExldmVsIGxldmVsKTsKKwkKKwkvKioKKwkgKiBMb2cgdGhlIG9iamVjdCBhdCB0aGUgZ2l2ZW4gbGV2ZWwgKGlmIERFRkFVTFQsIHVzZSBkZWZhdWx0IGxldmVsIGZvciBhbiBvYmplY3QpLgorCSAqIAorCSAqIEBwYXJhbSBvCisJICogQHBhcmFtIGxldmVsCisJICogQHJldHVybgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCVN0cmluZyBsb2coT2JqZWN0IG8sIExldmVsIGxldmVsKTsKKwkKKwkvKioKKwkgKiBMb2cgdGhlIGJvb2xlYW4gYXQgdGhlIGdpdmVuIGxldmVsIChpZiBERUZBVUxULCB1c2UgZGVmYXVsdCBsZXZlbCBmb3IgYSBib29sZWFuKS4KKwkgKiAKKwkgKiBAcGFyYW0gYgorCSAqIEBwYXJhbSBsZXZlbAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlTdHJpbmcgbG9nKGJvb2xlYW4gYiwgTGV2ZWwgbGV2ZWwpOwkKKworCS8qKgorCSAqIExvZyB0aGUgY2hhciBhdCB0aGUgZ2l2ZW4gbGV2ZWwgKGlmIERFRkFVTFQsIHVzZSBkZWZhdWx0IGxldmVsIGZvciBhIGNoYXIpLgorCSAqIAorCSAqIEBwYXJhbSBjCisJICogQHBhcmFtIGxldmVsCisJICogQHJldHVybgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCVN0cmluZyBsb2coY2hhciBjLCBMZXZlbCBsZXZlbCk7CQorCQorCS8qKgorCSAqIExvZyB0aGUgYnl0ZSBhdCB0aGUgZ2l2ZW4gbGV2ZWwgKGlmIERFRkFVTFQsIHVzZSBkZWZhdWx0IGxldmVsIGZvciBhIGJ5dGUpLgorCSAqIAorCSAqIEBwYXJhbSBiCisJICogQHBhcmFtIGxldmVsCisJICogQHJldHVybgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCVN0cmluZyBsb2coYnl0ZSBiLCBMZXZlbCBsZXZlbCk7CisJCisJLyoqCisJICogTG9nIHRoZSBzaG9ydCBhdCB0aGUgZ2l2ZW4gbGV2ZWwgKGlmIERFRkFVTFQsIHVzZSBkZWZhdWx0IGxldmVsIGZvciBhIHNob3J0KS4KKwkgKiAKKwkgKiBAcGFyYW0gcworCSAqIEBwYXJhbSBsZXZlbAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlTdHJpbmcgbG9nKHNob3J0IHMsIExldmVsIGxldmVsKTsKKwkKKwkvKioKKwkgKiBMb2cgdGhlIGludCBhdCB0aGUgZ2l2ZW4gbGV2ZWwgKGlmIERFRkFVTFQsIHVzZSBkZWZhdWx0IGxldmVsIGZvciBhbiBpbnQpLgorCSAqIAorCSAqIEBwYXJhbSBpCisJICogQHBhcmFtIGxldmVsCisJICogQHJldHVybgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCVN0cmluZyBsb2coaW50IGksIExldmVsIGxldmVsKTsKKworCS8qKgorCSAqIExvZyB0aGUgbG9uZyBhdCB0aGUgZ2l2ZW4gbGV2ZWwgKGlmIERFRkFVTFQsIHVzZSBkZWZhdWx0IGxldmVsIGZvciBhIGxvbmcpLgorCSAqIAorCSAqIEBwYXJhbSBsCisJICogQHBhcmFtIGxldmVsCisJICogQHJldHVybgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCVN0cmluZyBsb2cobG9uZyBsLCBMZXZlbCBsZXZlbCk7CisKKwkvKioKKwkgKiBMb2cgdGhlIGZsb2F0IGF0IHRoZSBnaXZlbiBsZXZlbCAoaWYgREVGQVVMVCwgdXNlIGRlZmF1bHQgbGV2ZWwgZm9yIGEgZmxvYXQpLgorCSAqIAorCSAqIEBwYXJhbSBmCisJICogQHBhcmFtIGxldmVsCisJICogQHJldHVybgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCVN0cmluZyBsb2coZmxvYXQgZiwgTGV2ZWwgbGV2ZWwpOworCisJLyoqCisJICogTG9nIHRoZSBkb3VibGUgYXQgdGhlIGdpdmVuIGxldmVsIChpZiBERUZBVUxULCB1c2UgZGVmYXVsdCBsZXZlbCBmb3IgYSBkb3VibGUpLgorCSAqIAorCSAqIEBwYXJhbSBkCisJICogQHBhcmFtIGxldmVsCisJICogQHJldHVybgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCVN0cmluZyBsb2coZG91YmxlIGQsIExldmVsIGxldmVsKTsKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC1ub253b3JrYm5lY2gvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5L0pES0NvbnNvbGVSZW5kZXJlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsLW5vbndvcmtibmVjaC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHkvSkRLQ29uc29sZVJlbmRlcmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdjOWQ3NQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC1ub253b3JrYm5lY2gvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5L0pES0NvbnNvbGVSZW5kZXJlci5qYXZhCkBAIC0wLDAgKzEsMjQ3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorCisKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHk7CisKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKKworLyoqCisgKiBEZWZhdWx0IGxvZyByZW5kZXJlciB0byB1c2Ugd2hlbiBub3QgcnVubmluZyB1bmRlciBFY2xpcHNlLiBJdCBsb2dzIHRvIHN5c291dCBhbmQgc3lzZXJyLgorICogCisgKiBAc2luY2UgMS4xLjAKKyAqLworCitwdWJsaWMgY2xhc3MgSkRLQ29uc29sZVJlbmRlcmVyIGltcGxlbWVudHMgSUxvZ1JlbmRlcmVyMiB7CisKKwlwcml2YXRlIGJvb2xlYW4gZlRyYWNlTW9kZSA9IGZhbHNlOyAvLyB3aWxsIHdlIGFjdHVhbGx5IHB1bmNoIHRyYWNlIG1lc3NhZ2VkIG9yIG5vdAorCisJcHJpdmF0ZSBib29sZWFuIGZTZXR0aW5nVHJhY2UgPSBmYWxzZTsKKworCXByaXZhdGUgTG9nZ2VyIGZNeUxvZ2dlciA9IG51bGw7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RlciB0YWtpbmcgYSBsb2dnZXIuCisJICogCisJICogQHBhcmFtIGxvZ2dlcgorCSAqIAorCSAqIEBzaW5jZSAxLjEuMAorCSAqLworCXB1YmxpYyBKREtDb25zb2xlUmVuZGVyZXIoTG9nZ2VyIGxvZ2dlcikgeworCQlzdXBlcigpOworCQlmTXlMb2dnZXIgPSBsb2dnZXI7CisJCWZUcmFjZU1vZGUgPSBmTXlMb2dnZXIuZ2V0VHJhY2VNb2RlKCk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyI2xvZyhqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCisJICovCisJcHVibGljIFN0cmluZyBsb2coU3RyaW5nIG1zZywgaW50IHR5cGUpIHsKKworCQlpZiAodHlwZSA9PSBJTG9nUmVuZGVyZXIuTE9HX1RSQUNFICYmICFmVHJhY2VNb2RlKQorCQkJcmV0dXJuIG51bGw7CisKKwkJaWYgKHR5cGUgPT0gSUxvZ1JlbmRlcmVyLkxPR19FUlJPUikKKwkJCVN5c3RlbS5lcnIucHJpbnRsbihtc2cpOworCQllbHNlCisJCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKKwkJcmV0dXJuIElMb2dSZW5kZXJlci5DT05TT0xFX0RFU0NSSVBUSU9OOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlciNzZXRUcmFjZU1vZGUoYm9vbGVhbikKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUcmFjZU1vZGUoYm9vbGVhbiBmbGFnKSB7CisKKwkJaWYgKGZTZXR0aW5nVHJhY2UpCisJCQlyZXR1cm47CisJCWZTZXR0aW5nVHJhY2UgPSB0cnVlOworCQlmVHJhY2VNb2RlID0gZmxhZzsKKwkJZk15TG9nZ2VyLnNldFRyYWNlTW9kZShmbGFnKTsKKwkJZlNldHRpbmdUcmFjZSA9IGZhbHNlOworCX0KKworCS8qKgorCSAqIExvZyB0aGUgc3RyaW5nIGF0IHRoZSBnaXZlbiBsZXZlbC4KKwkgKiAKKwkgKiBAcGFyYW0gbXNnCisJICogQHBhcmFtIGxldmVsCisJICogQHJldHVybiA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OPC9jb2RlPgorCSAqIAorCSAqIEBzaW5jZSAxLjEuMAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgbG9nKFN0cmluZyBtc2csIExldmVsIGxldmVsKSB7CisJCWlmIChsZXZlbCA9PSBMZXZlbC5TRVZFUkUpCisJCQlTeXN0ZW0uZXJyLnByaW50bG4obXNnKTsKKwkJZWxzZQorCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7CisJCXJldHVybiBJTG9nUmVuZGVyZXIuQ09OU09MRV9ERVNDUklQVElPTjsKKwl9CisKKwkvKioKKwkgKiBBbnN3ZXIgaWYgbG9nZ2luZyBhdCB0aGUgZ2l2ZW4gbGV2ZWwKKwkgKiAKKwkgKiBAcGFyYW0gbG9nTGV2ZWwKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGxvZ2dpbmcgYXQgdGhlIGdpdmVuIGxldmVsLgorCSAqIAorCSAqIEBzaW5jZSAxLjEuMAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGlzTG9nZ2luZyhMZXZlbCBsb2dMZXZlbCkgeworCQlyZXR1cm4gZlRyYWNlTW9kZSB8fCBmTXlMb2dnZXIuaXNMb2dnaW5nTGV2ZWwobG9nTGV2ZWwpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKGJvb2xlYW4sIGphdmEudXRpbC5sb2dnaW5nLkxldmVsKQorCSAqLworCXB1YmxpYyBTdHJpbmcgbG9nKGJvb2xlYW4gYiwgTGV2ZWwgbGV2ZWwpIHsKKwkJaWYgKGxldmVsID09IERFRkFVTFQpCisJCQlsZXZlbCA9IExldmVsLkZJTkVTVDsKKwkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCisJCQlyZXR1cm4gbG9nKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKFN0cmluZy52YWx1ZU9mKGIpLCBsZXZlbCksIGxldmVsKTsKKwkJZWxzZQorCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKGJ5dGUsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsKQorCSAqLworCXB1YmxpYyBTdHJpbmcgbG9nKGJ5dGUgYiwgTGV2ZWwgbGV2ZWwpIHsKKwkJaWYgKGxldmVsID09IERFRkFVTFQpCisJCQlsZXZlbCA9IExldmVsLkZJTkVTVDsKKwkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCisJCQlyZXR1cm4gbG9nKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKFN0cmluZy52YWx1ZU9mKGIpLCBsZXZlbCksIGxldmVsKTsKKwkJZWxzZQorCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKGNoYXIsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsKQorCSAqLworCXB1YmxpYyBTdHJpbmcgbG9nKGNoYXIgYywgTGV2ZWwgbGV2ZWwpIHsKKwkJaWYgKGxldmVsID09IERFRkFVTFQpCisJCQlsZXZlbCA9IExldmVsLkZJTkVTVDsKKwkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCisJCQlyZXR1cm4gbG9nKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKFN0cmluZy52YWx1ZU9mKGMpLCBsZXZlbCksIGxldmVsKTsKKwkJZWxzZQorCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKGRvdWJsZSwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCisJICovCisJcHVibGljIFN0cmluZyBsb2coZG91YmxlIGQsIExldmVsIGxldmVsKSB7CisJCWlmIChsZXZlbCA9PSBERUZBVUxUKQorCQkJbGV2ZWwgPSBMZXZlbC5GSU5FU1Q7CisJCWlmIChpc0xvZ2dpbmcobGV2ZWwpKQorCQkJcmV0dXJuIGxvZyhmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhTdHJpbmcudmFsdWVPZihkKSwgbGV2ZWwpLCBsZXZlbCk7CisJCWVsc2UKKwkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIyI2xvZyhmbG9hdCwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCisJICovCisJcHVibGljIFN0cmluZyBsb2coZmxvYXQgZiwgTGV2ZWwgbGV2ZWwpIHsKKwkJaWYgKGxldmVsID09IERFRkFVTFQpCisJCQlsZXZlbCA9IExldmVsLkZJTkVTVDsKKwkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCisJCQlyZXR1cm4gbG9nKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKFN0cmluZy52YWx1ZU9mKGYpLCBsZXZlbCksIGxldmVsKTsKKwkJZWxzZQorCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKGludCwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCisJICovCisJcHVibGljIFN0cmluZyBsb2coaW50IGksIExldmVsIGxldmVsKSB7CisJCWlmIChsZXZlbCA9PSBERUZBVUxUKQorCQkJbGV2ZWwgPSBMZXZlbC5GSU5FU1Q7CisJCWlmIChpc0xvZ2dpbmcobGV2ZWwpKQorCQkJcmV0dXJuIGxvZyhmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhTdHJpbmcudmFsdWVPZihpKSwgbGV2ZWwpLCBsZXZlbCk7CisJCWVsc2UKKwkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIyI2xvZyhsb25nLCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGxvZyhsb25nIGwsIExldmVsIGxldmVsKSB7CisJCWlmIChsZXZlbCA9PSBERUZBVUxUKQorCQkJbGV2ZWwgPSBMZXZlbC5GSU5FU1Q7CisJCWlmIChpc0xvZ2dpbmcobGV2ZWwpKQorCQkJcmV0dXJuIGxvZyhmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhTdHJpbmcudmFsdWVPZihsKSwgbGV2ZWwpLCBsZXZlbCk7CisJCWVsc2UKKwkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIyI2xvZyhqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGxvZyhPYmplY3QgbywgTGV2ZWwgbGV2ZWwpIHsKKwkJaWYgKGxldmVsID09IERFRkFVTFQpCisJCQlsZXZlbCA9IExldmVsLkZJTkVTVDsKKwkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCisJCQlyZXR1cm4gbG9nKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKFN0cmluZy52YWx1ZU9mKG8pLCBsZXZlbCksIGxldmVsKTsKKwkJZWxzZQorCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKHNob3J0LCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGxvZyhzaG9ydCBzLCBMZXZlbCBsZXZlbCkgeworCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKKwkJCWxldmVsID0gTGV2ZWwuRklORVNUOworCQlpZiAoaXNMb2dnaW5nKGxldmVsKSkKKwkJCXJldHVybiBsb2coZk15TG9nZ2VyLmdldEdlbmVyaWNNc2coU3RyaW5nLnZhbHVlT2YocyksIGxldmVsKSwgbGV2ZWwpOworCQllbHNlCisJCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyMiNsb2coamF2YS5sYW5nLlRocm93YWJsZSwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCisJICovCisJcHVibGljIFN0cmluZyBsb2coVGhyb3dhYmxlIHQsIExldmVsIGxldmVsKSB7CisJCWlmIChsZXZlbCA9PSBERUZBVUxUKQorCQkJbGV2ZWwgPSBMZXZlbC5TRVZFUkU7CisJCWlmIChpc0xvZ2dpbmcobGV2ZWwpKQorCQkJcmV0dXJuIGxvZyhmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhmTXlMb2dnZXIuZXhjZXB0aW9uVG9TdHJpbmcodCksIGxldmVsKSwgbGV2ZWwpOworCQllbHNlCisJCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwtbm9ud29ya2JuZWNoL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eS9Mb2dnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC1ub253b3JrYm5lY2gvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5L0xvZ2dlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NmFkMDUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwtbm9ud29ya2JuZWNoL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eS9Mb2dnZXIuamF2YQpAQCAtMCwwICsxLDg0MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorCisKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHk7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworCisvKioKKyAqIFRoaXMgaXMgYSBiYXNlLCBVSSBpbmRlcGVuZGVudCBsb2dnZXIuICAgSXQgd2lsbAorICogY29uc3RydWN0IGEgY29uc2lzdGVudCBtc2cuIGJvZHksIGFuZCBjYWxsIGFuIGVuZmlyb25tZW50IHNwZWNpZmljIElMb2dSZW5kZXJlci4KKyAqIEJ5IGRlZmF1bHQsIHRoaXMgbG9nZ2VyIHdpbGwgdXNlIGEgY29uc29sZSBiYXNlZCBJTG9nUmVuZGVyZXIsCisgKiBhbmQgYSBKMkVFIFBsdWdpbiBpZGVudGlmaWNhdGlvbi4KKyAqIAorICogPHA+CisgKiBXaGVuIHJ1bm5pbmcgb3V0c2lkZSBvZiBFY2xpcHNlLCB0aGUgdHJhY2UgYW5kIGxvZ2dpbmcgbGV2ZWwgY29tZSBmcm9tIHRoZSBzeXN0ZW0gcHJvcGVydGllcworICogPHVsPgorICogCQk8bGk+ImRlYnVnIiAoPSJ0cnVlIikgLSBUaGUgZGVmYXVsdCBpcyA8Y29kZT5mYWxzZTwvY29kZT4uIAorICogCQk8bGk+ImxvZ0xldmVsIiAoPSJsZXZlbCIgd2hlcmUgImxldmVsIiBpcyBhIGxldmVsIHN0cmluZywgZS5nLiBTRVZFUkUsIFdBUk5JTkcsIGV0Yy4gZnJvbSB0aGUgPGNvZGU+amF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw8L2NvZGU+IGNsYXNzKS4KKyAqIAkJCVRoZSBkZWZhdWx0IGlzICJXQVJOSU5HIi4KKyAqIDwvdWw+CisgKiAKKyAqIAorICogQHNpbmNlIDEuMC4wCisgKi8KK3B1YmxpYyBjbGFzcyBMb2dnZXIgeworCQorCS8vIFRoaXMgaXMgdXNlZCBieSBJTG9nUmVuZGVyZXIyIHRvIGRlZmluZSB0aGUgZGVmYXVsdCBsZXZlbC4KKwlzdGF0aWMgY2xhc3MgTG9jYWxMZXZlbCBleHRlbmRzIExldmVsIHsKKwkJLyoqCisJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+CisJCSAqIAorCQkgKiBAc2luY2UgMS4xLjAKKwkJICovCisJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02MjczMzU3MDc0NzY3ODU0ODgzTDsKKworCQlwdWJsaWMgTG9jYWxMZXZlbChTdHJpbmcgbmFtZSwgaW50IGxldmVsKSB7CisJCQlzdXBlcihuYW1lLCBsZXZlbCk7CisJCX0KKwl9CQorCQorCXByaXZhdGUgYm9vbGVhbiBmVHJhY2VNb2RlID0gZmFsc2U7IC8vIHdpbGwgd2UgYWN0dWFsbHkgcHVuY2ggdHJhY2UgbWVzc2FnZWQgb3Igbm90ICAgICAgICAgICAgICAKKwlwcml2YXRlIFN0cmluZyBmUGx1Z2luSUQ7CisJcHJpdmF0ZSBJTG9nUmVuZGVyZXIgZlJlbmRlcmVyID0gbnVsbDsKKwlwcml2YXRlIElMb2dSZW5kZXJlcjIgcmVuZGVyZXIyID0gbnVsbDsKKwlwdWJsaWMgU3RyaW5nIGZMaW5lU2VwZXJhdG9yOworCXByaXZhdGUgTGV2ZWwgbGV2ZWw7CisJcHJpdmF0ZSBMZXZlbCBkZWZhdWx0TGV2ZWwgPSBMZXZlbC5TRVZFUkU7CS8vIEJ5IGRlZmF1bHQgb25seSBzZXZlcmUgb3IgZ3JlYXRlciBhcmUgbG9nZ2VkLgorCXByaXZhdGUgU3RyaW5nIGxvZ0ZpbGVOYW1lOworCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBEZWZhdWx0TG9nZ2VyUGx1Z2luID0gSUxvZ1JlbmRlcmVyLkRlZmF1bHRQbHVnaW5JRDsKKwlzdGF0aWMgcHJpdmF0ZSBIYXNodGFibGUgTG9nZ2VycyA9IG5ldyBIYXNodGFibGUoKTsgLy8gS2VlcCB0cmFjayBvZiBhbGwgdGhlIExvZ2dlcnMKKwlmaW5hbCBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZ1tdIExvZ01hcmsgPSB7ICIqKiogRVJST1IgKioqICIsIC8vJE5PTi1OTFMtMSQKKwkJIltUcmFjZV0gIiwgLy8kTk9OLU5MUy0xJAorCQkiKysrIFdhcm5pbmcgKysrICIsIC8vJE5PTi1OTFMtMSQKKwkJIkluZm8gIiB9OyAvLyROT04tTkxTLTEkCisKKwlmaW5hbCBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBGaWxsZXIgPSAiICAgICI7IC8vIFVzZSB0aGlzIHRvIGluZGVudCBtc2cuIGJvZHkgLy8kTk9OLU5MUy0xJAorCQorCXByb3RlY3RlZCBMb2dnZXIoKSB7CisJCXRoaXMoSUxvZ1JlbmRlcmVyLkRlZmF1bHRQbHVnaW5JRCk7CisJfQorCQorCXByb3RlY3RlZCBMb2dnZXIoU3RyaW5nIHBsdWdpbklEKSB7CisJCWZQbHVnaW5JRCA9IHBsdWdpbklEOworCQlzZXRSZW5kZXJlcihuZXcgSkRLQ29uc29sZVJlbmRlcmVyKHRoaXMpKTsJLy8gU2V0IHVwIGRlZmF1bHQgdG8gdGhpcy4gU29tZW9uZSBjYW4gY2hhbmdlIGl0IGxhdGVyLgorCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgc3RhY2t0cmFjZSBhcyBhIHByaW50IGZvcm1hdHRlZCBzdHJpbmcuCisJICogQHBhcmFtIGUKKwkgKiBAcmV0dXJuIHRoZSBzdGFja3RyYWNlIGFzIGEgc3RyaW5nLgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBTdHJpbmcgZXhjZXB0aW9uVG9TdHJpbmcoVGhyb3dhYmxlIGUpIHsKKwkJU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKwkJZS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKHN0cmluZ1dyaXRlcikpOworCQlyZXR1cm4gc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCk7CisJfQorCQorCS8qKgorCSAqIEdldCB0aGUgc3lzdGVtIGRlZmF1bHQgbG9nZ2VyLiBUaGlzIGlzIHVzZWQgZm9yIGNsaWVudHMgdGhhdCBkb24ndCBrbm93IGlmIHRoZXkKKwkgKiBhcmUgcnVubmluZyBpbiBFY2xpcHNlIG9yIG91dHNpZGUgb2YgaXQuIFRoaXMgd2F5IHRoZXkgaGF2ZSBhIGNvbW1vbiBsb2dnZXIgZm9ybWF0CisJICogd2hpY2ggc3dpdGNoIGNvcnJlY3RseS4KKwkgKiBAcmV0dXJuIGRlZmF1bHQgbG9nZ2VyLgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXN0YXRpYyBwdWJsaWMgTG9nZ2VyIGdldExvZ2dlcigpIHsKKwkJTG9nZ2VyIGRlZmF1bHRMb2dnZXIgPSAoTG9nZ2VyKSBMb2dnZXJzLmdldChEZWZhdWx0TG9nZ2VyUGx1Z2luKTsKKwkJaWYgKGRlZmF1bHRMb2dnZXIgPT0gbnVsbCkgeworCQkJZGVmYXVsdExvZ2dlciA9IG5ldyBMb2dnZXIoKTsKKwkJCWRlZmF1bHRMb2dnZXIuaW5pdCgpOworCQkJTG9nZ2Vycy5wdXQoRGVmYXVsdExvZ2dlclBsdWdpbiwgZGVmYXVsdExvZ2dlcik7CisJCX0KKwkJcmV0dXJuIGRlZmF1bHRMb2dnZXI7CisJfQorCQorCS8qKgorCSAqIEdldCB0aGUgbG9nZ2VyIGZvciBhIHNwZWNpZmljIHBsdWdpbi4KKwkgKiBAcGFyYW0gcGx1Z2luSWQKKwkgKiBAcmV0dXJuIGxvZ2dlciBmb3IgYSBzcGVjaWZpYyBwbHVnZ2luLgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXN0YXRpYyBwdWJsaWMgTG9nZ2VyIGdldExvZ2dlcihTdHJpbmcgcGx1Z2luSWQpIHsKKwkJaWYgKHBsdWdpbklkID09IG51bGwpCisJCQlyZXR1cm4gTG9nZ2VyLmdldExvZ2dlcigpOworCQlMb2dnZXIgTG9nZ2VyID0gKExvZ2dlcikgTG9nZ2Vycy5nZXQocGx1Z2luSWQpOworCQlpZiAoTG9nZ2VyID09IG51bGwpIHsKKwkJCUxvZ2dlciA9IG5ldyBMb2dnZXIocGx1Z2luSWQpOworCQkJTG9nZ2VyLmluaXQoKTsKKwkJCUxvZ2dlcnMucHV0KHBsdWdpbklkLCBMb2dnZXIpOworCQl9CisJCXJldHVybiBMb2dnZXI7CisJfQorCQorCS8qKgorCSAqIFVzZWQgYnkgc3ViY2xhc3MgdG8gZ2V0IGEgbG9nZ2VyIGlmIGl0IGV4aXN0cywgYnV0IG5vdCBjcmVhdGUgb25lLgorCSAqIEBwYXJhbSBwbHVnaW5JZAorCSAqIEByZXR1cm4gbG9nZ2VyLgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXN0YXRpYyBwcm90ZWN0ZWQgTG9nZ2VyIGdldExvZ2dlcklmRXhpc3RzKFN0cmluZyBwbHVnaW5JZCkgeworCQlpZiAocGx1Z2luSWQgPT0gbnVsbCkKKwkJCXJldHVybiBMb2dnZXIuZ2V0TG9nZ2VyKCk7CisJCWVsc2UKKwkJCXJldHVybiAoTG9nZ2VyKSBMb2dnZXJzLmdldChwbHVnaW5JZCk7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBwbHVnaW4gaWQgZm9yIHRoaXMgbG9nZ2VyLgorCSAqIEByZXR1cm4gcGx1Z2luaWQKKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklEKCkgeworCQlyZXR1cm4gZlBsdWdpbklEOworCX0KKwkKKwkvKioKKwkgKiBHZXQgdGhlIHRyYWNlIG1vZGUgZm9yIHRoaXMgbG9nZ2VyCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0cmFjaW5nIGlzIGdvaW5nIG9uLgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBib29sZWFuIGdldFRyYWNlTW9kZSgpIHsKKwkJcmV0dXJuIGZUcmFjZU1vZGU7CisJfQorCQorCS8qCisJICogSW5kZW50IHRoZSBNc2cuIEJvZHkgdG8gbWFrZSBpdCBlYXNpZXIgdG8gcmVhZCB0aGUgbG9nCisJICovCisJcHJpdmF0ZSB2b2lkIGluZGVudE1zZyhTdHJpbmcgbXNnLCBTdHJpbmdCdWZmZXIgbG9nTXNnKSB7CisJCS8vIExpbmUgc2VwZXJhdG9yIGlzIGRpZmZlcmVudCBvbiBkaWZmZXJlbnQgcGxhdGZvcm0sIHVuaXggPSBcbiwgd2luZG93cyBcclxuIGFuZCBtYWMgXHIKKwkJU3RyaW5nIHNlcCA9IGZMaW5lU2VwZXJhdG9yOworCQlpZiAobXNnLmluZGV4T2YoIlxyXG4iKSAhPSAtMSkgLy8kTk9OLU5MUy0xJAorCQkJc2VwID0gIlxyXG4iOyAvLyROT04tTkxTLTEkCisJCWVsc2UgaWYgKG1zZy5pbmRleE9mKCJcbiIpICE9IC0xKSAvLyROT04tTkxTLTEkCisJCQlzZXAgPSAiXG4iOyAvLyROT04tTkxTLTEkCisJCWVsc2UgaWYgKG1zZy5pbmRleE9mKCJcciIpICE9IC0xKSAvLyROT04tTkxTLTEkCisJCQlzZXAgPSAiXHIiOyAvLyROT04tTkxTLTEkCisJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG1zZywgc2VwKTsKKwkJYm9vbGVhbiBmaXJzdCA9IHRydWU7CisJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7CisJCQlpZiAoZmlyc3QpIHsKKwkJCQlmaXJzdCA9IGZhbHNlOworCQkJCWxvZ01zZy5hcHBlbmQoRmlsbGVyICsgdG9rZW5pemVyLm5leHRUb2tlbigpKTsKKwkJCX0gZWxzZQorCQkJCWxvZ01zZy5hcHBlbmQoZkxpbmVTZXBlcmF0b3IgKyBGaWxsZXIgKyB0b2tlbml6ZXIubmV4dFRva2VuKCkpOworCQl9CisJfQorCS8qCisJICogSWYgRWNsaXBzZSBpcyBzdGFydGVkIHdpdGggdGhlIC1YRGVidWcgb3IgLWRlYnVnIHR1cm4gdHJhY2VzIG9uIGZvciB0aGlzIExvZ2dlcgorCSAqIENyZWF0aW9uIGRhdGU6ICg4LzIzLzIwMDEgNzozNzowNCBQTSkKKwkgKi8KKwlwcml2YXRlIHZvaWQgaW5pdCgpIHsKKwkJaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgiZGVidWciKSAhPSBudWxsKSAvLyROT04tTkxTLTEkCisJCQlmVHJhY2VNb2RlID0gdHJ1ZTsKKwkJbGV2ZWwgPSBkZWZhdWx0TGV2ZWwgPSBMZXZlbC5wYXJzZShTeXN0ZW0uZ2V0UHJvcGVydHkoImxvZ0xldmVsIiwgTGV2ZWwuV0FSTklORy5nZXROYW1lKCkpKTsgLy8kTk9OLU5MUy0xJAorCQkKKwkJdHJ5IHsKKwkJCWZMaW5lU2VwZXJhdG9yID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyBEaWZmIG9uIFdpbi9Vbml4L01hYyAvLyROT04tTkxTLTEkCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlmTGluZVNlcGVyYXRvciA9ICJcbiI7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKwkvKgorCSAqIEdlbmVyaWMgbG9nLgorCSAqIENyZWF0aW9uIGRhdGU6ICg4LzI0LzIwMDEgMTo1NTozNCBQTSkKKwkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKKwkgKiBAcGFyYW0gbXNnIGphdmEubGFuZy5TdHJpbmcKKwkgKiBAcGFyYW0gdHlwZSBpbnQKKwkgKi8KKwlwcml2YXRlIFN0cmluZyBsb2dBbnkoU3RyaW5nIG1zZywgaW50IHR5cGUpIHsKKwkJU3RyaW5nQnVmZmVyIGxvZ01zZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJbG9nTXNnLmFwcGVuZChmTGluZVNlcGVyYXRvcik7CisJCWxvZ01zZy5hcHBlbmQoTG9nTWFya1t0eXBlXSk7CisJCXJldHVybiBwdW5jaExvZyhsb2dSZXN0KG1zZywgbG9nTXNnKSwgdHlwZSk7CisJfQorCQorCS8qKgorCSAqIFRoaXMgaXMgdG8gYmUgdXNlZCBieSByZW5kZXJlcnMgdGhhdCB3YW50IHRvIHB1dCBhIG1zZyBvdXQKKwkgKiBpbiBhIGdlbmVyaWMgZm9ybWF0LiBUaGlzIGp1c3QgcmV0dXJucyB0aGUgc3RyaW5nIHRoYXQKKwkgKiBzaG91bGQgYmUgbG9nZ2VkLiBJdCBwdXRzIHRoaW5ncyBsaWtlIGhlYWRlcnMgb24gaXQuCisJICogCisJICogQHBhcmFtIG1zZworCSAqIEBwYXJhbSBhTGV2ZWwKKwkgKiBAcmV0dXJuIFRoZSBnZW5lcmljIG1lc3NhZ2UgZm9yIHRoZSBzdHJpbmcgYW5kIGxldmVsLgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0R2VuZXJpY01zZyhTdHJpbmcgbXNnLCBMZXZlbCBhTGV2ZWwpIHsKKwkJU3RyaW5nQnVmZmVyIGdlbk1zZyA9IG5ldyBTdHJpbmdCdWZmZXIobXNnLmxlbmd0aCgpKzE2KTsKKwkJZ2VuTXNnLmFwcGVuZChmTGluZVNlcGVyYXRvcik7CisJCWdlbk1zZy5hcHBlbmQoZ2V0TGV2ZWxIZWFkZXIoYUxldmVsKSk7CisJCWdlbk1zZy5hcHBlbmQoIjogIik7IC8vJE5PTi1OTFMtMSQKKwkJZ2VuTXNnLmFwcGVuZChuZXcgRGF0ZSgpKTsKKwkJaW5kZW50TXNnKG1zZywgZ2VuTXNnKTsKKwkJcmV0dXJuIGdlbk1zZy50b1N0cmluZygpOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMZXZlbFtdIExFVkVMX1NFQVJDSCA9IG5ldyBMZXZlbFtdIHsKKwkJTGV2ZWwuU0VWRVJFLAorCQlMZXZlbC5XQVJOSU5HLAorCQlMZXZlbC5JTkZPLAorCQlJTG9nUmVuZGVyZXIyLlRSQUNFCisJfTsKKwkKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBMRVZFTF9NQVJLID0gbmV3IFN0cmluZ1tdIHsKKwkJIioqKiBFUlJPUiAqKioiLCAvLyROT04tTkxTLTEkCisJCSIrKysgV2FybmluZyArKysiLCAvLyROT04tTkxTLTEkCisJCSJJbmZvIiwgLy8kTk9OLU5MUy0xJAorCQkiW1RyYWNlXSIgLy8kTk9OLU5MUy0xJAorCX07CisJCisJcHJpdmF0ZSBTdHJpbmcgZ2V0TGV2ZWxIZWFkZXIoTGV2ZWwgYUxldmVsKSB7CisJCWZvciAoaW50IGk9MDsgaTxMRVZFTF9TRUFSQ0gubGVuZ3RoOyBpKyspCisJCQlpZiAoTEVWRUxfU0VBUkNIW2ldID09IGFMZXZlbCkKKwkJCQlyZXR1cm4gTEVWRUxfTUFSS1tpXTsKKwkJcmV0dXJuIGFMZXZlbC5nZXROYW1lKCk7CS8vIE5vdCBmb3VuZCwganVzdCB1c2UgbGV2ZWwgc3RyaW5nLgorCX0KKwkKKwkvLyBUaGUgd3JpdGUncyBhcmUgaGVyZSBmb3IgaGlzdG9yeS4gV2lsbCBpbXBsZW1lbnQgdXNpbmcgbG9nKG9iaiwgTGV2ZWwpIGZvciBhbGwgb2YgdGhlIHR5cGVzLgorCisKKwkvKioKKwkgKiBkZXByZWNhdGVkIHVzZSBsb2coTGV2ZWwsIEV4Y2VwdGlvbikKKwkgKiBAcGFyYW0gYUxldmVsCisJICogQHBhcmFtIGV4CisJICogQHJldHVybgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqIAorCSAqLworCXB1YmxpYyBTdHJpbmcgd3JpdGUoTGV2ZWwgYUxldmVsLCBFeGNlcHRpb24gZXgpIHsKKwkJcmV0dXJuIGxvZyhhTGV2ZWwsIGV4KTsKKwl9CisJCisJLyoqCisJICogZGVwcmVjYXRlZCB1c2UgbG9nKFRocm93YWJsZSkKKwkgKiBAcGFyYW0gZXgKKwkgKiBAcmV0dXJuCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICogCisJICovCisJcHVibGljIFN0cmluZyB3cml0ZShUaHJvd2FibGUgZXgpIHsKKwkJcmV0dXJuIGxvZyhleCk7CisJfQorCQorCS8qKgorCSAqIGRlcHJlY2F0ZWQgdXNlIGxvZyhPYmplY3QsIExldmVsKQorCSAqIEBwYXJhbSBhTGV2ZWwKKwkgKiBAcGFyYW0gbG9nRW50cnkKKwkgKiBAcmV0dXJuCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIFN0cmluZyB3cml0ZShMZXZlbCBhTGV2ZWwsIE9iamVjdCBsb2dFbnRyeSkgeworCQlyZXR1cm4gbG9nKGxvZ0VudHJ5LCBhTGV2ZWwpOworCX0KKwkKKwkvKioKKwkgKiBkZXByZWNhdGVkIHVzZSBsb2coU3RyaW5nLCBMZXZlbCkKKwkgKiBAcGFyYW0gYUxldmVsCisJICogQHBhcmFtIHN0cmluZworCSAqIEByZXR1cm4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIHdyaXRlKExldmVsIGFMZXZlbCwgU3RyaW5nIHN0cmluZykgeworCQlyZXR1cm4gbG9nKHN0cmluZywgYUxldmVsKTsKKwl9CisJLyoqCisJICogZGVwcmVjYXRlZCB1c2UgbG9nKFRocm93YWJsZSwgTGV2ZWwpCisJICogQHBhcmFtIGFMZXZlbAorCSAqIEBwYXJhbSBleAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIHdyaXRlKExldmVsIGFMZXZlbCwgVGhyb3dhYmxlIGV4KSB7CisJCXJldHVybiBsb2coZXgsIGFMZXZlbCk7CisJfQorCS8qKgorCSAqIGRlcHJlY2F0ZWQgdXNlIGxvZyhUaHJvd2FibGUsIExldmVsKQorCSAqIEBwYXJhbSBhTGV2ZWwKKwkgKiBAcGFyYW0gZXgKKwkgKiBAcmV0dXJuCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIFN0cmluZyBsb2coTGV2ZWwgYUxldmVsLCBFeGNlcHRpb24gZXgpIHsKKwkJcmV0dXJuIGxvZyhleCwgYUxldmVsKTsKKwl9CisJLyoqCisJICogZGVwcmVjYXRlZCB1c2UgbG9nKFRocm93YWJsZSwgTGV2ZWwpCisJICogQHBhcmFtIGFMZXZlbAorCSAqIEBwYXJhbSBleAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGxvZyhMZXZlbCBhTGV2ZWwsIFRocm93YWJsZSBleCkgeworCQlyZXR1cm4gbG9nKGV4LCBhTGV2ZWwpOworCX0KKwkKKwkvKioKKwkgKiBHZXQgdGhlIGxvZ2dpbmcgbGV2ZWwKKwkgKiBAcmV0dXJuIGxvZ2dpbmcgbGV2ZWwKKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgTGV2ZWwgZ2V0TGV2ZWwoKSB7CisJCXJldHVybiBsZXZlbDsKKwl9CisJCisJLyoqCisJICogQ2hlY2sgaWYgdGhlIHJlcXVlc3RlZCBsZXZlbCBpcyBiZWluZyBsb2dnZWQuIChlLmcuIGlmIGN1cnJlbnQgbGV2ZWwgaXMgU0VWRVJFLCB0aGVuIEZJTkUgd2lsbCBub3QgYmUgbG9nZ2VkKS4KKwkgKiBAcGFyYW0gcmVxdWVzdGxldmVsCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbGV2ZWwgd2lsbCBiZSBsb2dnZWQuCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIGJvb2xlYW4gaXNMb2dnaW5nTGV2ZWwoTGV2ZWwgcmVxdWVzdGxldmVsKSB7CisJCWlmIChyZXF1ZXN0bGV2ZWwgPT0gSUxvZ1JlbmRlcmVyMi5UUkFDRSAmJiAhZ2V0VHJhY2VNb2RlKCkpCisJCQlyZXR1cm4gZmFsc2U7CS8vIFdlIGFyZW4ndCB0cmFjaW5nIGJ1dCByZXF1ZXN0ZWQgdHJhY2UuCisJCQorCQlyZXR1cm4gIShyZXF1ZXN0bGV2ZWwuaW50VmFsdWUoKSA8IGdldExldmVsKCkuaW50VmFsdWUoKSB8fCBnZXRMZXZlbCgpID09IExldmVsLk9GRik7CisJfQorCisJLyoqCisJICogTG9nIGFuIGVycm9yIHN0cmluZy4KKwkgKiBAcGFyYW0gbXNnCisJICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBTdHJpbmcgbG9nRXJyb3IoU3RyaW5nIG1zZykgeworCQlyZXR1cm4gbG9nKG1zZywgTGV2ZWwuU0VWRVJFKTsKKwl9CisKKwkvKioKKwkgKiBMb2cgYW4gZXJyb3IgdGhyb3dhYmxlCisJICogQHBhcmFtIGUKKwkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+CisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIFN0cmluZyBsb2dFcnJvcihUaHJvd2FibGUgZSkgeworCQlyZXR1cm4gbG9nKGUsIExldmVsLlNFVkVSRSk7CisJfQorCisJLyoqCisJICogTG9nIGFuIGluZm8gbWVzc2FnZS4KKwkgKiBAcGFyYW0gbXNnCisJICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBTdHJpbmcgbG9nSW5mbyhTdHJpbmcgbXNnKSB7CisJCXJldHVybiBsb2cobXNnLCBMZXZlbC5JTkZPKTsKKwl9CisJCisvKioKKyAqIExvZyBhIHRocm93YWJsZSBhcyBhIHdhcm5pbmcuCisgKiBAcGFyYW0gZQorICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgorICogCisgKiBAc2luY2UgMS4wLjAKKyAqLworCXB1YmxpYyBTdHJpbmcgbG9nSW5mbyhUaHJvd2FibGUgZSkgeworCQlyZXR1cm4gbG9nKGUsIExldmVsLklORk8pOworCX0KKworCS8qKgorCSAqIEFwcGVuZCB0aGUgc3RyaW5nIHRvIGxvZ01zZyBidWZmZXIgcGFzc2VkIGluLiBBcHBlbmQgdGhlIGRhdGUgYW5kIGZvcm1hdCB0aGUKKwkgKiBzdHJpbmcgd2l0aCBuaWNlIGluZGVudGF0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBtc2cKKwkgKiBAcGFyYW0gbG9nTXNnCisJICogQHJldHVybiB0aGUgc3RyaW5nIGZyb20gdGhlIGxvZ01zZyBhZnRlciBsb2dnaW5nIHRoZSByZXN0LgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgbG9nUmVzdChTdHJpbmcgbXNnLCBTdHJpbmdCdWZmZXIgbG9nTXNnKSB7CisJCWxvZ01zZy5hcHBlbmQobmV3IERhdGUoKSk7CisJCWluZGVudE1zZyhtc2csIGxvZ01zZyk7CisJCXJldHVybiBsb2dNc2cudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiBMb2cgdGhlIG1zZyBhcyB0cmFjZSBvbmx5LgorCSAqIEBwYXJhbSBtc2cKKwkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+CisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIFN0cmluZyBsb2dUcmFjZShTdHJpbmcgbXNnKSB7CisJCWlmIChmVHJhY2VNb2RlKQorCQkJcmV0dXJuIGxvZyhtc2csIElMb2dSZW5kZXJlcjIuVFJBQ0UpOworCQllbHNlCisJCQlyZXR1cm4gSUxvZ1JlbmRlcmVyLk5PTE9HX0RFU0NSSVBUSU9OOworCX0KKworCS8qKgorCSAqIExvZyB0aGUgdGhyb3dhYmxlIGFzIHRyYWNlIG9ubHkuCisJICogQHBhcmFtIGUKKwkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+CisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIFN0cmluZyBsb2dUcmFjZShUaHJvd2FibGUgZSkgeworCQlyZXR1cm4gbG9nKGUsIElMb2dSZW5kZXJlcjIuVFJBQ0UpOworCX0KKworCS8qKgorCSAqIExvZyB0aGUgbWVzc2FnZSBhcyB3YXJuaW5nLgorCSAqIEBwYXJhbSBtc2cKKwkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+CisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIFN0cmluZyBsb2dXYXJuaW5nKFN0cmluZyBtc2cpIHsKKwkJcmV0dXJuIGxvZyhtc2csIExldmVsLldBUk5JTkcpOworCX0KKwkvKioKKwkgKiBMb2cgdGhlIHRocm93YWJsZSBhcyBhIHdhcm5pbmcuCisJICogQHBhcmFtIGUKKwkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+CisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIFN0cmluZyBsb2dXYXJuaW5nKFRocm93YWJsZSBlKSB7CisJCXJldHVybiBsb2coZSwgTGV2ZWwuV0FSTklORyk7CisJfQorCQorCS8qKgorCSAqIEFzayB0aGUgUmVuZGVyZXIgdG8gcHVuY2ggdGhlIG1zZy4gaW4gdGhlIGxvZy4uIG9uZQorCSAqIGNhbGxlciBhdCB0aGUgdGltZQorCSAqIENyZWF0aW9uIGRhdGU6ICg4LzI0LzIwMDEgOToxOToxNyBBTSkKKwkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKKwkgKiBAcGFyYW0gbXNnIGphdmEubGFuZy5TdHJpbmcKKwkgKiBAcGFyYW0gdHlwZSBpbnQKKwkgKi8KKwlwcm90ZWN0ZWQgc3luY2hyb25pemVkIFN0cmluZyBwdW5jaExvZyhTdHJpbmcgbXNnLCBpbnQgdHlwZSkgeworCQlyZXR1cm4gZlJlbmRlcmVyLmxvZyhtc2csIHR5cGUpOworCX0KKwkKKwkvKioKKwkgKiBTZXQgdGhlIHJlbmRlcmVyIHRvIHVzZS4KKwkgKiBAcGFyYW0gcmVuZGVyZXIKKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZW5kZXJlcihJTG9nUmVuZGVyZXIgcmVuZGVyZXIpIHsKKwkJZlJlbmRlcmVyID0gcmVuZGVyZXI7CisJCXJlbmRlcmVyMiA9IChyZW5kZXJlciBpbnN0YW5jZW9mIElMb2dSZW5kZXJlcjIpID8gKElMb2dSZW5kZXJlcjIpIHJlbmRlcmVyIDogbnVsbDsKKwkJcmVuZGVyZXIuc2V0VHJhY2VNb2RlKGdldFRyYWNlTW9kZSgpKTsKKwl9CisJCisJLyoqCisJICogU2V0IHRoZSB0cmFjZSBtb2RlLgorCSAqIEBwYXJhbSBmbGFnIDxjb2RlPnRydWU8L2NvZGU+IHRvIHR1cm4gb24gdHJhY2luZy4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUcmFjZU1vZGUoYm9vbGVhbiBmbGFnKSB7CisJCWZUcmFjZU1vZGUgPSBmbGFnOworCQlpZiAoZlJlbmRlcmVyICE9IG51bGwpCisJCQlmUmVuZGVyZXIuc2V0VHJhY2VNb2RlKGZsYWcpOworCX0KKwkKKwkvKioKKwkgKiBTZXQgdGhlIGxldmVsIGN1dG9mZiBmb3IgbG9nZ2luZy4gQW55dGhpbmcgYmVsb3cgdGhpcyBsZXZlbCB3aWxsIG5vdCBsb2cuCisJICogRG8gbm90IHNldCBsZXZlbCB0byA8Y29kZT5JTG9nUmVuZGVyZXIyLlRSQUNFPC9jb2RlPi4gSXQgZG9lc24ndCBtYWtlIHNlbnNlLgorCSAqIAorCSAqIEBwYXJhbSBsZXZlbCAoVXNlIDxjb2RlPklMb2dSZW5kZXJlcjIuREVGQVVMVDwvY29kZT4gdG8gcmVzdG9yZSB0byBkZWZhdWx0IGZvciB0aGlzIGxvZ2dlci4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRMZXZlbChMZXZlbCBsZXZlbCkgeworCQl0aGlzLmxldmVsID0gbGV2ZWwgIT0gSUxvZ1JlbmRlcmVyMi5ERUZBVUxUID8gbGV2ZWwgOiBkZWZhdWx0TGV2ZWw7CisJfQorCQorCS8qKgorCSAqIFNldCB0aGUgZGVmYXVsdCBsZXZlbCBmb3IgdGhpcyBsb2dnZXIuIEl0IHdvbid0IHRvdWNoIHRoZSBjdXJyZW50IGxldmVsLgorCSAqIAorCSAqIEBwYXJhbSBsZXZlbAorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyB2b2lkIHNldERlZmF1bHRMZXZlbChMZXZlbCBsZXZlbCkgeworCQl0aGlzLmRlZmF1bHRMZXZlbCA9IGxldmVsOworCX0KKwkKKwkvKioKKwkgKiBHZXQgdGhlIGxvZyBmaWxlIG5hbWUuCisJICogQHJldHVybiBSZXR1cm5zIHRoZSBsb2dGaWxlTmFtZS4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExvZ0ZpbGVOYW1lKCkgeworCQlyZXR1cm4gbG9nRmlsZU5hbWU7CisJfQorCisJLyoqCisJICogU2V0IHRoZSBsb2cgZmlsZSBuYW1lLgorCSAqIEBwYXJhbSBsb2dGaWxlTmFtZSBUaGUgbG9nRmlsZU5hbWUgdG8gc2V0LgorCSAqLworCXB1YmxpYyB2b2lkIHNldExvZ0ZpbGVOYW1lKFN0cmluZyBsb2dGaWxlTmFtZSkgeworCQl0aGlzLmxvZ0ZpbGVOYW1lID0gbG9nRmlsZU5hbWU7CisJfQorCQorCS8vIE5vdyBhbGwgb2YgdGhlIGxvZygpIHR5cGVzIHRoYXQgdXNlIGEgTGV2ZWwuCisKKwkvKioKKwkgKiBMb2cgdGhlIHRocm93YWJsZSBhdCB0aGUgZGVmYXVsdCBsZXZlbCBmb3IgYSB0aHJvd2FibGUuIAorCSAqIEBwYXJhbSBlCisJICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBTdHJpbmcgbG9nKFRocm93YWJsZSBlKSB7CisJCXJldHVybiBsb2coZSwgSUxvZ1JlbmRlcmVyMi5ERUZBVUxUKTsKKwl9CisJCisJLyoqCisJICogTG9nIHRoZSB0aHJvd2FibGUgYXQgdGhlIGdpdmVuIGxldmVsLgorCSAqIEBwYXJhbSBlCisJICogQHBhcmFtIGxvZ0xldmVsCisJICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBTdHJpbmcgbG9nKFRocm93YWJsZSBlLCBMZXZlbCBsb2dMZXZlbCkgeworCQlpZiAocmVuZGVyZXIyICE9IG51bGwpIHsKKwkJCXJldHVybiByZW5kZXJlcjIubG9nKGUsIGxvZ0xldmVsKTsKKwkJfSBlbHNlIHsKKwkJCS8vIERvIGl0IHRoZSBvbGQgd2F5LgorCQkJU3RyaW5nIHN0YWNrVHJhY2UgPSBleGNlcHRpb25Ub1N0cmluZyhlKTsKKwkJCXJldHVybiBsb2dBbnkoc3RhY2tUcmFjZSwgZ2V0T2xkVHlwZShsb2dMZXZlbCAhPSBJTG9nUmVuZGVyZXIyLkRFRkFVTFQgPyBsZXZlbCA6IExldmVsLlNFVkVSRSkpOworCQl9CisJfQorCQorCXB1YmxpYyBTdHJpbmcgbG9nKE9iamVjdCBvKSB7CisJCXJldHVybiBsb2cobywgSUxvZ1JlbmRlcmVyMi5ERUZBVUxUKTsKKwl9CisJCisJLyoqCisJICogTG9nIHRoZSBvYmplY3QgYXQgdGhlIGdpdmVuIGxldmVsLgorCSAqIEBwYXJhbSBvCisJICogQHBhcmFtIGxvZ0xldmVsCisJICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBTdHJpbmcgbG9nKE9iamVjdCBvLCBMZXZlbCBsb2dMZXZlbCkgeworCQlpZiAocmVuZGVyZXIyICE9IG51bGwpIHsKKwkJCXJldHVybiByZW5kZXJlcjIubG9nKG8sIGxvZ0xldmVsKTsKKwkJfSBlbHNlIHsKKwkJCS8vIERvIGl0IHRoZSBvbGQgd2F5LgorCQkJcmV0dXJuIGxvZ0FueShTdHJpbmcudmFsdWVPZihvKSwgZ2V0T2xkVHlwZShsb2dMZXZlbCAhPSBJTG9nUmVuZGVyZXIyLkRFRkFVTFQgPyBsZXZlbCA6IExldmVsLkZJTkVTVCkpOworCQl9CisJfQkKKwkKKwkvLyBUaGUgZm9sbG93aW5nIGFyZSBhZGRlZCB0byBtYXRjaCB1cCB3aXRoIEh5YWRlcyBzbyB0aGF0IHByaW1pdGl2ZXMgY2FuIGJlIGxvZ2dlZCB0b28uCisJCisJLyoqCisJICogTG9nIGEgYm9vbGVhbiBhdCB0aGUgZGVmYXVsdCBsZXZlbC4gCisJICogQHBhcmFtIGIKKwkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+CisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIFN0cmluZyBsb2coYm9vbGVhbiBiKSB7CisJCXJldHVybiBsb2coYiwgSUxvZ1JlbmRlcmVyMi5ERUZBVUxUKTsKKwl9CisJCisJLyoqCisJICogTG9nIGEgYm9vbGVhbiBhdCB0aGUgZ2l2ZW4gbGV2ZWwuCisJICogQHBhcmFtIGIKKwkgKiBAcGFyYW0gbG9nTGV2ZWwKKwkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+CisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIFN0cmluZyBsb2coYm9vbGVhbiBiLCBMZXZlbCBsb2dMZXZlbCkgeworCQlpZiAocmVuZGVyZXIyICE9IG51bGwpIHsKKwkJCXJldHVybiByZW5kZXJlcjIubG9nKGIsIGxvZ0xldmVsKTsKKwkJfSBlbHNlIHsKKwkJCS8vIERvIGl0IHRoZSBvbGQgd2F5LgorCQkJcmV0dXJuIGxvZ0FueShTdHJpbmcudmFsdWVPZihiKSwgZ2V0T2xkVHlwZShsb2dMZXZlbCAhPSBJTG9nUmVuZGVyZXIyLkRFRkFVTFQgPyBsZXZlbCA6IExldmVsLkZJTkVTVCkpOworCQl9CisJfQkKKwkKKwkvKioKKwkgKiBMb2cgdGhlIGNoYXJhY3RlciBhdCB0aGUgZGVmYXVsdCBsZXZlbC4KKwkgKiBAcGFyYW0gYworCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGxvZyhjaGFyIGMpIHsKKwkJcmV0dXJuIGxvZyhjLCBJTG9nUmVuZGVyZXIyLkRFRkFVTFQpOworCX0KKwkKKwkvKioKKwkgKiBMb2cgdGhlIGNoYXJhY3RlciBhdCB0aGUgZ2l2ZW4gbGV2ZWwuCisJICogQHBhcmFtIGMKKwkgKiBAcGFyYW0gbG9nTGV2ZWwKKwkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+CisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIFN0cmluZyBsb2coY2hhciBjLCBMZXZlbCBsb2dMZXZlbCkgeworCQlpZiAocmVuZGVyZXIyICE9IG51bGwpIHsKKwkJCXJldHVybiByZW5kZXJlcjIubG9nKGMsIGxvZ0xldmVsKTsKKwkJfSBlbHNlIHsKKwkJCS8vIERvIGl0IHRoZSBvbGQgd2F5LgorCQkJcmV0dXJuIGxvZ0FueShTdHJpbmcudmFsdWVPZihjKSwgZ2V0T2xkVHlwZShsb2dMZXZlbCAhPSBJTG9nUmVuZGVyZXIyLkRFRkFVTFQgPyBsZXZlbCA6IExldmVsLkZJTkVTVCkpOworCQl9CisJfQorCQorCS8qKgorCSAqIExvZyB0aGUgYnl0ZSBhdCB0aGUgZGVmYXVsdCBsZXZlbC4KKwkgKiBAcGFyYW0gYgorCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGxvZyhieXRlIGIpIHsKKwkJcmV0dXJuIGxvZyhiLCBJTG9nUmVuZGVyZXIyLkRFRkFVTFQpOworCX0KKwkKKwkvKioKKwkgKiBMb2cgdGhlIGJ5dGUgYXQgdGhlIGdpdmVuIGxldmVsLgorCSAqIEBwYXJhbSBiCisJICogQHBhcmFtIGxvZ0xldmVsCisJICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBTdHJpbmcgbG9nKGJ5dGUgYiwgTGV2ZWwgbG9nTGV2ZWwpIHsKKwkJaWYgKHJlbmRlcmVyMiAhPSBudWxsKSB7CisJCQlyZXR1cm4gcmVuZGVyZXIyLmxvZyhiLCBsb2dMZXZlbCk7CisJCX0gZWxzZSB7CisJCQkvLyBEbyBpdCB0aGUgb2xkIHdheS4KKwkJCXJldHVybiBsb2dBbnkoU3RyaW5nLnZhbHVlT2YoYiksIGdldE9sZFR5cGUobG9nTGV2ZWwgIT0gSUxvZ1JlbmRlcmVyMi5ERUZBVUxUID8gbGV2ZWwgOiBMZXZlbC5GSU5FU1QpKTsKKwkJfQorCX0JCisJCisJLyoqCisJICogTG9nIHRoZSBzaG9ydCBhdCB0aGUgZGVmYXVsdCBsZXZlbC4KKwkgKiBAcGFyYW0gcworCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGxvZyhzaG9ydCBzKSB7CisJCXJldHVybiBsb2cocywgSUxvZ1JlbmRlcmVyMi5ERUZBVUxUKTsKKwl9CisJCisJLyoqCisJICogTG9nIHRoZSBzaG9ydCBhdCB0aGUgZ2l2ZW4gbGV2ZWwuCisJICogQHBhcmFtIHMKKwkgKiBAcGFyYW0gbG9nTGV2ZWwKKwkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+CisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIFN0cmluZyBsb2coc2hvcnQgcywgTGV2ZWwgbG9nTGV2ZWwpIHsKKwkJaWYgKHJlbmRlcmVyMiAhPSBudWxsKSB7CisJCQlyZXR1cm4gcmVuZGVyZXIyLmxvZyhzLCBsb2dMZXZlbCk7CisJCX0gZWxzZSB7CisJCQkvLyBEbyBpdCB0aGUgb2xkIHdheS4KKwkJCXJldHVybiBsb2dBbnkoU3RyaW5nLnZhbHVlT2YocyksIGdldE9sZFR5cGUobG9nTGV2ZWwgIT0gSUxvZ1JlbmRlcmVyMi5ERUZBVUxUID8gbGV2ZWwgOiBMZXZlbC5GSU5FU1QpKTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBMb2cgdGhlIGludCBhdCB0aGUgZGVmYXVsdCBsZXZlbC4KKwkgKiBAcGFyYW0gaQorCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGxvZyhpbnQgaSkgeworCQlyZXR1cm4gbG9nKGksIElMb2dSZW5kZXJlcjIuREVGQVVMVCk7CisJfQorCQorCS8qKgorCSAqIExvZyB0aGUgaW50IGF0IHRoZSBkZWZhdWx0IGxldmVsLgorCSAqIEBwYXJhbSBpCisJICogQHBhcmFtIGxvZ0xldmVsCisJICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBTdHJpbmcgbG9nKGludCBpLCBMZXZlbCBsb2dMZXZlbCkgeworCQlpZiAocmVuZGVyZXIyICE9IG51bGwpIHsKKwkJCXJldHVybiByZW5kZXJlcjIubG9nKGksIGxvZ0xldmVsKTsKKwkJfSBlbHNlIHsKKwkJCS8vIERvIGl0IHRoZSBvbGQgd2F5LgorCQkJcmV0dXJuIGxvZ0FueShTdHJpbmcudmFsdWVPZihpKSwgZ2V0T2xkVHlwZShsb2dMZXZlbCAhPSBJTG9nUmVuZGVyZXIyLkRFRkFVTFQgPyBsZXZlbCA6IExldmVsLkZJTkVTVCkpOworCQl9CisJfQorCQorCS8qKgorCSAqIExvZyB0aGUgbG9uZyBhdCB0aGUgZGVmYXVsdCBsZXZlbC4KKwkgKiBAcGFyYW0gbAorCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGxvZyhsb25nIGwpIHsKKwkJcmV0dXJuIGxvZyhsLCBJTG9nUmVuZGVyZXIyLkRFRkFVTFQpOworCX0KKwkKKwkvKioKKwkgKiBMb2cgdGhlIGxvbmcgYXQgdGhlIGdpdmVuIGxldmVsLgorCSAqIEBwYXJhbSBsCisJICogQHBhcmFtIGxvZ0xldmVsCisJICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBTdHJpbmcgbG9nKGxvbmcgbCwgTGV2ZWwgbG9nTGV2ZWwpIHsKKwkJaWYgKHJlbmRlcmVyMiAhPSBudWxsKSB7CisJCQlyZXR1cm4gcmVuZGVyZXIyLmxvZyhsLCBsb2dMZXZlbCk7CisJCX0gZWxzZSB7CisJCQkvLyBEbyBpdCB0aGUgb2xkIHdheS4KKwkJCXJldHVybiBsb2dBbnkoU3RyaW5nLnZhbHVlT2YobCksIGdldE9sZFR5cGUobG9nTGV2ZWwgIT0gSUxvZ1JlbmRlcmVyMi5ERUZBVUxUID8gbGV2ZWwgOiBMZXZlbC5GSU5FU1QpKTsKKwkJfQorCX0JCisJCisJLyoqCisJICogTG9nIHRoZSBmbG9hdCBhdCB0aGUgZGVmYXVsdCBsZXZlbC4KKwkgKiBAcGFyYW0gZgorCSAqIEByZXR1cm4gaG93IGl0IHdhcyBsb2dnZWQuIFNlZSA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OLjwvY29kZT4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGxvZyhmbG9hdCBmKSB7CisJCXJldHVybiBsb2coZiwgSUxvZ1JlbmRlcmVyMi5ERUZBVUxUKTsKKwl9CisJCisJLyoqCisJICogTG9nIHRoZSBmbG9hdCBhdCB0aGUgZ2l2ZW4gbGV2ZWwuCisJICogQHBhcmFtIGYKKwkgKiBAcGFyYW0gbG9nTGV2ZWwKKwkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+CisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIFN0cmluZyBsb2coZmxvYXQgZiwgTGV2ZWwgbG9nTGV2ZWwpIHsKKwkJaWYgKHJlbmRlcmVyMiAhPSBudWxsKSB7CisJCQlyZXR1cm4gcmVuZGVyZXIyLmxvZyhmLCBsb2dMZXZlbCk7CisJCX0gZWxzZSB7CisJCQkvLyBEbyBpdCB0aGUgb2xkIHdheS4KKwkJCXJldHVybiBsb2dBbnkoU3RyaW5nLnZhbHVlT2YoZiksIGdldE9sZFR5cGUobG9nTGV2ZWwgIT0gSUxvZ1JlbmRlcmVyMi5ERUZBVUxUID8gbGV2ZWwgOiBMZXZlbC5GSU5FU1QpKTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBMb2cgdGhlIGRvdWJsZSBhdCB0aGUgZGVmYXVsdCBsZXZlbAorCSAqIEBwYXJhbSBkCisJICogQHJldHVybiBob3cgaXQgd2FzIGxvZ2dlZC4gU2VlIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT04uPC9jb2RlPgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBTdHJpbmcgbG9nKGRvdWJsZSBkKSB7CisJCXJldHVybiBsb2coZCwgSUxvZ1JlbmRlcmVyMi5ERUZBVUxUKTsKKwl9CisJCisJLyoqCisJICogTG9nIHRoZSBkb3VibGUgYXQgdGhlIGdpdmVuIGxldmVsCisJICogCisJICogQHBhcmFtIGQKKwkgKiBAcGFyYW0gbG9nTGV2ZWwKKwkgKiBAcmV0dXJuIGhvdyBpdCB3YXMgbG9nZ2VkLiBTZWUgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTi48L2NvZGU+CisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIFN0cmluZyBsb2coZG91YmxlIGQsIExldmVsIGxvZ0xldmVsKSB7CisJCWlmIChyZW5kZXJlcjIgIT0gbnVsbCkgeworCQkJcmV0dXJuIHJlbmRlcmVyMi5sb2coZCwgbG9nTGV2ZWwpOworCQl9IGVsc2UgeworCQkJLy8gRG8gaXQgdGhlIG9sZCB3YXkuCisJCQlyZXR1cm4gbG9nQW55KFN0cmluZy52YWx1ZU9mKGQpLCBnZXRPbGRUeXBlKGxvZ0xldmVsICE9IElMb2dSZW5kZXJlcjIuREVGQVVMVCA/IGxldmVsIDogTGV2ZWwuRklORVNUKSk7CisJCX0KKwl9CQorCQorCS8qCisJICogVHVybiBuZXcgdHlwZSBpbnRvIG9sZCB0eXBlLiBUaGUgZGVmYXVsdExldmVsIGlzIHRoZQorCSAqIGxldmVsIHRvIHVzZSBpZiB0aGUgaW5jb21pbmcgbGV2ZWwgaXMgbWFya2VkIGFzIGRlZmF1bHQuCisJICovCisJcHJpdmF0ZSBpbnQgZ2V0T2xkVHlwZShMZXZlbCBhTGV2ZWwpIHsKKwkJaWYgKGFMZXZlbCA9PSBMZXZlbC5TRVZFUkUpCisJCQlyZXR1cm4gSUxvZ1JlbmRlcmVyLkxPR19FUlJPUjsKKwkJZWxzZSBpZiAoYUxldmVsID09IExldmVsLldBUk5JTkcpCisJCQlyZXR1cm4gSUxvZ1JlbmRlcmVyLkxPR19XQVJOSU5HOworCQllbHNlIGlmIChhTGV2ZWwgPT0gTGV2ZWwuSU5GTykKKwkJCXJldHVybiBJTG9nUmVuZGVyZXIuTE9HX0lORk87CisJCWVsc2UgaWYgKGFMZXZlbCA9PSBJTG9nUmVuZGVyZXIyLlRSQUNFKQorCQkJcmV0dXJuIElMb2dSZW5kZXJlci5MT0dfVFJBQ0U7CisJCWVsc2UKKwkJCXJldHVybiBJTG9nUmVuZGVyZXIuTE9HX0lORk87CQkKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9FTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OThhNDM1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDE3MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiAgJCRSQ1NmaWxlOiBFTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeS5qYXZhLHYgJCQKKyAqICAkJFJldmlzaW9uOiAxLjQgJCQgICQkRGF0ZTogMjAwNS8wNi8xNiAyMDoxNDoyNyAkJCAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoOworCitpbXBvcnQgamF2YS51dGlsLio7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdE5hdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLm5scy5FTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuUmVnaXN0cnlSZWFkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2gubmF0dXJlLkVNRk5hdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbi5KRU1VdGlsUGx1Z2luOworCisKKworcHVibGljIGNsYXNzIEVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5ICB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBFTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeSBJTlNUQU5DRTsKKwkKKwlzdGF0aWMgeworCQlJTlNUQU5DRSA9IGNyZWF0ZUZhY3RvcnlJbnN0YW5jZSgpOworCX0KKwlwcml2YXRlIGZpbmFsIENsYXNzIENPTlRSSUJVVE9SX0NMQVNTID0gSUVNRkNvbnRleHRDb250cmlidXRvci5jbGFzczsKKwlwcm90ZWN0ZWQgTWFwIGVtZkNvbnRleHRDYWNoZSA9IG5ldyBXZWFrSGFzaE1hcCgpOworCisJCisJcHJpdmF0ZSBzdGF0aWMgRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnkgY3JlYXRlRmFjdG9yeUluc3RhbmNlKCkgeworCQlFTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeSBmYWN0b3J5ID0gY3JlYXRlRmFjdG9yeUluc3RhbmNlRnJvbUV4dGVuc2lvbigpOworCQlpZiAoZmFjdG9yeSA9PSBudWxsKQorCQkJZmFjdG9yeSA9IG5ldyBFTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeSgpOworCQlyZXR1cm4gZmFjdG9yeTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnkgY3JlYXRlRmFjdG9yeUluc3RhbmNlRnJvbUV4dGVuc2lvbigpIHsKKwkJZmluYWwgRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnlbXSBmYWN0b3J5SG9sZGVyID0gbmV3IEVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5WzFdOworCQlSZWdpc3RyeVJlYWRlciByZWFkZXIgPSBuZXcgUmVnaXN0cnlSZWFkZXIoSkVNVXRpbFBsdWdpbi5JRCwgImludGVybmFsV29ya2JlbmNoQ29udGV4dEZhY3RvcnkiKSB7IC8vJE5PTi1OTFMtMSQKKwkJCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7CisJCQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscygiZmFjdG9yeUNsYXNzIikpIC8vJE5PTi1OTFMtMSQKKwkJCQkJdHJ5IHsKKwkJCQkJCWZhY3RvcnlIb2xkZXJbMF0gPSAoRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnkpZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCXJldHVybiB0cnVlOworCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCQkJfQkJCQkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX07CisJCXJlYWRlci5yZWFkUmVnaXN0cnkoKTsKKwkJcmV0dXJuIGZhY3RvcnlIb2xkZXJbMF07CisJfQorCisJLyoqCisJICogQ29uc3RydWN0b3IgZm9yIEVNRk5hdHVyZUZhY3RvcnkuCisJICovCisJcHJvdGVjdGVkIEVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5KCkgeworCQlzdXBlcigpOworCisJfQorCisKKwlwcm90ZWN0ZWQgdm9pZCBjYWNoZUVNRkNvbnRleHQoSVByb2plY3QgYVByb2plY3QsIEVNRldvcmtiZW5jaENvbnRleHRCYXNlIGVtZkNvbnRleHQpIHsKKwkJaWYgKGFQcm9qZWN0ICE9IG51bGwgJiYgZW1mQ29udGV4dCAhPSBudWxsKQorCQkJZW1mQ29udGV4dENhY2hlLnB1dChhUHJvamVjdCwgZW1mQ29udGV4dCk7CisJfQorCisJcHJvdGVjdGVkIEVNRldvcmtiZW5jaENvbnRleHRCYXNlIGdldENhY2hlZEVNRkNvbnRleHQoSVByb2plY3QgYVByb2plY3QpIHsKKwkJaWYgKGFQcm9qZWN0ICE9IG51bGwpCisJCQlyZXR1cm4gKEVNRldvcmtiZW5jaENvbnRleHRCYXNlKSBlbWZDb250ZXh0Q2FjaGUuZ2V0KGFQcm9qZWN0KTsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogPGNvZGU+YVByb2plY3Q8L2NvZGU+IGlzIGVpdGhlciBiZWluZyBjbG9zZWQgb3IgZGVsZXRlZCBzbyB3ZSBuZWVkIHRvIGNsZWFudXAgb3VyIGNhY2hlLgorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZUNhY2hlZFByb2plY3QoSVByb2plY3QgYVByb2plY3QpIHsKKwkJaWYgKGFQcm9qZWN0ICE9IG51bGwpIAorCQkJZW1mQ29udGV4dENhY2hlLnJlbW92ZShhUHJvamVjdCk7IAorCQkKKwl9CisJLyoqCisJICogUmV0dXJuIGEgbmV3IG9yIGV4aXN0aW5nIEVNRk5hdHVyZSBvbiA8Y29kZT5hUHJvamVjdDwvY29kZT4uIEFsbG93IHRoZSA8Y29kZT5jb250cmlidXRvcjwvY29kZT4KKwkgKiB0byBjb250cmlidXRlIHRvIHRoZSBuZXcgb3IgZXhpc3RpbmcgbmF0dXJlIHByaW9yIHRvIHJldHVybmluZy4KKwkgKi8KKwlwdWJsaWMgRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgY3JlYXRlRU1GQ29udGV4dChJUHJvamVjdCBhUHJvamVjdCwgSUVNRkNvbnRleHRDb250cmlidXRvciBjb250cmlidXRvcikgeworCQlpZiAoYVByb2plY3QgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIltFTUZXb3JrYmVuY2hDb250ZXh0QmFzZV0iICsgRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnlfVUlfMCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWlmICghYVByb2plY3QuaXNBY2Nlc3NpYmxlKCkpCisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJbRU1GV29ya2JlbmNoQ29udGV4dEJhc2VdIiArIEVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5X1VJXzEiLCBuZXcgT2JqZWN0W117YVByb2plY3QuZ2V0TmFtZSgpfSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgY29udGV4dCA9IGdldENhY2hlZEVNRkNvbnRleHQoYVByb2plY3QpOworCQlib29sZWFuIGNvbnRyaWJ1dG9yRm91bmQgPSBmYWxzZTsKKwkJaWYgKGNvbnRleHQgPT0gbnVsbCkgeworCQkJY29udGV4dCA9IHByaW1DcmVhdGVFTUZDb250ZXh0KGFQcm9qZWN0KTsKKwkJCWNhY2hlRU1GQ29udGV4dChhUHJvamVjdCwgY29udGV4dCk7CisJCQljb250cmlidXRvckZvdW5kID0gaW5pdGlhbGl6ZUVNRkNvbnRleHRGcm9tQ29udHJpYnV0b3JzKGFQcm9qZWN0LCBjb250ZXh0LCBjb250cmlidXRvcik7CisJCX0KKwkJaWYgKGNvbnRyaWJ1dG9yICE9IG51bGwgJiYgY29udGV4dCAhPSBudWxsICYmICFjb250cmlidXRvckZvdW5kKQorCQkJY29udHJpYnV0b3IucHJpbWFyeUNvbnRyaWJ1dGVUb0NvbnRleHQoY29udGV4dCk7CisJCXJldHVybiBjb250ZXh0OworCX0KKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpbml0aWFsaXplRU1GQ29udGV4dEZyb21Db250cmlidXRvcnMoSVByb2plY3QgYVByb2plY3QsIEVNRldvcmtiZW5jaENvbnRleHRCYXNlIGVtZkNvbnRleHQsIElFTUZDb250ZXh0Q29udHJpYnV0b3IgY29udHJpYnV0b3IpIHsKKwkJYm9vbGVhbiBjb250cmlidXRvckZvdW5kID0gZmFsc2U7CisJCWlmIChhUHJvamVjdCA9PSBudWxsIHx8IGVtZkNvbnRleHQgPT0gbnVsbCkKKwkJCXJldHVybiBjb250cmlidXRvckZvdW5kOworCQlMaXN0IHJ1bnRpbWVzID0gRU1GTmF0dXJlLmdldFJlZ2lzdGVyZWRSdW50aW1lcyhhUHJvamVjdCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcnVudGltZXMuc2l6ZSgpOyBpKyspIHsKKwkJCUlQcm9qZWN0TmF0dXJlIG5hdHVyZSA9IChJUHJvamVjdE5hdHVyZSkgcnVudGltZXMuZ2V0KGkpOworCQkJaWYgKG5hdHVyZSAhPSBudWxsICYmIENPTlRSSUJVVE9SX0NMQVNTLmlzSW5zdGFuY2UobmF0dXJlKSkgeworCQkJCWlmIChuYXR1cmUgPT0gY29udHJpYnV0b3IpCisJCQkJCWNvbnRyaWJ1dG9yRm91bmQgPSB0cnVlOworCQkJCSgoSUVNRkNvbnRleHRDb250cmlidXRvcikgbmF0dXJlKS5wcmltYXJ5Q29udHJpYnV0ZVRvQ29udGV4dChlbWZDb250ZXh0KTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gY29udHJpYnV0b3JGb3VuZDsKKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc05hdHVyZUVuYWJsZWQoSVByb2plY3QgYVByb2plY3QsIFN0cmluZyBuYXR1cmVJZCkgeworCQl0cnkgeworCQkJcmV0dXJuIGFQcm9qZWN0LmlzTmF0dXJlRW5hYmxlZChuYXR1cmVJZCk7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCisJcHJvdGVjdGVkIFN0cmluZ1tdIGdldE5hdHVyZUlkcyhJUHJvamVjdCBhUHJvamVjdCkgeworCQl0cnkgeworCQkJaWYgKGFQcm9qZWN0LmlzQWNjZXNzaWJsZSgpKQorCQkJCXJldHVybiBhUHJvamVjdC5nZXREZXNjcmlwdGlvbigpLmdldE5hdHVyZUlkcygpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcm90ZWN0ZWQgSVByb2plY3ROYXR1cmUgZ2V0TmF0dXJlKElQcm9qZWN0IGFQcm9qZWN0LCBTdHJpbmcgbmF0dXJlSWQpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBhUHJvamVjdC5nZXROYXR1cmUobmF0dXJlSWQpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJcHJvdGVjdGVkIEVNRldvcmtiZW5jaENvbnRleHRCYXNlIHByaW1DcmVhdGVFTUZDb250ZXh0KElQcm9qZWN0IGFQcm9qZWN0KSB7CisJCXJldHVybiBuZXcgRU1GV29ya2JlbmNoQ29udGV4dEJhc2UoYVByb2plY3QpOworCX0KKwkvKioKKwkgKiBSZXR1cm4gYW4gZXhpc3RpbmcgRU1GTmF0dXJlIG9uIDxjb2RlPmFQcm9qZWN0PC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgZ2V0RU1GQ29udGV4dChJUHJvamVjdCBhUHJvamVjdCkgeworCQlyZXR1cm4gZ2V0Q2FjaGVkRU1GQ29udGV4dChhUHJvamVjdCk7CisJfQorCisJcHVibGljIFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyIGNyZWF0ZVN5bmNocm9uaXplcihSZXNvdXJjZVNldCBhUmVzb3VyY2VTZXQsIElQcm9qZWN0IGFQcm9qZWN0KSB7CisJCXJldHVybiBuZXcgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIoYVJlc291cmNlU2V0LCBhUHJvamVjdCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9Qcm9qZWN0UmVzb3VyY2VTZXRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9Qcm9qZWN0UmVzb3VyY2VTZXRJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0NzNmYwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdXRpbC9lbWYvd29ya2JlbmNoL1Byb2plY3RSZXNvdXJjZVNldEltcGwuamF2YQpAQCAtMCwwICsxLDc4NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiAgJCRSQ1NmaWxlOiBQcm9qZWN0UmVzb3VyY2VTZXRJbXBsLmphdmEsdiAkJAorICogICQkUmV2aXNpb246IDEuMjEuMi4xICQkICAkJERhdGU6IDIwMDkvMDUvMTQgMDA6MTc6NTYgJCQgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLio7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UuRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuVVJJQ29udmVydGVySW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2gubmF0dXJlLkVNRk5hdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbi5KRU1VdGlsUGx1Z2luOworCitwdWJsaWMgY2xhc3MgUHJvamVjdFJlc291cmNlU2V0SW1wbCBleHRlbmRzIFJlc291cmNlU2V0SW1wbCBpbXBsZW1lbnRzIEZsZXhpYmxlUHJvamVjdFJlc291cmNlU2V0IHsKKwlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBNb2R1bGVVUkkgeworCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVUJfUFJPVE9DT0xfSU5EWCA9IDA7CisJCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0pFQ1RfTkFNRV9JTkRYID0gMTsKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9EVUxFX05BTUVfSU5EWCA9IDI7CisJCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfVFlQRV9JTkRYID0gMzsKKwl9CisJCisJcHVibGljIGNsYXNzIFN5bmNocm9uaXplZFJlc291cmNlc0VMaXN0PEUgZXh0ZW5kcyBPYmplY3QgJiBSZXNvdXJjZT4gZXh0ZW5kcyBSZXNvdXJjZXNFTGlzdDxFPiBpbXBsZW1lbnRzIEVMaXN0PEU+IHsKKworCQkvKioKKwkJICogCisJCSAqLworCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKwkJcHJpdmF0ZSBmaW5hbCBPYmplY3QgbG9jayA9IG5ldyBPYmplY3QoKTsKKworCQlwdWJsaWMgdm9pZCBtb3ZlKGludCBuZXdQb3NpdGlvbiwgRSBvYmplY3QpIHsKKwkJCQorCQkJc3luY2hyb25pemVkKGxvY2spIHsKKwkJCQlzdXBlci5tb3ZlKG5ld1Bvc2l0aW9uLCBvYmplY3QpOworCQkJfQorCisJCX0KKworCQlwdWJsaWMgRSBtb3ZlKGludCBuZXdQb3NpdGlvbiwgaW50IG9sZFBvc2l0aW9uKSB7CisKKwkJCXN5bmNocm9uaXplZChsb2NrKSB7CisJCQkJcmV0dXJuIHN1cGVyLm1vdmUobmV3UG9zaXRpb24sIG9sZFBvc2l0aW9uKTsKKwkJCX0KKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGFkZChFIG8pIHsKKwkJCQorCQkJc3luY2hyb25pemVkKGxvY2spIHsKKwkJCQlyZXR1cm4gc3VwZXIuYWRkKG8pOworCQkJfQorCQl9CisKKwkJcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgRSBlbGVtZW50KSB7CisJCQkKKwkJCXN5bmNocm9uaXplZChsb2NrKSB7CisJCQkJc3VwZXIuYWRkKGluZGV4LCBlbGVtZW50KTsKKwkJCX0KKworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKKwkJCQorCQkJc3luY2hyb25pemVkKGxvY2spIHsKKwkJCQlyZXR1cm4gc3VwZXIuYWRkQWxsKGMpOworCQkJfQorCQl9CisKKwkJcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBpbmRleCwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gYykgeworCQkJCisJCQlzeW5jaHJvbml6ZWQobG9jaykgeworCQkJCXJldHVybiBzdXBlci5hZGRBbGwoaW5kZXgsIGMpOworCQkJfQorCQl9CisKKwkJcHVibGljIHZvaWQgY2xlYXIoKSB7CisJCQkKKwkJCXN5bmNocm9uaXplZChsb2NrKSB7CisJCQkJc3VwZXIuY2xlYXIoKTsKKwkJCX0KKworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKKwkJCQorCQkJc3luY2hyb25pemVkKGxvY2spIHsKKwkJCQlyZXR1cm4gc3VwZXIuY29udGFpbnMobyk7CisJCQl9CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uPD8+IGMpIHsKKwkJCQorCQkJc3luY2hyb25pemVkKGxvY2spIHsKKwkJCQlyZXR1cm4gc3VwZXIuY29udGFpbnNBbGwoYyk7CisJCQl9CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKwkJCQorCQkJc3luY2hyb25pemVkKGxvY2spIHsKKwkJCQlyZXR1cm4gc3VwZXIuZXF1YWxzKG8pOworCQkJfQorCQl9CisKKwkJcHVibGljIEUgZ2V0KGludCBpbmRleCkgeworCQkJCisJCQlzeW5jaHJvbml6ZWQobG9jaykgeworCQkJCXJldHVybiBzdXBlci5nZXQoaW5kZXgpOworCQkJfQorCQl9CisKKwkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJCQorCQkJc3luY2hyb25pemVkKGxvY2spIHsKKwkJCQlyZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKKwkJCX0KKwkJfQorCisJCXB1YmxpYyBpbnQgaW5kZXhPZihPYmplY3QgbykgeworCQkJCisJCQlzeW5jaHJvbml6ZWQobG9jaykgeworCQkJCXJldHVybiBzdXBlci5pbmRleE9mKG8pOworCQkJfQorCQl9CisKKwkJcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKwkJCQorCQkJc3luY2hyb25pemVkKGxvY2spIHsKKwkJCQlyZXR1cm4gc3VwZXIuaXNFbXB0eSgpOworCQkJfQorCQl9CisKKwkJcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgeworCQkJCisJCQlzeW5jaHJvbml6ZWQobG9jaykgeworCQkJCXJldHVybiBzdXBlci5pdGVyYXRvcigpOworCQkJfQorCQl9CisKKwkJcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3QgbykgeworCQkJCisJCQlzeW5jaHJvbml6ZWQobG9jaykgeworCQkJCXJldHVybiBzdXBlci5sYXN0SW5kZXhPZihvKTsKKwkJCX0KKwkJfQorCisJCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKCkgeworCQkJCisJCQlzeW5jaHJvbml6ZWQobG9jaykgeworCQkJCXJldHVybiBzdXBlci5saXN0SXRlcmF0b3IoKTsKKwkJCX0KKwkJfQorCisJCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKGludCBpbmRleCkgeworCQkJCisJCQlzeW5jaHJvbml6ZWQobG9jaykgeworCQkJCXJldHVybiBzdXBlci5saXN0SXRlcmF0b3IoaW5kZXgpOworCQkJfQorCQl9CisKKwkJcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7CisJCQkKKwkJCXN5bmNocm9uaXplZChsb2NrKSB7CisJCQkJcmV0dXJuIHN1cGVyLnJlbW92ZShvKTsKKwkJCX0KKwkJfQorCisJCXB1YmxpYyBFIHJlbW92ZShpbnQgaW5kZXgpIHsKKwkJCQorCQkJc3luY2hyb25pemVkKGxvY2spIHsKKwkJCQlyZXR1cm4gc3VwZXIucmVtb3ZlKGluZGV4KTsKKwkJCX0KKwkJfQorCisJCXB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGMpIHsKKwkJCQorCQkJc3luY2hyb25pemVkKGxvY2spIHsKKwkJCQlyZXR1cm4gc3VwZXIucmVtb3ZlQWxsKGMpOworCQkJfQorCQl9CisKKwkJcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gYykgeworCQkJCisJCQlzeW5jaHJvbml6ZWQobG9jaykgeworCQkJCXJldHVybiBzdXBlci5yZXRhaW5BbGwoYyk7CisJCQl9CisJCX0KKworCQlwdWJsaWMgRSBzZXQoaW50IGluZGV4LCBFIGVsZW1lbnQpIHsKKwkJCQorCQkJc3luY2hyb25pemVkKGxvY2spIHsKKwkJCQlyZXR1cm4gc3VwZXIuc2V0KGluZGV4LCBlbGVtZW50KTsKKwkJCX0KKwkJfQorCisJCXB1YmxpYyBpbnQgc2l6ZSgpIHsKKwkJCQorCQkJc3luY2hyb25pemVkKGxvY2spIHsKKwkJCQlyZXR1cm4gc3VwZXIuc2l6ZSgpOworCQkJfQorCQl9CisKKwkJcHVibGljIExpc3Q8RT4gc3ViTGlzdChpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgeworCQkJCisJCQlzeW5jaHJvbml6ZWQobG9jaykgeworCQkJCXJldHVybiBzdXBlci5zdWJMaXN0KGZyb21JbmRleCwgdG9JbmRleCk7CisJCQl9CisJCX0KKworCQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKKwkJCQorCQkJc3luY2hyb25pemVkKGxvY2spIHsKKwkJCQlyZXR1cm4gc3VwZXIudG9BcnJheSgpOworCQkJfQorCQl9CisKKwkJcHVibGljIDxUPiBUW10gdG9BcnJheShUW10gYSkgeworCQkJCisJCQlzeW5jaHJvbml6ZWQobG9jaykgeworCQkJCXJldHVybiBzdXBlci50b0FycmF5KGEpOworCQkJfQorCQl9CisKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNSZWxlYXNpbmcgPSBmYWxzZTsKKwlwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7CisJcHJvdGVjdGVkIExpc3QgcmVzb3VyY2VIYW5kbGVycyA9IG5ldyBBcnJheUxpc3QoKTsKKwlwcm90ZWN0ZWQgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyOworCXByb3RlY3RlZCBQcm9qZWN0UmVzb3VyY2VTZXRJbXBsKCkgeworCQlzZXRVUklSZXNvdXJjZU1hcChuZXcgSGFzaE1hcCgxMCkpOwkvLyBUZWxsIGl0IHRvIGNhY2hlIHVyaS0+cmVzb3VyY2UgYWNjZXNzLgorCQlnZXRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX1BBUlNFUl9QT09MLCBFTUZOYXR1cmUuU0hBUkVEX1BBUlNFUl9QT09MKTsKKwl9CisJcHVibGljIFByb2plY3RSZXNvdXJjZVNldEltcGwoSVByb2plY3QgYVByb2plY3QpIHsKKwkJdGhpcygpOworCQlzZXRQcm9qZWN0KGFQcm9qZWN0KTsKKwkJaW5pdGlhbGl6ZVNoYXJlZENhY2hlTGlzdGVuZXIoKTsKKwl9CisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNoYXJlZENhY2hlTGlzdGVuZXIoKSB7CisJCUpFTVV0aWxQbHVnaW4uZ2V0U2hhcmVkQ2FjaGUoKS5iZWdpbkxpc3RlbmluZyh0aGlzKTsKKwl9CisJcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWxlYXNpbmcoKSB7CisJCXJldHVybiBpc1JlbGVhc2luZzsKKwl9CisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGwjZGVsZWdhdGVkR2V0UmVzb3VyY2UoVVJJLCBib29sZWFuKQorCSAqLworCXByb3RlY3RlZCBSZXNvdXJjZSBkZWxlZ2F0ZWRHZXRSZXNvdXJjZShVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCkgeworCQlSZXNvdXJjZSByZXMgPSBzdXBlci5kZWxlZ2F0ZWRHZXRSZXNvdXJjZSh1cmksIGxvYWRPbkRlbWFuZCk7CisJCWlmIChyZXMgPT0gbnVsbCkKKwkJCXJlcyA9IGdldFJlc291cmNlRnJvbUhhbmRsZXJzKHVyaSk7CisJCXJldHVybiByZXM7CisJfQorCisJcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFN0cmluZyBjb250ZW50VHlwZSkgeworCQlpZiAoaXNSZWxlYXNpbmcpIHJldHVybiBudWxsOworCQkvL0NoZWNrIHRoZSBtYXAgZmlyc3Qgd2hlbiBjcmVhdGluZyB0aGUgcmVzb3VyY2UgYW5kIGRvIG5vdAorCQkvL25vcm1hbGl6ZSBpZiBhIHZhbHVlIGlzIGZvdW5kLgorCQlib29sZWFuIGlzTWFwcGVkID0gZGV0ZWN0VVJJTWFwcGluZyh1cmkpOworCQlib29sZWFuIGhhc0NvbnRlbnRUeXBlID0gKGdldENvbnRlbnRUeXBlTmFtZSh1cmkpICE9IG51bGwpOworCQlVUkkgY29udmVydGVkID0gdXJpOworCQlpZiAoIWlzTWFwcGVkKQorCQkJY29udmVydGVkID0gZ2V0VVJJQ29udmVydGVyKCkubm9ybWFsaXplKHVyaSk7CisJCWVsc2UgaWYgKGhhc0NvbnRlbnRUeXBlKQorCQkJY29udmVydGVkID0gZ2V0VVJJQ29udmVydGVyKCkubm9ybWFsaXplKHVyaSk7CisJCQorCQlSZXNvdXJjZSByZXN1bHQgPSBjcmVhdGVSZXNvdXJjZUZyb21IYW5kbGVycyhjb252ZXJ0ZWQpOworCQlpZiAocmVzdWx0ID09IG51bGwpIHsKKwkJICAgIFJlc291cmNlLkZhY3RvcnkgcmVzb3VyY2VGYWN0b3J5ID0gZ2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKS5nZXRGYWN0b3J5KHVyaSk7CisJCSAgICBpZiAocmVzb3VyY2VGYWN0b3J5ICE9IG51bGwpCisJCSAgICB7Ly9XZSBnb3QgdGhlIHJpZ2h0IGZhY3RvcnksIG5vdyB1c2UgdGhlIHJpZ2h0IFVSSQorCQkgICAgICByZXN1bHQgPSByZXNvdXJjZUZhY3RvcnkuY3JlYXRlUmVzb3VyY2UoY29udmVydGVkKTsKKwkJICAgICAgZ2V0UmVzb3VyY2VzKCkuYWRkKHJlc3VsdCk7CisJCSAgICB9CisJCX0KKwkJCQorCQkKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgeworCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2UodXJpLCBDb250ZW50SGFuZGxlci5VTlNQRUNJRklFRF9DT05URU5UX1RZUEUpOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBkZXRlY3RVUklNYXBwaW5nKFVSSSB1cmkpIHsKKwkJaWYgKHVyaSA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisJCXJldHVybiAhKCgoVVJJQ29udmVydGVySW1wbC5VUklNYXApZ2V0VVJJQ29udmVydGVyKCkuZ2V0VVJJTWFwKCkpLmdldFVSSSh1cmkpLmVxdWFscyh1cmkpKTsKKwl9CisJLyoqCisJICogUmV0dXJuIHRoZSBJRmlsZSBmb3IgdGhlIDxjb2RlPnVyaTwvY29kZT4gd2l0aGluIHRoZSBXb3Jrc3BhY2UuIFRoaXMgVVJJIGlzIGFzc3VtZWQgdG8gYmUKKwkgKiBhYnNvbHV0ZSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDogcGxhdGZvcm06L3Jlc291cmNlLy4uLi4KKwkgKi8KKwlwcml2YXRlIElGaWxlIGdldFBsYXRmb3JtRmlsZShVUkkgdXJpKSB7CisJCWlmIChXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuaXNQbGF0Zm9ybVJlc291cmNlVVJJKHVyaSkpIHsKKwkJCVN0cmluZyBmaWxlU3RyaW5nID0gVVJJLmRlY29kZSh1cmkucGF0aCgpKTsKKwkJCWZpbGVTdHJpbmcgPSBmaWxlU3RyaW5nLnN1YnN0cmluZyhKRU1VdGlsUGx1Z2luLlBMQVRGT1JNX1JFU09VUkNFLmxlbmd0aCgpICsgMSk7CisJCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKG5ldyBQYXRoKGZpbGVTdHJpbmcpKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFJlc291cmNlLkZhY3RvcnkgcmVzb3VyY2VGYWN0b3J5KSB7CisJCWlmIChpc1JlbGVhc2luZykgcmV0dXJuIG51bGw7CisJCS8vQ2hlY2sgdGhlIG1hcCBmaXJzdCB3aGVuIGNyZWF0aW5nIHRoZSByZXNvdXJjZSBhbmQgZG8gbm90CisJCS8vbm9ybWFsaXplIGlmIGEgdmFsdWUgaXMgZm91bmQuCisJCWJvb2xlYW4gaXNNYXBwZWQgPSBkZXRlY3RVUklNYXBwaW5nKHVyaSk7CisJCWJvb2xlYW4gaGFzQ29udGVudFR5cGUgPSAoZ2V0Q29udGVudFR5cGVOYW1lKHVyaSkgIT0gbnVsbCk7CisJCVVSSSBjb252ZXJ0ZWQgPSB1cmk7CisJCWlmICghaXNNYXBwZWQpCisJCQljb252ZXJ0ZWQgPSBnZXRVUklDb252ZXJ0ZXIoKS5ub3JtYWxpemUodXJpKTsKKwkJZWxzZSBpZiAoaGFzQ29udGVudFR5cGUpCisJCQljb252ZXJ0ZWQgPSBnZXRVUklDb252ZXJ0ZXIoKS5ub3JtYWxpemUodXJpKTsKKwkJUmVzb3VyY2UgcmVzdWx0ID0gY3JlYXRlUmVzb3VyY2VGcm9tSGFuZGxlcnMoY29udmVydGVkKTsKKwkJaWYgKHJlc3VsdCA9PSBudWxsKSB7CisKKwkJICAgIGlmIChyZXNvdXJjZUZhY3RvcnkgIT0gbnVsbCkKKwkJICAgIHsKKwkJICAgICAgcmVzdWx0ID0gcmVzb3VyY2VGYWN0b3J5LmNyZWF0ZVJlc291cmNlKGNvbnZlcnRlZCk7CisJCSAgICAgIGdldFJlc291cmNlcygpLmFkZChyZXN1bHQpOworCQkgICAgICBnZXRVUklSZXNvdXJjZU1hcCgpLnB1dCh1cmksIHJlc3VsdCk7CisJCSAgICAgIHJldHVybiByZXN1bHQ7CisJCSAgICB9CisJCSAgICBlbHNlCisJCSAgICB7CisJCSAgICAgIHJldHVybiBudWxsOworCQkgICAgfQorCQkgIAorCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsI2RlbWFuZExvYWQoUmVzb3VyY2UpCisJICovCisJcHJvdGVjdGVkIHZvaWQgZGVtYW5kTG9hZChSZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKCFpc1JlbGVhc2luZykKKwkJCXN1cGVyLmRlbWFuZExvYWQocmVzb3VyY2UpOworCX0KKwkKKwkvKioKKwkgKiBTZWUgaWYgYW55IHJlc291cmNlIGhhbmRsZXJzIGZyb20gdGhlIFdvcmtiZW5jaENvbnRleHQKKwkgKiBkZWNpZGUgdG8gY3JlYXRlIHRoZSBSZXNvdXJjZSBpbiBhbm90aGVyIG1hbm5lci4KKwkgKi8KKwlwcm90ZWN0ZWQgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2VGcm9tSGFuZGxlcnMoVVJJIHVyaSkgeworCQlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7CisJCVJlc291cmNlSGFuZGxlciBoYW5kbGVyID0gbnVsbDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZUhhbmRsZXJzLnNpemUoKTsgaSsrKSB7CisJCQloYW5kbGVyID0gKFJlc291cmNlSGFuZGxlcikgcmVzb3VyY2VIYW5kbGVycy5nZXQoaSk7CisJCQlyZXNvdXJjZSA9IGhhbmRsZXIuY3JlYXRlUmVzb3VyY2UodGhpcywgdXJpKTsKKwkJCWlmIChyZXNvdXJjZSAhPSBudWxsKQorCQkJCXJldHVybiByZXNvdXJjZTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJLyoqCisJICogU2VlIGlmIGFueSByZXNvdXJjZSBoYW5kbGVycyBmcm9tIHRoZSBXb3JrYmVuY2hDb250ZXh0CisJICogY2FuIHJldHVybiBhIFJlc291cmNlIGZyb20gYSA8Y29kZT51cmk8L2NvZGU+LgorCSAqLworCXByb3RlY3RlZCBSZXNvdXJjZSBnZXRSZXNvdXJjZUZyb21IYW5kbGVycyhVUkkgdXJpKSB7CisJCWlmIChpc1JlbGVhc2luZykgcmV0dXJuIG51bGw7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VIYW5kbGVycy5zaXplKCk7IGkrKykgeworCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoKFJlc291cmNlSGFuZGxlcikgcmVzb3VyY2VIYW5kbGVycy5nZXQoaSkpLmdldFJlc291cmNlKHRoaXMsIHVyaSk7CisJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkKKwkJCQlyZXR1cm4gcmVzb3VyY2U7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7CisJCS8vIFNlbmQgb3V0IG5vdGlmaWNhdGlvbiBvZiByZWxlYXNlLgorCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCWVOb3RpZnkobmV3IE5vdGlmaWNhdGlvbkltcGwoU1BFQ0lBTF9OT1RJRklDQVRJT05fVFlQRSwgbnVsbCwgbnVsbCwgTm90aWZpY2F0aW9uLk5PX0lOREVYLCBmYWxzZSkgeworCQkJCS8qIChub24tSmF2YWRvYykKKwkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uSW1wbCNnZXRGZWF0dXJlSUQoamF2YS5sYW5nLkNsYXNzKQorCQkJCSAqLworCQkJCXB1YmxpYyBpbnQgZ2V0RmVhdHVyZUlEKENsYXNzIGV4cGVjdGVkQ2xhc3MpIHsKKwkJCQkJcmV0dXJuIFBST0pFQ1RSRVNPVVJDRVNFVF9BQk9VVF9UT19SRUxFQVNFX0lEOworCQkJCX0KKwkJCQkKKwkJCQkvKiAobm9uLUphdmFkb2MpCisJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkltcGwjZ2V0Tm90aWZpZXIoKQorCQkJCSAqLworCQkJCXB1YmxpYyBPYmplY3QgZ2V0Tm90aWZpZXIoKSB7CisJCQkJCXJldHVybiBQcm9qZWN0UmVzb3VyY2VTZXRJbXBsLnRoaXM7CisJCQkJfQorCQkJfSk7CisJCX0KKwkJc2V0SXNSZWxlYXNpbmcodHJ1ZSk7CisJCWlmIChzeW5jaHJvbml6ZXIgIT0gbnVsbCkKKwkJCXN5bmNocm9uaXplci5kaXNwb3NlKCk7CisJCXN5bmNocm9uaXplciA9IG51bGw7CisJCXJlbW92ZUFuZFVubG9hZEFsbFJlc291cmNlcygpOworCQlyZXNvdXJjZUhhbmRsZXJzID0gbnVsbDsKKwkJZUFkYXB0ZXJzKCkuY2xlYXIoKTsKKwkJc2V0UHJvamVjdChudWxsKTsKKwkJSkVNVXRpbFBsdWdpbi5nZXRTaGFyZWRDYWNoZSgpLnN0b3BMaXN0ZW5pbmcodGhpcyk7CisJfQorCXByb3RlY3RlZCB2b2lkIHJlbW92ZUFuZFVubG9hZEFsbFJlc291cmNlcygpIHsKKwkJYm9vbGVhbiBjYXVnaHRFeGNlcHRpb24gPSBmYWxzZTsKKwkJaWYgKGdldFJlc291cmNlcygpLmlzRW1wdHkoKSkgcmV0dXJuOworCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KGdldFJlc291cmNlcygpKTsKKwkJZ2V0UmVzb3VyY2VzKCkuY2xlYXIoKTsKKwkJUmVzb3VyY2UgcmVzOworCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJcmVzID0gKFJlc291cmNlKSBsaXN0LmdldChpKTsKKwkJCXRyeSB7CisJCQkJcmVzLnVubG9hZCgpOworCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgeworCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7CisJCQkJY2F1Z2h0RXhjZXB0aW9uID0gdHJ1ZTsKKwkJCX0KKwkJfQorCQlpZiAoY2F1Z2h0RXhjZXB0aW9uKQorCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4Y2VwdGlvbihzKSB1bmxvYWRpbmcgcmVzb3VyY2VzIC0gY2hlY2sgbG9nIGZpbGVzIik7IC8vJE5PTi1OTFMtMSQKKwl9CisJcHJvdGVjdGVkIHZvaWQgc2V0SXNSZWxlYXNpbmcoYm9vbGVhbiBhQm9vbGVhbikgeworCQlpc1JlbGVhc2luZyA9IGFCb29sZWFuOworCX0KKwkvKioKKwkgKiBHZXRzIHRoZSBwcm9qZWN0LgorCSAqIEByZXR1cm4gUmV0dXJucyBhIElQcm9qZWN0CisJICovCisJcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7CisJCXJldHVybiBwcm9qZWN0OworCX0KKwkvKioKKwkgKiBTZXRzIHRoZSBwcm9qZWN0LgorCSAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0IHRvIHNldAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcHJvamVjdCkgeworCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OworCX0KKwkvKgorCSAqIEphdmFkb2MgY29waWVkIGZyb20gaW50ZXJmYWNlLgorCSAqLworCXB1YmxpYyBFT2JqZWN0IGdldEVPYmplY3QoVVJJIHVyaSwgYm9vbGVhbiBsb2FkT25EZW1hbmQpIHsKKwkJaWYgKGlzUmVsZWFzaW5nKSByZXR1cm4gbnVsbDsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZSh1cmkudHJpbUZyYWdtZW50KCksIGxvYWRPbkRlbWFuZCk7CisJCUVPYmplY3QgcmVzdWx0ID0gbnVsbDsKKwkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuaXNMb2FkZWQoKSkKKwkJCXJlc3VsdCA9IHJlc291cmNlLmdldEVPYmplY3QodXJpLmZyYWdtZW50KCkpOworCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQlyZXN1bHQgPSBnZXRFT2JqZWN0RnJvbUhhbmRsZXJzKHVyaSwgbG9hZE9uRGVtYW5kKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJLyoqCisJICogU2VlIGlmIGFueSByZXNvdXJjZSBoYW5kbGVycyBmcm9tIHRoZSBXb3JrYmVuY2hDb250ZXh0CisJICogY2FuIHJldHVybiBhIEVPYmplY3QgZnJvbSBhIDxjb2RlPnVyaTwvY29kZT4gYWZ0ZXIKKwkgKiBmYWlsaW5nIHRvIGZpbmQgaXQgdXNpbmcgdGhlIG5vcm1hbCBtZWNoYW5pc21zLgorCSAqLworCXByb3RlY3RlZCBFT2JqZWN0IGdldEVPYmplY3RGcm9tSGFuZGxlcnMoVVJJIHVyaSwgYm9vbGVhbiBsb2FkT25EZW1hbmQpIHsKKwkJRU9iamVjdCBvYmogPSBudWxsOworCQlSZXNvdXJjZUhhbmRsZXIgaGFuZGxlciA9IG51bGw7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VIYW5kbGVycy5zaXplKCk7IGkrKykgeworCQkJaGFuZGxlciA9IChSZXNvdXJjZUhhbmRsZXIpIHJlc291cmNlSGFuZGxlcnMuZ2V0KGkpOworCQkJb2JqID0gaGFuZGxlci5nZXRFT2JqZWN0RmFpbGVkKHRoaXMsIHVyaSwgbG9hZE9uRGVtYW5kKTsKKwkJCWlmIChvYmogIT0gbnVsbCkKKwkJCQlyZXR1cm4gb2JqOworCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBhZGQoUmVzb3VyY2VIYW5kbGVyIHJlc291cmNlSGFuZGxlcikgeworCQlyZXR1cm4gcmVzb3VyY2VIYW5kbGVycy5hZGQocmVzb3VyY2VIYW5kbGVyKTsKKwl9CisJcHVibGljIHZvaWQgYWRkRmlyc3QoUmVzb3VyY2VIYW5kbGVyIHJlc291cmNlSGFuZGxlcikgeworCQlyZXNvdXJjZUhhbmRsZXJzLmFkZCgwLCByZXNvdXJjZUhhbmRsZXIpOworCX0KKwlwdWJsaWMgYm9vbGVhbiByZW1vdmUoUmVzb3VyY2VIYW5kbGVyIHJlc291cmNlSGFuZGxlcikgeworCQlyZXR1cm4gcmVzb3VyY2VIYW5kbGVycy5yZW1vdmUocmVzb3VyY2VIYW5kbGVyKTsKKwl9CisJLyoqCisJICogUmV0dXJucyB0aGUgc3luY2hyb25pemVyLgorCSAqIEByZXR1cm4gUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIKKwkgKi8KKwlwdWJsaWMgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgZ2V0U3luY2hyb25pemVyKCkgeworCQlyZXR1cm4gc3luY2hyb25pemVyOworCX0KKwkvKioKKwkgKiBTZXRzIHRoZSBzeW5jaHJvbml6ZXIuCisJICogQHBhcmFtIHN5bmNocm9uaXplciBUaGUgc3luY2hyb25pemVyIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldFN5bmNocm9uaXplcihSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIpIHsKKwkJdGhpcy5zeW5jaHJvbml6ZXIgPSBzeW5jaHJvbml6ZXI7CisJfQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0I3NldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkpCisJICovCisJcHVibGljIHZvaWQgc2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeSBmYWN0b3J5UmVnKSB7CisJCWlmIChyZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSAhPSBudWxsICYmIGZhY3RvcnlSZWcgIT0gbnVsbCkgeworCQkJcHJlc2VydmVFbnRyaWVzKGZhY3RvcnlSZWcuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCksIHJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpKTsKKwkJCXByZXNlcnZlRW50cmllcyhmYWN0b3J5UmVnLmdldFByb3RvY29sVG9GYWN0b3J5TWFwKCksIHJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LmdldFByb3RvY29sVG9GYWN0b3J5TWFwKCkpOworCQl9CisJCXN1cGVyLnNldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KGZhY3RvcnlSZWcpOworCX0KKwkvKgorCSAqIFByZXNlcnZlIHRoZSBlbnRyaWVzIGZyb20gbWFwMiBpbiBtYXAxIGlmIG5vIGNvbGxpc2lvbi4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBwcmVzZXJ2ZUVudHJpZXMoTWFwIG1hcDEsIE1hcCBtYXAyKSB7CisJCWlmIChtYXAyLmlzRW1wdHkoKSkKKwkJCXJldHVybjsKKwkJSXRlcmF0b3IgaXQgPSBtYXAyLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKwkJTWFwLkVudHJ5IGVudHJ5OworCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisJCQllbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKKwkJCWlmICghbWFwMS5jb250YWluc0tleShlbnRyeS5nZXRLZXkoKSkpCisJCQkJbWFwMS5wdXQoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOworCQl9CisJfQorCS8qCisJICogSmF2YWRvYyBjb3BpZWQgZnJvbSBpbnRlcmZhY2UuCisJICovCisJcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKFVSSSB1cmksIGJvb2xlYW4gbG9hZE9uRGVtYW5kKSB7CisJCWlmIChpc1JlbGVhc2luZykgcmV0dXJuIG51bGw7CisKKwkgICAgTWFwPFVSSSwgUmVzb3VyY2U+IG1hcCA9IGdldFVSSVJlc291cmNlTWFwKCk7CisJICAgIGlmIChtYXAgIT0gbnVsbCkKKwkgICAgeworCSAgICAgIFJlc291cmNlIHJlc291cmNlID0gbWFwLmdldCh1cmkpOworCSAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKQorCSAgICAgIHsKKwkgICAgICAgIGlmIChsb2FkT25EZW1hbmQgJiYgIXJlc291cmNlLmlzTG9hZGVkKCkpCisJICAgICAgICB7CisJICAgICAgICAgIGRlbWFuZExvYWRIZWxwZXIocmVzb3VyY2UpOworCSAgICAgICAgfSAgICAgICAgCisJICAgICAgICByZXR1cm4gcmVzb3VyY2U7CisJICAgICAgfQorCSAgICB9CisJICAgIAorCSAgICBVUklDb252ZXJ0ZXIgdGhlVVJJQ29udmVydGVyID0gZ2V0VVJJQ29udmVydGVyKCk7CisJICAgIFVSSSBub3JtYWxpemVkVVJJID0gdGhlVVJJQ29udmVydGVyLm5vcm1hbGl6ZSh1cmkpOworCSAgICBMaXN0IHJlc291cmNlc1RvUmVtb3ZlID0gbmV3IEFycmF5TGlzdCgpOworCSAgICBmb3IgKFJlc291cmNlIHJlc291cmNlIDogZ2V0UmVzb3VyY2VzKCkpCisJICAgIHsKKwkgICAgICBpZiAodGhlVVJJQ29udmVydGVyLm5vcm1hbGl6ZShyZXNvdXJjZS5nZXRVUkkoKSkuZXF1YWxzKG5vcm1hbGl6ZWRVUkkpKSB7CisJICAgIAkJICAKKwkgICAgCWlmIChnZXRDb250ZW50VHlwZU5hbWUodXJpKSA9PSBudWxsKSB7IC8vIGxvYWRpbmcgZnJvbSBsZWdhY3kgYXJjaGl2ZSBhcGkgb3Igbm9uLXR5cGVkIHJlc291cmNlCisJCSAgICAgICAgaWYgKGxvYWRPbkRlbWFuZCAmJiAhcmVzb3VyY2UuaXNMb2FkZWQoKSkKKwkJICAgICAgICB7CisJCSAgICAgICAgICBkZW1hbmRMb2FkSGVscGVyKHJlc291cmNlKTsKKwkJICAgICAgICB9CisJCSAgICAgICAgCisJCSAgICAgICAgaWYgKG1hcCAhPSBudWxsKQorCQkgICAgICAgIHsKKwkJICAgICAgICAgIG1hcC5wdXQodXJpLCByZXNvdXJjZSk7CisJCSAgICAgICAgfSAKKwkJICAgICAgICByZXR1cm4gcmVzb3VyY2U7CisJICAgIAl9IGVsc2UgIHsvLyBjb250ZW50IHR5cGUgaXMga25vd24KKwkgICAgCQlib29sZWFuIHJlc291cmNlRXhpc3RzID0gZmFsc2U7CisJICAgIAkJSUZpbGUgZmlsZSA9IGdldFBsYXRmb3JtRmlsZShyZXNvdXJjZSk7CisJICAgIAkJaWYgKGZpbGUgIT0gbnVsbCkKKwkgICAgCQkJcmVzb3VyY2VFeGlzdHMgPSBmaWxlLmV4aXN0cygpOworCSAgICAJCVN0cmluZyByZXNvdXJjZUNvbnRlbnRUeXBlSUQgPSBnZXRDb250ZW50VHlwZUlEKHJlc291cmNlKTsKKwkgICAgCQlTdHJpbmcgdXJpQ29udGVudFR5cGVJRCA9IGdldENvbnRlbnRUeXBlTmFtZSh1cmkpOworCSAgICAJCVN0cmluZyBleGlzdGluZ01hcEtleVR5cGUgPSAoZmluZEtleShyZXNvdXJjZSkgIT0gbnVsbCkgPyBnZXRDb250ZW50VHlwZU5hbWUoZmluZEtleShyZXNvdXJjZSkpIDogbnVsbDsKKwkgICAgCQlpZigoIW1hcC5jb250YWluc1ZhbHVlKHJlc291cmNlKSB8fCAoKG1hcC5nZXQodXJpKSAhPSBudWxsKSAmJiBtYXAuZ2V0KHVyaSkuZXF1YWxzKHJlc291cmNlKSkpIC8vIGV4aXN0aW5nIHJlc291cmNlICB3aXRoIGFsdGVybmF0ZSBtYXBwaW5nIGRvZXNuJ3QgZXhpc3QgaW4gbWFwCisJICAgIAkJCXx8ICAoKHJlc291cmNlQ29udGVudFR5cGVJRCAhPSBudWxsICYmIHJlc291cmNlQ29udGVudFR5cGVJRC5lcXVhbHModXJpQ29udGVudFR5cGVJRCkpKSkgeworCQkJCQkJaWYgKGxvYWRPbkRlbWFuZCAmJiAhcmVzb3VyY2UuaXNMb2FkZWQoKSkgeworCQkJCQkJCWRlbWFuZExvYWRIZWxwZXIocmVzb3VyY2UpOworCQkJCQkJfSAvLyBpZiBlbWJlZGRlZCB1cmkgY29udGVudCB0eXBlIGlzIGRpZmZlcmVudCB0aGFuIHJlc291cmNlIGNvbnRlbnQgdHlwZSwgY29udGludWUgc2VhcmNoaW5nCisJCQkJCQlpZiAocmVzb3VyY2VDb250ZW50VHlwZUlEICE9IG51bGwKKwkJCQkJCQkJJiYgdXJpQ29udGVudFR5cGVJRCAhPSBudWxsKSB7CisJCQkJCQkJaWYgKChyZXNvdXJjZUNvbnRlbnRUeXBlSUQuZXF1YWxzKHVyaUNvbnRlbnRUeXBlSUQpKSAmJiBleGlzdGluZ01hcEtleVR5cGUgPT0gbnVsbCkgY29udGludWU7CisJCQkJCQkJaWYgKCghcmVzb3VyY2VDb250ZW50VHlwZUlELmVxdWFscyh1cmlDb250ZW50VHlwZUlEKSkgfHwgKGV4aXN0aW5nTWFwS2V5VHlwZSAhPSBudWxsICYmICFleGlzdGluZ01hcEtleVR5cGUKKwkJCQkJCQkJCS5lcXVhbHModXJpQ29udGVudFR5cGVJRCkpKQorCQkJCQkJCQljb250aW51ZTsKKwkJCQkJCQllbHNlIGlmIChleGlzdGluZ01hcEtleVR5cGUgPT0gbnVsbCAmJiAhcmVzb3VyY2VFeGlzdHMpIHsKKwkJCQkJCQkJcmVzb3VyY2VzVG9SZW1vdmUuYWRkKHJlc291cmNlKTsKKwkJCQkJCQkJY29udGludWU7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIGlmICh1cmlDb250ZW50VHlwZUlEICE9IG51bGwgJiYgcmVzb3VyY2VDb250ZW50VHlwZUlEID09IG51bGwgJiYgIXJlc291cmNlRXhpc3RzKSB7CisJCQkJCQkJcmVzb3VyY2VzVG9SZW1vdmUuYWRkKHJlc291cmNlKTsKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCX0KKwkJCQkJCQkJCisJCQkJCQlpZiAobWFwICE9IG51bGwgJiYgKG1hcC5nZXQodXJpKSA9PSBudWxsKSkgeworCQkJCQkJCW1hcC5wdXQodXJpLCByZXNvdXJjZSk7CisJCQkJCQl9CisJCQkJCQlyZXR1cm4gcmVzb3VyY2U7CisJCQkJCX0KKwkgICAgCX0KKwkgICAgICB9CisJICAgIH0KKwkgICAgLy8gQ2xlYW51cCBpbnZhbGlkIHJlc291cmNlcworCSAgICBnZXRSZXNvdXJjZXMoKS5yZW1vdmVBbGwocmVzb3VyY2VzVG9SZW1vdmUpOworCSAgICBSZXNvdXJjZSBkZWxlZ2F0ZWRSZXNvdXJjZSA9IGRlbGVnYXRlZEdldFJlc291cmNlKHVyaSwgbG9hZE9uRGVtYW5kKTsKKwkgICAgaWYgKGRlbGVnYXRlZFJlc291cmNlICE9IG51bGwpCisJICAgIHsKKwkgICAgICBpZiAobWFwICE9IG51bGwpCisJICAgICAgeworCSAgICAgICAgbWFwLnB1dCh1cmksIGRlbGVnYXRlZFJlc291cmNlKTsKKwkgICAgICB9CisJICAgICAgcmV0dXJuIGRlbGVnYXRlZFJlc291cmNlOworCSAgICB9CisKKwkgICAgaWYgKGxvYWRPbkRlbWFuZCkKKwkgICAgeworCSAgICAgIFJlc291cmNlIHJlc291cmNlID0gZGVtYW5kQ3JlYXRlUmVzb3VyY2UodXJpKTsKKwkgICAgICBpZiAocmVzb3VyY2UgPT0gbnVsbCkKKwkgICAgICB7CisJICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSBhIHJlc291cmNlIGZvciAnIiArIHVyaSArICInOyBhIHJlZ2lzdGVyZWQgcmVzb3VyY2UgZmFjdG9yeSBpcyBuZWVkZWQiKTsKKwkgICAgICB9CisJICAgICAgCisJICAgICAgaWYgKG1hcCAhPSBudWxsKQorCSAgICAgIHsKKwkgICAgICAgIG1hcC5wdXQodXJpLCByZXNvdXJjZSk7CisJICAgICAgfSAgCisKKwkgICAgICBkZW1hbmRMb2FkSGVscGVyKHJlc291cmNlKTsKKworCSAgICAgICAgICAKKwkgICAgICByZXR1cm4gcmVzb3VyY2U7CisJICAgIH0KKworCSAgICByZXR1cm4gbnVsbDsKKwkgIAorCX0KKwlwcml2YXRlIElGaWxlIGdldFBsYXRmb3JtRmlsZShSZXNvdXJjZSByZXMpIHsKKwkJSUZpbGUgZmlsZSA9IG51bGw7CisJCWZpbGUgPSBnZXRQbGF0Zm9ybUZpbGUocmVzLmdldFVSSSgpKTsKKwkJaWYgKGZpbGUgPT0gbnVsbCkgeworCQkJaWYgKHJlcy5nZXRSZXNvdXJjZVNldCgpICE9IG51bGwpIHsKKwkJCQlVUklDb252ZXJ0ZXIgY29udmVydGVyID0gcmVzLmdldFJlc291cmNlU2V0KCkuZ2V0VVJJQ29udmVydGVyKCk7CisJCQkJVVJJIGNvbnZlcnRlZFVyaSA9IGNvbnZlcnRlci5ub3JtYWxpemUocmVzLmdldFVSSSgpKTsKKwkJCQlpZiAoIXJlcy5nZXRVUkkoKS5lcXVhbHMoY29udmVydGVkVXJpKSkKKwkJCQkJZmlsZSA9IGdldFBsYXRmb3JtRmlsZShjb252ZXJ0ZWRVcmkpOworCQkJfQorCQl9CisJCXJldHVybiBmaWxlOworCX0KKwkKKwlwcml2YXRlIFN0cmluZyBnZXRDb250ZW50VHlwZUlEKFJlc291cmNlIHJlc291cmNlKSB7CisJCUlGaWxlIGZpbGUgPSBnZXRQbGF0Zm9ybUZpbGUocmVzb3VyY2UpOworCQlJQ29udGVudERlc2NyaXB0aW9uIGRlc2MgPSBudWxsOworCQl0cnkgeworCQkJZGVzYyA9IGZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQl9CisJCWlmIChkZXNjICE9IG51bGwgJiYgZGVzYy5nZXRDb250ZW50VHlwZSgpICE9IG51bGwpCisJCQlyZXR1cm4gZGVzYy5nZXRDb250ZW50VHlwZSgpLmdldElkKCk7CisJCXJldHVybiBudWxsOworCX0KKwlwcml2YXRlIFVSSSBmaW5kS2V5KFJlc291cmNlIHJlc291cmNlKSB7CisJCU1hcCBhTWFwID0gZ2V0VVJJUmVzb3VyY2VNYXAoKTsKKwkJU2V0IGtleXMgPSBhTWFwLmtleVNldCgpOworCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0ga2V5cy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7CisJCQlVUkkgbmFtZSA9IChVUkkpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCWlmIChhTWFwLmdldChuYW1lKS5lcXVhbHMocmVzb3VyY2UpKQorCQkJCXJldHVybiBuYW1lOworCQl9CisJCXJldHVybiBudWxsOworCX0KKwlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRDb250ZW50VHlwZU5hbWUoVVJJIHVyaSkgeworCQkKKwkJaWYgKFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5pc1BsYXRmb3JtUmVzb3VyY2VVUkkodXJpKSB8fCAhaXNWYWxpZEZ1bGx5UXVhbGlmaWVkTW9kdWxlVVJJKHVyaSkpCisJCQlyZXR1cm4gbnVsbDsKKwkJU3RyaW5nIGNvbnRlbnRUeXBlSWRlbnRpZmllciA9ICh1cmkuc2VnbWVudENvdW50KCkgPiAzID8gdXJpLnNlZ21lbnQoTW9kdWxlVVJJLkNPTlRFTlRfVFlQRV9JTkRYKSA6IG51bGwpOworCQlpZiAoY29udGVudFR5cGVJZGVudGlmaWVyICE9IG51bGwgJiYgUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUodXJpLnNlZ21lbnQoTW9kdWxlVVJJLkNPTlRFTlRfVFlQRV9JTkRYKSkgIT0gbnVsbCkKKwkJCXJldHVybiBjb250ZW50VHlwZUlkZW50aWZpZXI7CisJCWVsc2UKKwkJCXJldHVybiBudWxsOworCX0KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEZ1bGx5UXVhbGlmaWVkTW9kdWxlVVJJKFVSSSBhTW9kdWxlVVJJKSB7CisJCWlmIChhTW9kdWxlVVJJLnNlZ21lbnRDb3VudCgpIDwgMykgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKwkvKgorCSAqIEphdmFkb2MgY29waWVkIGZyb20gaW50ZXJmYWNlLgorCSAqLworCXB1YmxpYyBSZXNvdXJjZSBnZXRSZXNvdXJjZShVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCwgUmVzb3VyY2UuRmFjdG9yeSByZXNvdXJjZUZhY3RvcnkpIHsKKwkJaWYgKGlzUmVsZWFzaW5nKSByZXR1cm4gbnVsbDsKKwkJCisKKwkgICAgTWFwPFVSSSwgUmVzb3VyY2U+IG1hcCA9IGdldFVSSVJlc291cmNlTWFwKCk7CisJICAgIGlmIChtYXAgIT0gbnVsbCkKKwkgICAgeworCSAgICAgIFJlc291cmNlIHJlc291cmNlID0gbWFwLmdldCh1cmkpOworCSAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKQorCSAgICAgIHsKKwkgICAgICAgIGlmIChsb2FkT25EZW1hbmQgJiYgIXJlc291cmNlLmlzTG9hZGVkKCkpCisJICAgICAgICB7CisJICAgICAgICAgIGRlbWFuZExvYWRIZWxwZXIocmVzb3VyY2UpOworCSAgICAgICAgfSAgICAgICAgCisJICAgICAgICByZXR1cm4gcmVzb3VyY2U7CisJICAgICAgfQorCSAgICB9CisJICAgIAorCSAgICBVUklDb252ZXJ0ZXIgdGhlVVJJQ29udmVydGVyID0gZ2V0VVJJQ29udmVydGVyKCk7CisJICAgIFVSSSBub3JtYWxpemVkVVJJID0gdGhlVVJJQ29udmVydGVyLm5vcm1hbGl6ZSh1cmkpOworCSAgICBmb3IgKFJlc291cmNlIHJlc291cmNlIDogZ2V0UmVzb3VyY2VzKCkpCisJICAgIHsKKwkgICAgICBpZiAodGhlVVJJQ29udmVydGVyLm5vcm1hbGl6ZShyZXNvdXJjZS5nZXRVUkkoKSkuZXF1YWxzKG5vcm1hbGl6ZWRVUkkpKQorCSAgICAgIHsKKwkgICAgICAgIGlmIChsb2FkT25EZW1hbmQgJiYgIXJlc291cmNlLmlzTG9hZGVkKCkpCisJICAgICAgICB7CisJICAgICAgICAgIGRlbWFuZExvYWRIZWxwZXIocmVzb3VyY2UpOworCSAgICAgICAgfQorCSAgICAgICAgCisJICAgICAgICBpZiAobWFwICE9IG51bGwpCisJICAgICAgICB7CisJICAgICAgICAgIG1hcC5wdXQodXJpLCByZXNvdXJjZSk7CisJICAgICAgICB9IAorCSAgICAgICAgcmV0dXJuIHJlc291cmNlOworCSAgICAgIH0KKwkgICAgfQorCSAgICAKKwkgICAgUmVzb3VyY2UgZGVsZWdhdGVkUmVzb3VyY2UgPSBkZWxlZ2F0ZWRHZXRSZXNvdXJjZSh1cmksIGxvYWRPbkRlbWFuZCk7CisJICAgIGlmIChkZWxlZ2F0ZWRSZXNvdXJjZSAhPSBudWxsKQorCSAgICB7CisJICAgICAgaWYgKG1hcCAhPSBudWxsKQorCSAgICAgIHsKKwkgICAgICAgIG1hcC5wdXQodXJpLCBkZWxlZ2F0ZWRSZXNvdXJjZSk7CisJICAgICAgfQorCSAgICAgIHJldHVybiBkZWxlZ2F0ZWRSZXNvdXJjZTsKKwkgICAgfQorCisJICAgIGlmIChsb2FkT25EZW1hbmQpCisJICAgIHsKKwkgICAgICBSZXNvdXJjZSByZXNvdXJjZSA9IGRlbWFuZENyZWF0ZVJlc291cmNlKHVyaSxyZXNvdXJjZUZhY3RvcnkpOworCSAgICAgIGlmIChyZXNvdXJjZSA9PSBudWxsKQorCSAgICAgIHsKKwkgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlIGEgcmVzb3VyY2UgZm9yICciICsgdXJpICsgIic7IGEgcmVnaXN0ZXJlZCByZXNvdXJjZSBmYWN0b3J5IGlzIG5lZWRlZCIpOworCSAgICAgIH0KKworCSAgICAgIGRlbWFuZExvYWRIZWxwZXIocmVzb3VyY2UpOworCisJICAgICAgaWYgKG1hcCAhPSBudWxsKQorCSAgICAgIHsKKwkgICAgICAgIG1hcC5wdXQodXJpLCByZXNvdXJjZSk7CisJICAgICAgfSAgICAgIAorCSAgICAgIHJldHVybiByZXNvdXJjZTsKKwkgICAgfQorCisJICAgIHJldHVybiBudWxsOworCSAgCisJfQorCisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXQjcmVzZXROb3JtYWxpemVkVVJJQ2FjaGUoKQorCSAqLworCXB1YmxpYyB2b2lkIHJlc2V0Tm9ybWFsaXplZFVSSUNhY2hlKCkgeworCQlpZiAoZ2V0VVJJUmVzb3VyY2VNYXAoKSAhPSBudWxsKQorCQkJZ2V0VVJJUmVzb3VyY2VNYXAoKS5jbGVhcigpOworCX0KKwkKKwlwcm90ZWN0ZWQgUmVzb3VyY2UgZGVtYW5kQ3JlYXRlUmVzb3VyY2UoVVJJIHVyaSwgRmFjdG9yeSByZXNvdXJjZUZhY3RvcnkpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2UodXJpLHJlc291cmNlRmFjdG9yeSk7CisJfQorCQorCXB1YmxpYyBFTGlzdDxSZXNvdXJjZT4gZ2V0UmVzb3VyY2VzKCkgeworCQkgaWYgKHJlc291cmNlcyA9PSBudWxsKQorCQkgICAgeworCQkgICAgICByZXNvdXJjZXMgPSBuZXcgU3luY2hyb25pemVkUmVzb3VyY2VzRUxpc3Q8UmVzb3VyY2U+KCk7CisJCSAgICB9CisJCSAgICByZXR1cm4gcmVzb3VyY2VzOworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvV29ya3NwYWNlUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9Xb3Jrc3BhY2VSZXNvdXJjZUhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjM0MTIzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvV29ya3NwYWNlUmVzb3VyY2VIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwxNDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogICQkUkNTZmlsZTogV29ya3NwYWNlUmVzb3VyY2VIYW5kbGVyLmphdmEsdiAkJAorICogICQkUmV2aXNpb246IDEuMiAkJCAgJCREYXRlOiAyMDA1LzAyLzE1IDIzOjA0OjE0ICQkIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2g7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5SZXNvdXJjZUhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW47CisKKy8qKgorICogVGhlIG1haW4gcHVycG9zZSBvZiB0aGlzIGNsYXNzIGlzIHRvIHJlZGlyZWN0LCBpZiBuZWNlc3NhcnksIHRvIGFub3RoZXIgCisgKiBSZXNvdXJjZVNldC4gIFRoaXMgY2xhc3Mgc2hvdWxkIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgV29ya2JlbmNoVVJJQ29udmVydGVyCisgKiBzbyB0aGF0IHRoZSBVUklzIHBhc3NlZCB3aWxsIHVzZSB0aGUgcGxhdGZvcm0gcHJvdG9jb2wuICBBbnl0aGluZyBlbHNlIHdpbGwgYmUgY29uc2lkZXJlZAorICogdG8gYmUgYW1iaWd1b3VzIGFuZCB3ZSB3aWxsIG5vdCBiZSBhYmxlIHRvIHJlZGlyZWN0LgorICovCitwdWJsaWMgY2xhc3MgV29ya3NwYWNlUmVzb3VyY2VIYW5kbGVyIGltcGxlbWVudHMgUmVzb3VyY2VIYW5kbGVyIHsKKwkvKioKKwkgKiBDb25zdHJ1Y3RvciBmb3IgV29ya3NwYWNlUmVzb3VyY2VIYW5kbGVyLgorCSAqLworCXB1YmxpYyBXb3Jrc3BhY2VSZXNvdXJjZUhhbmRsZXIoKSB7CisJCXN1cGVyKCk7CisJfQorCS8qCisJKiBAc2VlIElSZXNvdXJjZUhhbmRsZXIjZ2V0UmVzb3VyY2UoUmVzb3VyY2VTZXQsIFVSSSkKKwkqLworCXB1YmxpYyBSZXNvdXJjZSBnZXRSZXNvdXJjZShSZXNvdXJjZVNldCBvcmlnaW5hdGluZ1Jlc291cmNlU2V0LCBVUkkgdXJpKSB7CisJCWlmIChXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuaXNQbGF0Zm9ybVJlc291cmNlVVJJKHVyaSkpCisJCQlyZXR1cm4gZ2V0UmVzb3VyY2VGb3JQbGF0Zm9ybVByb3RvY29sKG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQsIHVyaSk7CisJCVVSSSBtYXBwZWRVUkkgPSAoKFVSSUNvbnZlcnRlckltcGwuVVJJTWFwKW9yaWdpbmF0aW5nUmVzb3VyY2VTZXQuZ2V0VVJJQ29udmVydGVyKCkuZ2V0VVJJTWFwKCkpLmdldFVSSSh1cmkpOworCQlpZiAoaXNHbG9iYWxQbHVnaW5Mb2FkKG1hcHBlZFVSSSkpCisJCQlyZXR1cm4gZ2V0UmVzb3VyY2VGb3JQbGF0Zm9ybVBsdWdpblByb3RvY29sKG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQsIHVyaSk7CisJCXJldHVybiBudWxsOworCX0KKwkvKioKKwkgKiBSZWRpcmVjdCB0byB0aGUgY29ycmVjdCBwcm9qZWN0IGJhc2VkIG9uIHRoZSBwcm9qZWN0IG5hbWUgaW4gdGhlIDxjb2RlPnVyaTwvY29kZT4uCisJICogVGhlIDxjb2RlPnVyaTwvY29kZT4gd2lsbCBiZSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDogICBwbGF0Zm9ybTovcmVzb3VyY2UvW3Byb2plY3QgbmFtZV0uCisJICovCisJcHJvdGVjdGVkIFJlc291cmNlIGNyZWF0ZVJlc291cmNlRm9yUGxhdGZvcm1Qcm90b2NvbChSZXNvdXJjZVNldCBvcmlnaW5hdGluZ1Jlc291cmNlU2V0LCBVUkkgdXJpKSB7CisJCVN0cmluZyBwcm9qZWN0TmFtZSA9IHVyaS5zZWdtZW50KDEpOworCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7CisJCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5pc0FjY2Vzc2libGUoKSkgeworCQkJUmVzb3VyY2VTZXQgc2V0ID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldFJlc291cmNlU2V0KHByb2plY3QpOworCQkJaWYgKG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQgIT0gc2V0KQorCQkJCXJldHVybiBjcmVhdGVSZXNvdXJjZSh1cmksIHNldCk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCS8qKgorCQkgKiBSZWRpcmVjdCB0byB0aGUgY29ycmVjdCBwcm9qZWN0IGJhc2VkIG9uIHRoZSBwcm9qZWN0IG5hbWUgaW4gdGhlIDxjb2RlPnVyaTwvY29kZT4uCisJCSAqIFRoZSA8Y29kZT51cmk8L2NvZGU+IHdpbGwgYmUgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6ICAgcGxhdGZvcm06L3Jlc291cmNlL1twcm9qZWN0IG5hbWVdLgorCQkgKi8KKwlwcm90ZWN0ZWQgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2VGb3JQbGF0Zm9ybVBsdWdpblByb3RvY29sKFJlc291cmNlU2V0IG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQsIFVSSSB1cmkpIHsKKwkJCQorCQlSZXNvdXJjZVNldCBzZXQgPSBKRU1VdGlsUGx1Z2luLmdldFBsdWdpblJlc291cmNlU2V0KCk7CisJCXJldHVybiBjcmVhdGVSZXNvdXJjZSh1cmksIHNldCk7CisJCX0KKwlwcm90ZWN0ZWQgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSwgUmVzb3VyY2VTZXQgcmVkaXJlY3RlZFJlc291cmNlU2V0KSB7CisJCXJldHVybiByZWRpcmVjdGVkUmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UodXJpKTsKKwl9CisJLyoqCisJICogUmVkaXJlY3QgdG8gdGhlIGNvcnJlY3QgcHJvamVjdCBiYXNlZCBvbiB0aGUgZmlyc3Qgc2VnbWVudCBpbiB0aGUgZmlsZSBuYW1lLgorCSAqIFRoaXMgaXMgZm9yIGNvbXBhdGFiaWxpdHkgcHVycG9zZXMgZm9yIHBlb3BsZSB1c2luZyB0aGUgcGxhdGZvcm06L3Jlc291cmNlIHByb3RvY29sLgorCSAqLworCXByb3RlY3RlZCBSZXNvdXJjZSBnZXRSZXNvdXJjZUZvclBsYXRmb3JtUHJvdG9jb2woUmVzb3VyY2VTZXQgb3JpZ2luYXRpbmdSZXNvdXJjZVNldCwgVVJJIHVyaSkgeworCQlTdHJpbmcgcHJvamVjdE5hbWUgPSB1cmkuc2VnbWVudCgxKTsKKwkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QocHJvamVjdE5hbWUpOworCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKKwkJCVJlc291cmNlU2V0IHNldCA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRSZXNvdXJjZVNldChwcm9qZWN0KTsKKwkJCWlmIChvcmlnaW5hdGluZ1Jlc291cmNlU2V0ICE9IHNldCkKKwkJCQlyZXR1cm4gZ2V0UmVzb3VyY2UodXJpLCBzZXQpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKwkvKioKKwkJICogUmVkaXJlY3QgdG8gdGhlIGNvcnJlY3QgcHJvamVjdCBiYXNlZCBvbiB0aGUgZmlyc3Qgc2VnbWVudCBpbiB0aGUgZmlsZSBuYW1lLgorCQkgKiBUaGlzIGlzIGZvciBjb21wYXRhYmlsaXR5IHB1cnBvc2VzIGZvciBwZW9wbGUgdXNpbmcgdGhlIHBsYXRmb3JtOi9yZXNvdXJjZSBwcm90b2NvbC4KKwkJICovCisJcHJvdGVjdGVkIFJlc291cmNlIGdldFJlc291cmNlRm9yUGxhdGZvcm1QbHVnaW5Qcm90b2NvbChSZXNvdXJjZVNldCBvcmlnaW5hdGluZ1Jlc291cmNlU2V0LCBVUkkgdXJpKSB7CisJCQkKKwkJUmVzb3VyY2VTZXQgc2V0ID0gSkVNVXRpbFBsdWdpbi5nZXRQbHVnaW5SZXNvdXJjZVNldCgpOworCQlyZXR1cm4gZ2V0UmVzb3VyY2UodXJpLCBzZXQpOworCQkJCisJfQorCXByb3RlY3RlZCBSZXNvdXJjZSBnZXRSZXNvdXJjZShVUkkgdXJpLCBSZXNvdXJjZVNldCByZWRpcmVjdGVkUmVzb3VyY2VTZXQpIHsKKwkJcmV0dXJuIHJlZGlyZWN0ZWRSZXNvdXJjZVNldC5nZXRSZXNvdXJjZSh1cmksIGZhbHNlKTsKKwl9CisJCisJcHJvdGVjdGVkIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgeworCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOworCX0KKwlwcm90ZWN0ZWQgSVByb2plY3QgZ2V0UHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUpIHsKKwkJSVdvcmtzcGFjZSB3cyA9IGdldFdvcmtzcGFjZSgpOworCQlpZiAod3MgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQlyZXR1cm4gd3MuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOworCX0KKwlwcm90ZWN0ZWQgSVByb2plY3QgZ2V0UHJvamVjdChSZXNvdXJjZVNldCByZXNvdXJjZVNldCkgeworCQlyZXR1cm4gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldFByb2plY3QocmVzb3VyY2VTZXQpOworCX0KKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLlJlc291cmNlSGFuZGxlciNjcmVhdGVSZXNvdXJjZShSZXNvdXJjZVNldCwgVVJJKQorCSAqLworCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShSZXNvdXJjZVNldCBvcmlnaW5hdGluZ1Jlc291cmNlU2V0LCBVUkkgdXJpKSB7CisJCWlmIChXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuaXNQbGF0Zm9ybVJlc291cmNlVVJJKHVyaSkpCisJCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2VGb3JQbGF0Zm9ybVByb3RvY29sKG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQsIHVyaSk7CisJCVVSSSBtYXBwZWRVUkkgPSAoKFVSSUNvbnZlcnRlckltcGwuVVJJTWFwKW9yaWdpbmF0aW5nUmVzb3VyY2VTZXQuZ2V0VVJJQ29udmVydGVyKCkuZ2V0VVJJTWFwKCkpLmdldFVSSSh1cmkpOworCQlpZiAoaXNHbG9iYWxQbHVnaW5Mb2FkKG1hcHBlZFVSSSkpCisJCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2VGb3JQbGF0Zm9ybVBsdWdpblByb3RvY29sKG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQsIHVyaSk7CisJCXJldHVybiBudWxsOworCX0KKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLlJlc291cmNlSGFuZGxlciNnZXRFT2JqZWN0RmFpbGVkKFJlc291cmNlU2V0LCBVUkksIGJvb2xlYW4pCisJICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUuCisJICovCisJcHVibGljIEVPYmplY3QgZ2V0RU9iamVjdEZhaWxlZChSZXNvdXJjZVNldCBvcmlnaW5hdGluZ1Jlc291cmNlU2V0LCBVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNHbG9iYWxQbHVnaW5Mb2FkKFVSSSBhVVJJKSB7CisJCWlmIChXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuaXNQbGF0Zm9ybVBsdWdpblJlc291cmNlVVJJKGFVUkkpKSB7CisJCQlTdHJpbmdbXSBnbG9iYWxQbHVnaW5zID0gSkVNVXRpbFBsdWdpbi5nZXRHbG9iYWxMb2FkaW5nUGx1Z2luTmFtZXMoKTsKKwkJCWZvciAoaW50IGk9MDtpPGdsb2JhbFBsdWdpbnMubGVuZ3RoO2krKykgeworCQkJCWlmIChhVVJJLnNlZ21lbnQoMSkuc3RhcnRzV2l0aChnbG9iYWxQbHVnaW5zW2ldKSkKKwkJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdXRpbC9lbWYvd29ya2JlbmNoL1dvcmtzcGFjZVJlc291cmNlTm90aWZpZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdXRpbC9lbWYvd29ya2JlbmNoL1dvcmtzcGFjZVJlc291cmNlTm90aWZpZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzEwYWZlCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvV29ya3NwYWNlUmVzb3VyY2VOb3RpZmllci5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogICQkUkNTZmlsZTogV29ya3NwYWNlUmVzb3VyY2VOb3RpZmllci5qYXZhLHYgJCQKKyAqICAkJFJldmlzaW9uOiAxLjIgJCQgICQkRGF0ZTogMjAwNS8wMi8xNSAyMzowNDoxNCAkJCAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoOworCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpZXJJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXQ7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGNhcHR1cmUgYWxsIEFERCBhbmQgUkVNT1ZFIG5vdGlmaWNhdGlvbnMgZnJvbSBlYWNoIFByb2plY3RSZXNvdXJjZVNldAorICogYW5kIGZvcndhcmQgaXQgb24gdG8gYW55IGludGVycmVzdGVkIGxpc3RlbmVycy4gIFRoaXMgaXMgdG8gYWxsb3cgeW91IHRvIGxpc3RlbiB0byBvbmUgb2JqZWN0CisgKiB0byBnYWluIGFsbCBBREQgYW5kIFJFTU9WRSBub3RpZmljYXRpb25zIGZvciBlYWNoIFJlc291cmNlU2V0IHdpdGhpbiB0aGUgc3lzdGVtLgorICovCitwdWJsaWMgY2xhc3MgV29ya3NwYWNlUmVzb3VyY2VOb3RpZmllciBleHRlbmRzIE5vdGlmaWVySW1wbCB7CisJcHJvdGVjdGVkIEFkYXB0ZXIgcHJvamVjdEFkYXB0ZXIgPSBuZXcgV29ya3NwYWNlUmVzb3VyY2VDYWNoZUFkYXB0ZXIoKTsKKworCWNsYXNzIFdvcmtzcGFjZVJlc291cmNlQ2FjaGVBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgeworCQkvKioKKwkJICogRm9yd2FyZCBBREQgYW5kIFJFTU9WRSBub3RpZmljYXRpb24uCisJCSAqLworCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKKwkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7CisJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREIDoKKwkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWSA6CisJCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFIDoKKwkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWSA6CisJCQkJCWVOb3RpZnkobXNnKTsKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvciBmb3IgV29ya3NwYWNlUmVzb3VyY2VDYWNoZS4KKwkgKi8KKwlwdWJsaWMgV29ya3NwYWNlUmVzb3VyY2VOb3RpZmllcigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBCZWdpbiBsaXN0ZW5pbmcgdG8gYSBQcm9qZWN0UmVzb3VyY2VTZXQuCisJICovCisJcHVibGljIHZvaWQgYmVnaW5MaXN0ZW5pbmcoUHJvamVjdFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCkgeworCQlpZiAoYVJlc291cmNlU2V0ICE9IG51bGwpIHsgCisJCQlpZiAoYVJlc291cmNlU2V0LmVBZGFwdGVycygpID09IG51bGwgfHwgIAorCQkJIWFSZXNvdXJjZVNldC5lQWRhcHRlcnMoKS5jb250YWlucyhwcm9qZWN0QWRhcHRlcikpCisJCQlhUmVzb3VyY2VTZXQuZUFkYXB0ZXJzKCkuYWRkKHByb2plY3RBZGFwdGVyKTsKKwkJfQorCX0KKwkvKioKKwkgKiBTdG9wIGxpc3RlbmluZyB0byBhIFByb2plY3RSZXNvdXJjZVNldC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzdG9wTGlzdGVuaW5nKFByb2plY3RSZXNvdXJjZVNldCBhUmVzb3VyY2VTZXQpIHsKKwkJaWYgKGFSZXNvdXJjZVNldCAhPSBudWxsKQorCQkJYVJlc291cmNlU2V0LmVBZGFwdGVycygpLnJlbW92ZShwcm9qZWN0QWRhcHRlcik7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvbmF0dXJlL0VNRk5hdHVyZVJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9uYXR1cmUvRU1GTmF0dXJlUmVnaXN0cnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODVmN2IwCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvbmF0dXJlL0VNRk5hdHVyZVJlZ2lzdHJ5LmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiAgJCRSQ1NmaWxlOiBFTUZOYXR1cmVSZWdpc3RyeS5qYXZhLHYgJCQKKyAqICAkJFJldmlzaW9uOiAxLjIgJCQgICQkRGF0ZTogMjAwNS8wMi8xNSAyMzowNDoxNCAkJCAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLm5hdHVyZTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5ubHMuRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7CisKK3B1YmxpYyBjbGFzcyBFTUZOYXR1cmVSZWdpc3RyeSB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFUVVJFX1JFR0lTVFJBVElPTl9QT0lOVCA9ICJvcmcuZWNsaXBzZS5qZW0udXRpbC5uYXR1cmVfcmVnaXN0cmF0aW9uIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQVRVUkUgID0gIm5hdHVyZSI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVElDX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQ29uc3RydWN0b3IKKwkgKi8KKwlwcml2YXRlIEVNRk5hdHVyZVJlZ2lzdHJ5KCkgeworCQlzdXBlcigpOworCQlyZWFkUmVnaXN0cnkoKTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgRU1GTmF0dXJlUmVnaXN0cnkgc2luZ2xldG9uOworCQorCXB1YmxpYyBmaW5hbCBTZXQgUkVHSVNURVJFRF9OQVRVUkVfSURTID0gbmV3IEhhc2hTZXQoKTsKKwkKKwlwdWJsaWMgc3RhdGljIEVNRk5hdHVyZVJlZ2lzdHJ5IHNpbmdsZXRvbigpIHsKKwkJaWYgKHNpbmdsZXRvbiA9PSBudWxsKQorCQkJc2luZ2xldG9uID0gbmV3IEVNRk5hdHVyZVJlZ2lzdHJ5KCk7CisJCXJldHVybiBzaW5nbGV0b247CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHJlYWRSZWdpc3RyeSgpIHsKKwkvLyByZWdpc3RlciBOYXR1cmUgSURzIGZvciB0aGUgSjJFRU5hdHVyZXMKKwkJSUV4dGVuc2lvblJlZ2lzdHJ5IHIgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOworCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjZSA9IHIuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKE5BVFVSRV9SRUdJU1RSQVRJT05fUE9JTlQpOworCQlTdHJpbmcgbmF0dXJlSWQ7CisJCWZvciAoaW50IGk9MDsgaTxjZS5sZW5ndGg7IGkrKykgeworCQkJaWYgKGNlW2ldLmdldE5hbWUoKS5lcXVhbHMoTkFUVVJFKSkgeworCQkJCW5hdHVyZUlkID0gY2VbaV0uZ2V0QXR0cmlidXRlKFNUQVRJQ19JRCk7CisJCQkJaWYgKG5hdHVyZUlkICE9IG51bGwpCisJCQkJCXJlZ2lzdGVyTmF0dXJlSUQobmF0dXJlSWQpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogQHBhcmFtIG5hdHVyZUlkCisJICovCisJcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyTmF0dXJlSUQoU3RyaW5nIG5hdHVyZUlkKSB7CisJCWlmICghUkVHSVNURVJFRF9OQVRVUkVfSURTLmNvbnRhaW5zKG5hdHVyZUlkKSkKKwkJCVJFR0lTVEVSRURfTkFUVVJFX0lEUy5hZGQobmF0dXJlSWQpOworCQllbHNlCisJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRU1GTmF0dXJlUmVnaXN0cnlfRVJST1JfMCIsIG5ldyBPYmplY3RbXSB7bmF0dXJlSWR9KSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdXRpbC9lbWYvd29ya2JlbmNoL25scy9FTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvdXRpbC9lbWYvd29ya2JlbmNoL25scy9FTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWE4ZTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvbmxzL0VNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogICQkUkNTZmlsZTogRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyLmphdmEsdiAkJAorICogICQkUmV2aXNpb246IDEuMiAkJCAgJCREYXRlOiAyMDA1LzAyLzE1IDIzOjA0OjE0ICQkIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2gubmxzOworCitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CisKK3B1YmxpYyBjbGFzcyBFTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXIgeworCisJcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZmdSZXNvdXJjZUJ1bmRsZTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc291cmNlIGJ1bmRsZSB1c2VkIGJ5IGFsbCBjbGFzc2VzIGluIHRoaXMgUHJvamVjdAorCSAqLworCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7CisJCXRyeSB7CisJCQlyZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJlbWZ3b3JrYmVuY2giKTsvLyROT04tTkxTLTEkCisJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisJCQkvLyBkb2VzIG5vdGhpbmcgLSB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBudWxsIGFuZAorCQkJLy8gZ2V0U3RyaW5nKFN0cmluZywgU3RyaW5nKSB3aWxsIHJldHVybiB0aGUga2V5CisJCQkvLyBpdCB3YXMgY2FsbGVkIHdpdGgKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKKwkJaWYgKGZnUmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkgeworCQkJZmdSZXNvdXJjZUJ1bmRsZT0gZ2V0UmVzb3VyY2VCdW5kbGUoKTsKKwkJfQorCQkKKwkJaWYgKGZnUmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgeworCQkJdHJ5IHsKKwkJCQlyZXR1cm4gZmdSZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKKwkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisJCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9IGVsc2UgeworCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAorCQl9CisJfQorcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKKworCXRyeSB7cmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBhcmdzKTt9CisJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7cmV0dXJuIGdldFN0cmluZyhrZXkpO30KKworfQorcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MsIGludCB4KSB7CisKKwkJcmV0dXJuIGdldFN0cmluZyhrZXkpOworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9DaGFyYWN0ZXJVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvQ2hhcmFjdGVyVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NTJiMDEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvQ2hhcmFjdGVyVXRpbC5qYXZhCkBAIC0wLDAgKzEsMjc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorCisKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCitpbXBvcnQgY29tLmlibS5pY3UudGV4dC5VVEYxNjsKKyAKKworLyoqCisgKiBTdGF0aWMgaGVscGVyIHRvIGhhbmRsZSBjaGFyYWN0ZXJzIGluIHRoZSBuZXcgVVRGIG11bHRpLWNoYXIgZm9ybWF0LgorICogSXQgaXMgbmVlZGVkIGJlY2F1c2UgSUNVNEogY3VycmVudGx5IGRvZXNuJ3QgaGFuZGxlIHNvbWUgY29ycmVjdGx5IHlldCB0aGF0IHdlCisgKiBuZWVkIHRvIGhhdmUgd29ya2luZy4gQXMgSUNVNEogZ2V0cyB0aGVtIHdvcmtpbmcsIHRoZSBtZXRob2RzIGhlcmUgd2lsbCBiZWNvbWUKKyAqIGRlcHJlY2F0ZWQuCisgKiAKKyAqIEBzaW5jZSAxLjIuMAorICovCitwdWJsaWMgY2xhc3MgQ2hhcmFjdGVyVXRpbCB7CisKKwlwcml2YXRlIENoYXJhY3RlclV0aWwoKSB7CisJCQorCX0KKwkKKwkKKwkvKioKKwkgKiBUT0RPIFNvIHVudGlsIElDVTRKIGRvZXMgd29yayBjb3JyZWN0bHkgdGhpcyB1dGlsIHdpbGwgYmUgbmVlZGVkLiBJdCB3aWxsCisJICogc3RheSBhcm91bmQgYmVjYXVzZSBpdCBpcyBBUEksIGJ1dCBhdCB0aGF0IHRpbWUgaXQgd2lsbCBiZSBtYXJrZWQgZGVwcmVjYXRlZC4gSXQgc2hvdWxkCisJICogYWxzbyB0aGVuIHJlcm91dGUgdG8gSUNVNEogaW5zdGVhZCBvZiBkb2luZyB0aGUgbWV0aG9kIHJlZmxlY3Rpb25zLgorCSAqLworCXByaXZhdGUgc3RhdGljIE1ldGhvZCBNRVRIT0RfSkFWQV9JREVOVElGSUVSX1NUQVJULCBNRVRIT0RfSkFWQV9JREVOVElGSUVSX1BBUlQ7CisJCisJc3RhdGljIHsKKwkJLy8gVHJ5IHRvIGdldCB0aGUgQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXIoaW50KSBtZXRob2QuIElmIHRoZXJlLCB0aGVuIHdlIGFyZSBpbiAxLjUgb3IgYWJvdmUuIEVsc2UgdXNlIHRoZSBjaGFyIGZvcm0uCisJCXRyeSB7CisJCQlNRVRIT0RfSkFWQV9JREVOVElGSUVSX1NUQVJUID0gQ2hhcmFjdGVyLmNsYXNzLmdldE1ldGhvZCgiaXNKYXZhSWRlbnRpZmllclN0YXJ0IiwgbmV3IENsYXNzW10ge0ludGVnZXIuVFlQRX0pOworCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisJCQkvLyBEZWZhdWx0IHRvIHVzZSAoY2hhcikgdHlwZSBpbnN0ZWFkLgorCQkJTUVUSE9EX0pBVkFfSURFTlRJRklFUl9TVEFSVCA9IG51bGw7CisJCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisJCQkvLyBEZWZhdWx0IHRvIHVzZSAoY2hhcikgdHlwZSBpbnN0ZWFkLgorCQkJTUVUSE9EX0pBVkFfSURFTlRJRklFUl9TVEFSVCA9IG51bGw7CisJCX0KKwkJdHJ5IHsKKwkJCU1FVEhPRF9KQVZBX0lERU5USUZJRVJfUEFSVCA9IENoYXJhY3Rlci5jbGFzcy5nZXRNZXRob2QoImlzSmF2YUlkZW50aWZpZXJQYXJ0IiwgbmV3IENsYXNzW10ge0ludGVnZXIuVFlQRX0pOworCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisJCQkvLyBEZWZhdWx0IHRvIHVzZSAoY2hhcikgdHlwZSBpbnN0ZWFkLgorCQkJTUVUSE9EX0pBVkFfSURFTlRJRklFUl9QQVJUID0gbnVsbDsKKwkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKwkJCS8vIERlZmF1bHQgdG8gdXNlIChjaGFyKSB0eXBlIGluc3RlYWQuCisJCQlNRVRIT0RfSkFWQV9JREVOVElGSUVSX1BBUlQgPSBudWxsOworCQl9CQkKKwl9CisKKwkvKioKKwkgKiBJcyBzdGFydCBvZiBqYXZhIGlkZW50aWZpZXIKKwkgKiBAcGFyYW0gaW50Q2hhciBpbnQgY2hhcmFjdGVyIChVVEYgbXVsdGktY2hhciBpcyB2YWxpZCkKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHN0YXJ0IG9mIGphdmEgaWRlbnRpZmllci4KKwkgKiAKKwkgKiBAc2VlIENoYXJhY3RlciNpc0phdmFJZGVudGlmaWVyU3RhcnQoY2hhcikKKwkgKiBAc2luY2UgMS4yLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKYXZhSWRlbnRpZmllclN0YXJ0KGludCBpbnRDaGFyKSB7CisJCWlmIChNRVRIT0RfSkFWQV9JREVOVElGSUVSX1NUQVJUICE9IG51bGwpIHsKKwkJCXRyeSB7CisJCQkJcmV0dXJuICgoQm9vbGVhbikgTUVUSE9EX0pBVkFfSURFTlRJRklFUl9TVEFSVC5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtdIHtuZXcgSW50ZWdlcihpbnRDaGFyKX0pKS5ib29sZWFuVmFsdWUoKTsKKwkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisJCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKwkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworCQkJfQorCQl9CisJCXJldHVybiBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KChjaGFyKSBpbnRDaGFyKTsKKwl9CisJCisJLyoqCisJICogSXMgc3RhcnQgb2YgamF2YSBpZGVudGlmaWVyCisJICogQHBhcmFtIGludENoYXIgaW50IGNoYXJhY3RlciAoVVRGIG11bHRpLWNoYXIgaXMgdmFsaWQpCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBzdGFydCBvZiBqYXZhIGlkZW50aWZpZXIuCisJICogCisJICogQHNlZSBDaGFyYWN0ZXIjaXNKYXZhSWRlbnRpZmllclN0YXJ0KGNoYXIpCisJICogQHNpbmNlIDEuMi4wCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YUlkZW50aWZpZXJQYXJ0KGludCBpbnRDaGFyKSB7CisJCWlmIChNRVRIT0RfSkFWQV9JREVOVElGSUVSX1BBUlQgIT0gbnVsbCkgeworCQkJdHJ5IHsKKwkJCQlyZXR1cm4gKChCb29sZWFuKSBNRVRIT0RfSkFWQV9JREVOVElGSUVSX1BBUlQuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXSB7bmV3IEludGVnZXIoaW50Q2hhcil9KSkuYm9vbGVhblZhbHVlKCk7CisJCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKwkJCX0KKwkJfQorCQlyZXR1cm4gQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KChjaGFyKSBpbnRDaGFyKTsKKwl9CisJCisJcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENoYXJJdGVyYXRvciB7CisKKwkJCisJCXByb3RlY3RlZCBmaW5hbCBDaGFyU2VxdWVuY2UgY2hhclNlcTsKKwkJcHJpdmF0ZSBpbnQgcG9zID0gMDsKKwkJcHJpdmF0ZSBpbnQgbGFzdENoYXJJbmRleCA9IDA7CisKKwkJLyoqCisJCSAqIENyZWF0ZSB3aXRoIGEgc3RyaW5nLgorCQkgKiBAcGFyYW0gY2hhclNlcQorCQkgKiAKKwkJICogQHNpbmNlIDEuMi4wCisJCSAqLworCQlwdWJsaWMgQWJzdHJhY3RDaGFySXRlcmF0b3IoQ2hhclNlcXVlbmNlIGNoYXJTZXEpIHsKKwkJCXRoaXMuY2hhclNlcSA9IGNoYXJTZXE7CisJCX0KKwkJCisJCS8qKgorCQkgKiBTZXQgdGhlIG5leHQgY2hhciBpbmRleC4KKwkJICogQHBhcmFtIGluZGV4CisJCSAqIAorCQkgKiBAc2luY2UgMS4yLjAKKwkJICovCisJCXB1YmxpYyB2b2lkIHNldEluZGV4KGludCBpbmRleCkgeworCQkJcG9zID0gaW5kZXg7CisJCX0KKworCQkvKioKKwkJICogSGFzIGFub3RoZXIgY2hhci4KKwkJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBpcyBhbm90aGVyIGNoYXIgdG8gcmV0dXJuLgorCQkgKiAKKwkJICogQHNpbmNlIDEuMi4wCisJCSAqLworCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworCQkJcmV0dXJuIHBvcyA8IGNoYXJTZXEubGVuZ3RoKCk7CisJCX0KKwkJCisJCS8qKgorCQkgKiBIYXMgYW5vdGhlciBjaGFyIGJlZm9yZSB0aGUgY3VycmVudCBwb3NpdGlvbi4gRG9pbmcgcHJldmlvdXMKKwkJICogd2lsbCByZXR1cm4gdGhlIGNoYXIgdGhhdCB3YXMganVzdCByZXR1cm5lZC4KKwkJICogQHJldHVybgorCQkgKiAKKwkJICogQHNpbmNlIDEuMi4wCisJCSAqLworCQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKKwkJCXJldHVybiBwb3MgPiAwOworCQl9CisJCQorCQkvKioKKwkJICogUmV0dXJuIG5leHQgY2hhciBmcm9tIHRoZSBvbmUgdGhhdCB3YXMganVzdCByZXR1cm5lZC4KKwkJICogQHJldHVybiBuZXh0IGNoYXIuCisJCSAqIAorCQkgKiBAc2luY2UgMS4yLjAKKwkJICovCisJCXB1YmxpYyBpbnQgbmV4dCgpIHsKKwkJCWlmICghaGFzTmV4dCgpKQorCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKwkJCQorCQkJaW50IG5leHQgPSB1dGZDaGFyQXQocG9zKTsKKwkJCWxhc3RDaGFySW5kZXggPSBwb3M7CisJCQlwb3MgKz0gVVRGMTYuZ2V0Q2hhckNvdW50KG5leHQpOworCQkJcmV0dXJuIG5leHQ7CisJCX0KKwkJCisJCS8qKgorCQkgKiBSZXR1cm4gdGhlIFVURi0zMiBjaGFyIGF0IHRoZSBnaXZlbiBwb3NpdGlvbi4KKwkJICogQHBhcmFtIHBvcworCQkgKiBAcmV0dXJuCisJCSAqIAorCQkgKiBAc2luY2UgMS4yLjAKKwkJICovCisJCXByb3RlY3RlZCBhYnN0cmFjdCBpbnQgdXRmQ2hhckF0KGludCBwb3MpOworCQkKKwkJLyoqCisJCSAqIFJldHVybiB0aGUgcHJldmlvdXMgY2hhcmFjdGVyIGZyb20gdGhlIG9uZSB0aGF0IHdhcyBqdXN0IHJldHVybmVkLgorCQkgKiBAcmV0dXJuCisJCSAqIAorCQkgKiBAc2luY2UgMS4yLjAKKwkJICovCisJCXB1YmxpYyBpbnQgcHJldmlvdXMoKSB7CisJCQlpZiAoIWhhc1ByZXZpb3VzKCkpCisJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworCisJCQlpbnQgbmV4dDsKKwkJCWlmIChVVEYxNi5pc1RyYWlsU3Vycm9nYXRlKGNoYXJTZXEuY2hhckF0KC0tcG9zKSkpIHsKKwkJCQlpZiAocG9zID4gMCkKKwkJCQkJbmV4dCA9IHV0ZkNoYXJBdCgtLXBvcyk7CisJCQkJZWxzZQorCQkJCQluZXh0ID0gY2hhclNlcS5jaGFyQXQocG9zKTsKKwkJCX0gZWxzZSB7CisJCQkJbmV4dCA9IGNoYXJTZXEuY2hhckF0KHBvcyk7CisJCQl9CisJCQlsYXN0Q2hhckluZGV4ID0gcG9zOworCQkJcmV0dXJuIG5leHQ7CisJCX0KKwkJCisJCS8qKgorCQkgKiBSZXR1cm4gdGhlIFVURjE2IGNoYXJhY3RlciBwb3NpdGlvbiBvZiB0aGUgY2hhciB0aGF0IHdhcyBqdXN0IHJldHVybmVkIGZyb20gZWl0aGVyCisJCSAqIHByZXZpb3VzIG9yIG5leHQuCisJCSAqIFRoaXMgaXMgdGhlIChjaGFyKSBwb3NpdGlvbiBub3QgdGhlCisJCSAqIHBvc2l0aW9uIG9mIGxvZ2ljYWwgaW50IGNoYXJzIHJldHVybmVkLiBGb3IgZXhhbXBsZSBhIHN0YW5kYXJkIHN0cmluZyBvZgorCQkgKiA8Y29kZT4iYWJjIjwvY29kZT4gdGhlIHBvc2l0aW9uIG9mIHRoZSBjaGFyICdiJyBpcyAxLiBCdXQgdGFrZSB0aGUgc3RyaW5nCisJCSAqIDxjb2RlPiJhYjFiMmMiPC9jb2RlPiB3aGVyZSAiYjFiMiIgaXMgb25lIFVURi0zMiBjaGFyLCB0aGVuIHRoZSBwb3NpdGlvbgorCQkgKiBvZiAnYycgaXMgMy4gSXQgd291bGQgbm90IGJlIDIsIHdoaWNoIGlzIHdoYXQgdGhlIGxvZ2ljYWwgY2hhciBwb3NpdGlvbgorCQkgKiB3b3VsZCBiZSBpZiB0YWtpbmcgVUZUMzIgaW50byBhY2NvdW50LgorCQkgKiBAcmV0dXJuCisJCSAqIAorCQkgKiBAc2luY2UgMS4yLjAKKwkJICovCisJCXB1YmxpYyBpbnQgZ2V0UG9zaXRpb24oKSB7CisJCQlyZXR1cm4gbGFzdENoYXJJbmRleDsKKwkJfQorCQorCX0KKwkKKwkvKioKKwkgKiBTcGVjaWFsIGNoYXIgaXRlcmF0b3IgdGhhdCByZXR1cm5zIGludHMgaW5zdGVhZCBvZiBjaGFycyBmb3IKKwkgKiB3YWxraW5nIHN0cmluZ3MgdGhhdCBjYW4gY29udGFpbiBVVEYgbXVsdGktY2hhcnMuIFRoaXMgaXMKKwkgKiBhIGxpbWl0ZWQgdmVyc2lvbiBvZiB7QGxpbmsgamF2YS50ZXh0LkNoYXJhY3Rlckl0ZXJhdG9yfS4KKwkgKiAKKwkgKiBAc2luY2UgMS4yLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGNsYXNzIFN0cmluZ0l0ZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RDaGFySXRlcmF0b3IgeworCQkKKworCQkvKioKKwkJICogQ3JlYXRlIHdpdGggYSBzdHJpbmcuCisJCSAqIEBwYXJhbSBzdHIKKwkJICogCisJCSAqIEBzaW5jZSAxLjIuMAorCQkgKi8KKwkJcHVibGljIFN0cmluZ0l0ZXJhdG9yKFN0cmluZyBzdHIpIHsKKwkJCXN1cGVyKHN0cik7CisJCX0KKwkJCisJCS8qIChub24tSmF2YWRvYykKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5DaGFyYWN0ZXJVdGlsLkFic3RyYWN0Q2hhckl0ZXJhdG9yI3V0ZkNoYXJBdChpbnQpCisJCSAqLworCQlwcm90ZWN0ZWQgaW50IHV0ZkNoYXJBdChpbnQgcG9zKSB7CisJCQlyZXR1cm4gVVRGMTYuY2hhckF0KChTdHJpbmcpIGNoYXJTZXEsIHBvcyk7CisJCX0KKwkJCisJfQorCQorCS8qKgorCSAqIFNwZWNpYWwgY2hhciBpdGVyYXRvciB0aGF0IHJldHVybnMgaW50cyBpbnN0ZWFkIG9mIGNoYXJzIGZvcgorCSAqIHdhbGtpbmcgc3RyaW5ncyB0aGF0IGNhbiBjb250YWluIFVURiBtdWx0aS1jaGFycy4gVGhpcyBpcworCSAqIGEgbGltaXRlZCB2ZXJzaW9uIG9mIHtAbGluayBqYXZhLnRleHQuQ2hhcmFjdGVySXRlcmF0b3J9LgorCSAqIAorCSAqIEBzaW5jZSAxLjIuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgU3RyaW5nQnVmZmVySXRlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdENoYXJJdGVyYXRvciB7CisJCQorCisJCS8qKgorCQkgKiBDcmVhdGUgd2l0aCBhIHN0cmluZy4KKwkJICogQHBhcmFtIHN0ckJ1ZmZlcgorCQkgKiAKKwkJICogQHNpbmNlIDEuMi4wCisJCSAqLworCQlwdWJsaWMgU3RyaW5nQnVmZmVySXRlcmF0b3IoU3RyaW5nQnVmZmVyIHN0ckJ1ZmZlcikgeworCQkJc3VwZXIoc3RyQnVmZmVyKTsKKwkJfQorCQkKKwkJLyogKG5vbi1KYXZhZG9jKQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLkNoYXJhY3RlclV0aWwuQWJzdHJhY3RDaGFySXRlcmF0b3IjdXRmQ2hhckF0KGludCkKKwkJICovCisJCXByb3RlY3RlZCBpbnQgdXRmQ2hhckF0KGludCBwb3MpIHsKKwkJCXJldHVybiBVVEYxNi5jaGFyQXQoKFN0cmluZ0J1ZmZlcikgY2hhclNlcSwgcG9zKTsKKwkJfQorCQkKKwl9CQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL05vdFByZXNlbnRQZXJmb3JtYW5jZU1vbml0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9Ob3RQcmVzZW50UGVyZm9ybWFuY2VNb25pdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRhZjJiZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9Ob3RQcmVzZW50UGVyZm9ybWFuY2VNb25pdG9yLmphdmEKQEAgLTAsMCArMSw1NSBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbDsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogICQkUkNTZmlsZTogTm90UHJlc2VudFBlcmZvcm1hbmNlTW9uaXRvci5qYXZhLHYgJCQKKyAqICAkJFJldmlzaW9uOiAxLjMgJCQgICQkRGF0ZTogMjAwNS8wMi8xNSAyMzowNDoxNCAkJCAKKyAqLworLyoqCisgKiBUaGlzIGlzIHRoZSBpbnN0YW50aWF0aW9uIHRvIHVzZSBpZiB0aGUgcGVyZm9ybWFuY2UgbW9uaXRvciBwbHVnaW4gaXMgbm90IGluc3RhbGxlZC4gSXQgYmFzaWNhbGx5IGRvZXMgbm90aGluZy4KKyAqIAorICogPHA+CisgKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KKyAqIDwvcD4KKyAqIAorICogQHNpbmNlIDEuMC4wCisgKi8KK3B1YmxpYyBjbGFzcyBOb3RQcmVzZW50UGVyZm9ybWFuY2VNb25pdG9yIGV4dGVuZHMgUGVyZm9ybWFuY2VNb25pdG9yVXRpbCB7CisKKwkvKgorCSAqIE9ubHkgaW5zdGFudGlhdGVkIGZyb20gdGhpcyBwYWNrYWdlLgorCSAqLworCU5vdFByZXNlbnRQZXJmb3JtYW5jZU1vbml0b3IoKSB7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5QZXJmb3JtYW5jZU1vbml0b3JVdGlsI3NldFZhcihqYXZhLmxhbmcuU3RyaW5nKQorCSAqLworCXB1YmxpYyB2b2lkIHNldFZhcihTdHJpbmcgdmFyKSB7CisJfQorCisJLyoKKwkgKiAgKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuUGVyZm9ybWFuY2VNb25pdG9yVXRpbCNkb1NuYXBzaG90KGludCwgaW50KQorCSAqLworCXByb3RlY3RlZCB2b2lkIGRvU25hcHNob3QoaW50IHN0ZXAsIGludCB0eXBlcykgeworCX0KKworCisJLyoKKwkgKiAgKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuUGVyZm9ybWFuY2VNb25pdG9yVXRpbCNkb1NuYXBzaG90KGludCkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBkb1NuYXBzaG90KGludCBzdGVwKSB7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9QZXJmb3JtYW5jZU1vbml0b3JVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvUGVyZm9ybWFuY2VNb25pdG9yVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZjNhMWIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvUGVyZm9ybWFuY2VNb25pdG9yVXRpbC5qYXZhCkBAIC0wLDAgKzEsMjgwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorCisKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbDsKK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuSVBlcmZvcm1hbmNlTW9uaXRvcjsKKworLyoqCisgKiBUaGlzIGlzIGEgc2ltcGxpZmllZCB3cmFwcGVyIHRvIHRoZSBJUGVyZm9ybWFuY2VNb25pdG9yIHRoYXQgaGlkZXMgaXQgc28gdGhhdCB0aGUgYWN0dWFsIHBsdWdpbiBjYW4gYmUgb3B0aW9uYWwgYW5kIG5vdCByZXF1aXJlZC4KKyAqIAorICogPHA+CisgKiBUaGlzIGNsYXNzIGlzIG5vdCBtZWFudCB0byBiZSBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCisgKiA8L3A+CisgKiAKKyAqIEBzaW5jZSAxLjAuMAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGVyZm9ybWFuY2VNb25pdG9yVXRpbCB7CisJLyoqCisJICogRXZlbnQgZm9yIFBlcmZvcm1hbmNlTGlzdGVuZXIgbm90aWZpY2F0aW9uLgorCSAqIAorCSAqIEBzaW5jZSAxLjEuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgY2xhc3MgUGVyZm9ybWFuY2VFdmVudCBleHRlbmRzIEV2ZW50T2JqZWN0IHsKKwkJCisJCS8qKgorCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgorCQkgKiAKKwkJICogQHNpbmNlIDEuMS4wCisJCSAqLworCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDY4MDA3MTQ2Mjc1MDE4MDMzOUw7CisKKwkJUGVyZm9ybWFuY2VFdmVudChPYmplY3Qgc291cmNlLCBpbnQgc3RlcCkgeworCQkJc3VwZXIoc291cmNlKTsKKwkJCXNuYXBzaG93V2l0aFR5cGVzID0gZmFsc2U7CisJCQl0aGlzLnN0ZXAgPSBzdGVwOworCQkJdGhpcy50eXBlcyA9IDA7CS8vIE5vdCBzZXQuCisJCX0KKwkJCisJCVBlcmZvcm1hbmNlRXZlbnQoT2JqZWN0IHNvdXJjZSwgaW50IHN0ZXAsIGludCB0eXBlcykgeworCQkJc3VwZXIoc291cmNlKTsKKwkJCXNuYXBzaG93V2l0aFR5cGVzID0gdHJ1ZTsKKwkJCXRoaXMuc3RlcCA9IHN0ZXA7CisJCQl0aGlzLnR5cGVzID0gdHlwZXM7CisJCX0KKworCQkKKwkJLyoqCisJCSAqIFNuYXBzaG90IHdpdGggdHlwZXMgaWYgPGNvZGU+dHJ1ZTwvY29kZT4uCisJCSAqIEBzaW5jZSAxLjEuMAorCQkgKi8KKwkJcHVibGljIGZpbmFsIGJvb2xlYW4gc25hcHNob3dXaXRoVHlwZXM7CisKKwkJLyoqCisJCSAqIFN0ZXAgb2Ygc25hcHNob3QKKwkJICogQHNpbmNlIDEuMS4wCisJCSAqLworCQlwdWJsaWMgZmluYWwgaW50IHN0ZXA7CisJCQorCQkvKioKKwkJICogdHlwZXMgb2Ygc25hcHNob3QuCisJCSAqIEBzaW5jZSAxLjEuMAorCQkgKi8KKwkJcHVibGljIGZpbmFsIGludCB0eXBlczsKKwl9CisJCisJLyoqCisJICogUGVyZm9ybWFuY2UgTGlzdGVuZXIgaW50ZXJmYWNlCisJICogCisJICogQHNpbmNlIDEuMS4wCisJICovCisJcHVibGljIGludGVyZmFjZSBQZXJmb3JtYW5jZUxpc3RlbmVyIHsKKwkJLyoqCisJCSAqIFNuYXBzaG90IHdhcyBjYWxsZWQuCisJCSAqIEBwYXJhbSBldmVudAorCQkgKiAKKwkJICogQHNpbmNlIDEuMS4wCisJCSAqLworCQlwdWJsaWMgdm9pZCBzbmFwc2hvdChQZXJmb3JtYW5jZUV2ZW50IGV2ZW50KTsKKwl9CisJCisJcHJpdmF0ZSBQZXJmb3JtYW5jZUxpc3RlbmVyW10gbGlzdGVuZXJzOworCisJcHVibGljIGludGVyZmFjZSBUeXBlcyB7CisKKwkJLyoqCisJCSAqIDEgLSBXcml0ZSBvdXQgdGhlIHBlcmZvcm1hbmNlIGNvdW50ZXJzIGZyb20gdGhlIG9wZXJhdGluZyBzeXN0ZW0uIFRoZXNlIGluY2x1ZGUgd29ya2luZyBzZXQsIHBlYWsgd29ya2luZyBzZXQsIGVsYXBzZWQgdGltZSwgdXNlciB0aW1lLCBhbmQKKwkJICoga2VybmVsIHRpbWUuCisJCSAqLworCQlpbnQgT3BlcmF0aW5nU3lzdGVtQ291bnRlcnMgPSBJUGVyZm9ybWFuY2VNb25pdG9yLlR5cGVzLk9wZXJhdGluZ1N5c3RlbUNvdW50ZXJzOworCisJCS8qKgorCQkgKiAyIC0gV3JpdGUgb3V0IHRoZSBnbG9iYWwgcGVyZm9ybWFuY2UgaW5mby4gVGhpcyBpbmNsdWRlcyB0aGluZ3MgbGlrZSB0aGUgdG90YWwgY29tbWl0dGVkIG1lbW9yeSBmb3IgdGhlIGVudGlyZSBzeXN0ZW0uCisJCSAqIAorCQkgKiBUaGlzIGZ1bmN0aW9uIGRlcGVuZHMgb24gdGhlIEdldFBlcmZvcm1hbmNlSW5mbygpIGZ1bmN0aW9uIGJlaW5nIGF2YWlsYWJsZSBpbiB0aGUgV2luZG93cyBwc2FwaS5kbGwuIFRoaXMgaXMgYXZhaWxhYmxlIGluIFhQIGJ1dCBpcyB1c3VhbGx5CisJCSAqIG5vdCBhdmFpbGFibGUgaW4gV2luLzIwMDAuIElmIGl0IGlzIG5vdCBhdmFpbGFibGUgdGhlbiB0aGlzIGZ1bmN0aW9uIHRocm93cyBhbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi4KKwkJICovCisJCWludCBHbG9iYWxTeXN0ZW1Db3VudGVycyA9IElQZXJmb3JtYW5jZU1vbml0b3IuVHlwZXMuR2xvYmFsU3lzdGVtQ291bnRlcnM7CisKKwkJLyoqCisJCSAqIDQgLSBXcml0ZSBvdXQgdGhlIHNpemUgb2YgdGhlIEphdmEgSGVhcC4KKwkJICovCisJCWludCBKYXZhSGVhcFNpemUgPSBJUGVyZm9ybWFuY2VNb25pdG9yLlR5cGVzLkphdmFIZWFwU2l6ZTsKKworCQkvKioKKwkJICogOCAtIFdyaXRlIG91dCBob3cgbXVjaCBvZiB0aGUgSmF2YSBoZWFwIGlzIGJlaW5nIHVzZWQuIFRoaXMgY2FsbHMgdGhlIGdhcmJhZ2UgY29sbGVjdG9yIHNvIGl0IG1heSBza2V3IHRpbWluZyByZXN1bHRzLgorCQkgKi8KKwkJaW50IEphdmFIZWFwVXNlZCA9IElQZXJmb3JtYW5jZU1vbml0b3IuVHlwZXMuSmF2YUhlYXBVc2VkOworCisJCS8qKgorCQkgKiAxNiAtIFRoZSBwbHVnaW4gc3RhcnR1cCBhbmQgc2l6ZSBpbmZvcm1hdGlvbi4KKwkJICovCisJCWludCBQbHVnaW5JbmZvID0gSVBlcmZvcm1hbmNlTW9uaXRvci5UeXBlcy5QbHVnaW5JbmZvOworCisJCS8qKiAweGZmZmYgLSBFdmVyeXRoaW5nLiAqLworCQlpbnQgQWxsID0gSVBlcmZvcm1hbmNlTW9uaXRvci5UeXBlcy5BbGw7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgUGVyZm9ybWFuY2VNb25pdG9yVXRpbCBzaGFyZWRNb25pdG9yOworCisJcHVibGljIHN0YXRpYyBQZXJmb3JtYW5jZU1vbml0b3JVdGlsIGdldE1vbml0b3IoKSB7CisJCWlmIChzaGFyZWRNb25pdG9yID09IG51bGwpIHsKKwkJCXRyeSB7CisJCQkJQ2xhc3MuZm9yTmFtZSgib3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLlBlcmZNc3JDb3JlUGx1Z2luIik7IC8vIFRoaXMganVzdCB0ZXN0cyBpZiB0aGUgcGVyZm9ybWFuY2UgcGx1Z2luIGlzIGF2YWlsYWJsZS4gVGhyb3dzIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQkJCQkJCQkJCQkgLy8gZXhjZXB0aW9uIG90aGVyd2lzZS4KKwkJCQlDbGFzcyBwcmVzZW50Q2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJvcmcuZWNsaXBzZS5qZW0udXRpbC5QcmVzZW50UGVyZm9ybWFuY2VNb25pdG9yIik7IC8vIEdldCB0aGUgY2xhc3Mgd2UgdXNlIHdyYXBwZXIgaXQuIC8vJE5PTi1OTFMtMSQKKwkJCQlzaGFyZWRNb25pdG9yID0gKFBlcmZvcm1hbmNlTW9uaXRvclV0aWwpIHByZXNlbnRDbGFzcy5uZXdJbnN0YW5jZSgpOworCQkJCWlmICghc2hhcmVkTW9uaXRvci5pc1ZhbGlkKCkpCisJCQkJCXNoYXJlZE1vbml0b3IgPSBudWxsOworCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gSWYgYW55IHJ1bnRpbWUgZXhjZXB0aW9uLCBqdXN0IHVzZSB0aGUgbm90IHByZXNlbnQgb25lLgorCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gSWYgY2xhc3Mgbm90IGZvdW5kLCB0aGVuIHBsdWdpbiBub3QgYXZhaWxhYmxlLCBzbyBqdXN0IHVzZSB0aGUgbm90IHByZXNlbnQgb25lLgorCQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gUHJvYmxlbSBpbnN0YW50aWF0aW5nLCBzbyBqdXN0IHVzZSB0aGUgbm90IHByZXNlbnQgb25lLgorCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisJCQkJLy8gU29tZSBpbGxlZ2FsIGFjY2Vzcywgc28ganVzdCB1c2UgdGhlIG5vdCBwcmVzZW50IG9uZS4KKwkJCX0KKwkJCWlmIChzaGFyZWRNb25pdG9yID09IG51bGwpIHsKKwkJCQkvLyBDb3VsZG4ndCBnZXQgdGhlIHBlcmZvcm1hbmNlIG9uZSBmb3Igc29tZSByZWFzb24uIFVzZSBub3QgcHJlc2VudCBvbmUgaW5zdGVhZC4KKwkJCQlzaGFyZWRNb25pdG9yID0gbmV3IE5vdFByZXNlbnRQZXJmb3JtYW5jZU1vbml0b3IoKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc2hhcmVkTW9uaXRvcjsKKwl9CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZCgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoqCisJICogU2V0IHRoZSB2YXJpYXRpb25zIHRoYXQgYXJlIGluIGVmZmVjdC4KKwkgKiAKKwkgKiBAcGFyYW0gdmFyCisJICogICAgICAgICAgICBhIGNvbW1hIGRlbGltaXRlZCBzdHJpbmcgb2YgdmFyaWF0aW9uIG51bWJlcnMKKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRWYXIoU3RyaW5nIHZhcik7CisKKwkvKioKKwkgKiBUYWtlIGEgc25hcHNob3Qgb2Ygc29tZSBkZWZhdWx0IHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50cy4KKwkgKiAKKwkgKiBAcGFyYW0gc3RlcAorCSAqICAgICAgICAgICAgdGhpcyBpZGVudGlmaWVzIHRoZSBzdGVwIHRoYXQgdGhlIHNuYXBzaG90IGlzIGZvcgorCSAqLworCXB1YmxpYyBmaW5hbCB2b2lkIHNuYXBzaG90KGludCBzdGVwKSB7CisJCWRvU25hcHNob3Qoc3RlcCk7CisJCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkKKwkJCW5vdGlmeVNuYXBzaG90KG5ldyBQZXJmb3JtYW5jZUV2ZW50KHRoaXMsIHN0ZXApKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIG5vdGlmeVNuYXBzaG90KFBlcmZvcm1hbmNlRXZlbnQgZXZlbnQpIHsKKwkJUGVyZm9ybWFuY2VMaXN0ZW5lcltdIGxpc3QgPSBsaXN0ZW5lcnM7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgeworCQkJbGlzdFtpXS5zbmFwc2hvdChldmVudCk7CisJCX0KKwl9CisJCisJLyoqCisJICogRG8gdGhlIGFjdHVhbCBzbmFwc2hvdAorCSAqIEBwYXJhbSBzdGVwCisJICogCisJICogQHNlZSAjc25hcHNob3QoaW50KQorCSAqIEBzaW5jZSAxLjEuMAorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRvU25hcHNob3QoaW50IHN0ZXApOworCisJLyoqCisJICogVGFrZSBhIHNuYXBzaG90IG9mIHRoZSBzZWxlY3RlZCBwZXJmb3JtYW5jZSBtZWFzdXJlbWVudHMuCisJICogCisJICogQHBhcmFtIHN0ZXAKKwkgKiAgICAgICAgICAgIHRoaXMgaWRlbnRpZmllcyB0aGUgc3RlcCB0aGF0IHRoZSBzbmFwc2hvdCBpcyBmb3IKKwkgKiAKKwkgKiBAcGFyYW0gdHlwZXMKKwkgKiAgICAgICAgICAgIFRoaXMgY29udHJvbHMgd2hpY2ggbWVhc3VyZW1lbnRzIGFyZSBzZWxlY3RlZC4gSXQgaXMgYW4gb3InZCB0b2dldGhlciBsaXN0IG9mIHRoZSBJUGVyZm9ybWFuY2VNb25pdG9yLlR5cGVzIGNvbnN0YW50cy4KKwkgKiAKKwkgKiBAc2VlIElQZXJmb3JtYW5jZU1vbml0b3IuVHlwZXMKKwkgKi8KKwlwdWJsaWMgdm9pZCBzbmFwc2hvdChpbnQgc3RlcCwgaW50IHR5cGVzKSB7CisJCWRvU25hcHNob3Qoc3RlcCwgdHlwZXMpOworCQlpZiAobGlzdGVuZXJzICE9IG51bGwpCisJCQlub3RpZnlTbmFwc2hvdChuZXcgUGVyZm9ybWFuY2VFdmVudCh0aGlzLCBzdGVwLCB0eXBlcykpOwkJCisJfQorCQorCS8qKgorCSAqIERvIHRoZSBhY3R1YWwgc25hcHNob3QKKwkgKiBAcGFyYW0gc3RlcAorCSAqIAorCSAqIEBzZWUgI3NuYXBzaG90KGludCwgaW50KQorCSAqIEBzaW5jZSAxLjEuMAorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRvU25hcHNob3QoaW50IHN0ZXAsIGludCB0eXBlcyk7CQorCQorCS8qKgorCSAqIEFkZCBsaXN0ZW5lciB0byBsaXN0LgorCSAqIEBwYXJhbSBsaXN0ZW5lcgorCSAqIAorCSAqIEBzaW5jZSAxLjEuMAorCSAqLworCXB1YmxpYyB2b2lkIGFkZFBlcmZvcm1hbmNlTGlzdGVuZXIoUGVyZm9ybWFuY2VMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlpZiAoZmluZExpc3RlbmVyKGxpc3RlbmVyKSAhPSAtMSkKKwkJCXJldHVybjsKKwkJUGVyZm9ybWFuY2VMaXN0ZW5lcltdIG5ld0xpc3QgPSBuZXcgUGVyZm9ybWFuY2VMaXN0ZW5lcltsaXN0ZW5lcnMgIT0gbnVsbCA/IGxpc3RlbmVycy5sZW5ndGgrMSA6IDFdOworCQlpZiAobGlzdGVuZXJzICE9IG51bGwpCisJCQlTeXN0ZW0uYXJyYXljb3B5KGxpc3RlbmVycywgMCwgbmV3TGlzdCwgMCwgbGlzdGVuZXJzLmxlbmd0aCk7CisJCW5ld0xpc3RbbmV3TGlzdC5sZW5ndGgtMV0gPSBsaXN0ZW5lcjsKKwkJbGlzdGVuZXJzID0gbmV3TGlzdDsKKwl9CisJCisJcHJpdmF0ZSBpbnQgZmluZExpc3RlbmVyKFBlcmZvcm1hbmNlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgeworCQkJCWlmIChsaXN0ZW5lcnNbaV0gPT0gbGlzdGVuZXIpCisJCQkJCXJldHVybiBpOworCQkJfQorCQl9CisJCXJldHVybiAtMTsKKwl9CisJCisJLyoqCisJICogUmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tIHRoZSBsaXN0LgorCSAqIEBwYXJhbSBsaXN0ZW5lcgorCSAqIAorCSAqIEBzaW5jZSAxLjEuMAorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZVBlcmZvcm1hbmNlTGlzdGVuZXIoUGVyZm9ybWFuY2VMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlpbnQgaW5kZXggPSBmaW5kTGlzdGVuZXIobGlzdGVuZXIpOworCQlpZiAoaW5kZXggIT0gLTEpIHsKKwkJCWlmIChsaXN0ZW5lcnMubGVuZ3RoID09IDEpIHsKKwkJCQlsaXN0ZW5lcnMgPSBudWxsOworCQkJCXJldHVybjsKKwkJCX0KKwkJCVBlcmZvcm1hbmNlTGlzdGVuZXJbXSBuZXdMaXN0ID0gbmV3IFBlcmZvcm1hbmNlTGlzdGVuZXJbbGlzdGVuZXJzLmxlbmd0aC0xXTsKKwkJCVN5c3RlbS5hcnJheWNvcHkobGlzdGVuZXJzLCAwLCBuZXdMaXN0LCAwLCBpbmRleCk7CisJCQlTeXN0ZW0uYXJyYXljb3B5KGxpc3RlbmVycywgaW5kZXgrMSwgbmV3TGlzdCwgaW5kZXgsIG5ld0xpc3QubGVuZ3RoLWluZGV4KTsKKwkJCWxpc3RlbmVycyA9IG5ld0xpc3Q7CisJCX0KKwl9CisJLyoqCisJICogVXBsb2FkIHRoZSByZXN1bHRzIHRvIHRoZSBzZXJ2ZXIuIFRoaXMgY2F1c2VzIHRoZSBmaWxlIHRvIGJlCisJICogY2xvc2VkLCBhbmQgdGhlIG1vbml0b3IgdG8gYmUgcGxhY2VkIGludG8gdGhlIGZpbmlzaGVkIHN0YXRlLgorCSAqIAorCSAqIFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIGNhbGxlZCBpZiB0aGUgdXBsb2FkaG9zdCwgdXBsb2FkcG9ydCBhbmQgdXBsb2FkdXNlcmlkCisJICogaGF2ZSBiZWVuIGNvbmZpZ3VyZWQgYmVmb3JlIGhhbmQuCisJICogCisJICogQHBhcmFtIGRlc2NyaXB0aW9uIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIChpdCBjYW4gYmUgbnVsbCkKKwkgKiAKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB1cGxvYWQoU3RyaW5nIGRlc2NyaXB0aW9uKXtyZXR1cm4gZmFsc2U7fQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL1ByZXNlbnRQZXJmb3JtYW5jZU1vbml0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9QcmVzZW50UGVyZm9ybWFuY2VNb25pdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAyMWNkNQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9QcmVzZW50UGVyZm9ybWFuY2VNb25pdG9yLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKworCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLklQZXJmb3JtYW5jZU1vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLlBlcmZNc3JDb3JlUGx1Z2luOworCisvKioKKyAqIFRoaXMgaXMgdGhlIHZlcnNpb24gdXNlZCB3aGVuIHRoZSBwZXJmb3JtYW5jZSBwbHVnaW4gaXMgYXZhaWxhYmxlLgorICogCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgaXMgbm90IG1lYW50IHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgorICogPC9wPgorICogCisgKiBAc2luY2UgMS4wLjAKKyAqLworcHVibGljIGNsYXNzIFByZXNlbnRQZXJmb3JtYW5jZU1vbml0b3IgZXh0ZW5kcyBQZXJmb3JtYW5jZU1vbml0b3JVdGlsIHsKKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLlBlcmZvcm1hbmNlTW9uaXRvclV0aWwjdXBsb2FkKGphdmEubGFuZy5TdHJpbmcpCisJICovCisJcHVibGljIGJvb2xlYW4gdXBsb2FkKFN0cmluZyBkZXNjcmlwdGlvbikgeworCQlyZXR1cm4gbW9uaXRvci51cGxvYWQoZGVzY3JpcHRpb24pLnN1Y2Nlc3M7CisJfQorCQorCXByaXZhdGUgSVBlcmZvcm1hbmNlTW9uaXRvciBtb25pdG9yOworCisJLyoKKwkgKiBTbyB0aGF0IG9ubHkgaW5zdGFudGlhdGVkIGJ5IHRoaXMgcGFja2FnZS4KKwkgKi8KKwlQcmVzZW50UGVyZm9ybWFuY2VNb25pdG9yKCkgeworCQltb25pdG9yID0gUGVyZk1zckNvcmVQbHVnaW4uZ2V0UGVyZm9ybWFuY2VNb25pdG9yKHRydWUpOworCX0KKwkKKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5QZXJmb3JtYW5jZU1vbml0b3JVdGlsI2lzVmFsaWQoKQorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWQoKSB7CisJCXJldHVybiBtb25pdG9yICE9IG51bGw7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5QZXJmb3JtYW5jZU1vbml0b3JVdGlsI3NldFZhcihqYXZhLmxhbmcuU3RyaW5nKQorCSAqLworCXB1YmxpYyB2b2lkIHNldFZhcihTdHJpbmcgdmFyKSB7CisJCW1vbml0b3Iuc2V0VmFyKHZhcik7CisJfQorCisJLyoKKwkgKiAgKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuUGVyZm9ybWFuY2VNb25pdG9yVXRpbCNkb1NuYXBzaG90KGludCkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBkb1NuYXBzaG90KGludCBzdGVwKSB7CisJCW1vbml0b3Iuc25hcHNob3Qoc3RlcCk7CisJfQorCisJLyoKKwkgKiAgKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuUGVyZm9ybWFuY2VNb25pdG9yVXRpbCNkb1NuYXBzaG90KGludCwgaW50KQorCSAqLworCXByb3RlY3RlZCB2b2lkIGRvU25hcHNob3QoaW50IHN0ZXAsIGludCB0eXBlcykgeworCQltb25pdG9yLnNuYXBzaG90KHN0ZXAsIHR5cGVzKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9SZWdpc3RyeVJlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL1JlZ2lzdHJ5UmVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdlODI3NwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9SZWdpc3RyeVJlYWRlci5qYXZhCkBAIC0wLDAgKzEsMTU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiAgJCRSQ1NmaWxlOiBSZWdpc3RyeVJlYWRlci5qYXZhLHYgJCQKKyAqICAkJFJldmlzaW9uOiAxLjUgJCQgICQkRGF0ZTogMjAwNi8wNS8xNyAyMDoxMzo0NSAkJCAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKKworCisvKioKKyAqIENsYXNzIHRvIHJlYWQgYSByZWdpc3RyeS4gSXQgaXMgbWVhbnQgdG8gYmUgc3ViY2xhc3NlZCB0byBwcm92aWRlIHNwZWNpZmljIGZ1bmN0aW9uLgorICogCisgKiBAc2luY2UgMS4wLjAKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFJlZ2lzdHJ5UmVhZGVyIHsKKworCVN0cmluZyBwbHVnaW5JZDsKKworCVN0cmluZyBleHRlbnNpb25Qb2ludElkOworCisJcHJpdmF0ZSBzdGF0aWMgQnVuZGxlIHN5c3RlbUJ1bmRsZTsKKworCS8qKgorCSAqIFV0aWxpdHkgbWV0aG9kIHRvIGdldCB0aGUgcGx1Z2luIGlkIG9mIGEgY29uZmlndWF0aW9uIGVsZW1lbnQKKwkgKiAKKwkgKiBAcGFyYW0gY29uZmlndXJhdGlvbkVsZW1lbnQKKwkgKiBAcmV0dXJuIHBsdWdpbiBpZCBvZiBjb25maWd1cmF0aW9uIGVsZW1lbnQKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQbHVnaW5JZChJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlndXJhdGlvbkVsZW1lbnQpIHsKKwkJU3RyaW5nIHBsdWdpbklkID0gbnVsbDsKKworCQlpZiAoY29uZmlndXJhdGlvbkVsZW1lbnQgIT0gbnVsbCkgeworCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBjb25maWd1cmF0aW9uRWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKTsKKworCQkJaWYgKGV4dGVuc2lvbiAhPSBudWxsKQorCQkJCXBsdWdpbklkID0gZXh0ZW5zaW9uLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpOworCQl9CisKKwkJcmV0dXJuIHBsdWdpbklkOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yIGZvciBSZWdpc3RyeVJlYWRlciB0YWtpbmcgYSByZWdpc3RyeSwgcGx1Z2luIGlkLCBhbmQgZXh0ZW5zaW9uIHBvaW50IGlkLgorCSAqIAorCSAqIEBwYXJhbSByZWdpc3RyeQorCSAqIEBwYXJhbSBwbHVnaW5JRAorCSAqIEBwYXJhbSBleHRlbnNpb25Qb2ludAorCSAqIAorCSAqIEBkZXByZWNhdGVkIFVzZSBSZWdpc3RyeVJlYWRlcihwbHVnaW4sIGV4dGVuc2lvblBvaW50KSBpbnN0ZWFkLiBUaGUgcmVnaXN0cnkgcGFzc2VkIGluIGlzIGlnbm9yZWQuCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIFJlZ2lzdHJ5UmVhZGVyKElQbHVnaW5SZWdpc3RyeSByZWdpc3RyeSwgU3RyaW5nIHBsdWdpbklELCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnQpIHsKKwkJdGhpcyhwbHVnaW5JRCwgZXh0ZW5zaW9uUG9pbnQpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yIGZvciBSZWdpc3RyeVJlYWRlciB0YWtpbmcgdGhlIHBsdWdpbiBpZCBhbmQgZXh0ZW5zaW9uIHBvaW50IGlkLgorCSAqIAorCSAqIEBwYXJhbSBwbHVnaW5JRAorCSAqIEBwYXJhbSBleHRlbnNpb25Qb2ludAorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBSZWdpc3RyeVJlYWRlcihTdHJpbmcgcGx1Z2luSUQsIFN0cmluZyBleHRlbnNpb25Qb2ludCkgeworCQlzdXBlcigpOworCQl0aGlzLnBsdWdpbklkID0gcGx1Z2luSUQ7CisJCWV4dGVuc2lvblBvaW50SWQgPSBleHRlbnNpb25Qb2ludDsKKwl9CisKKwlwcml2YXRlIHZvaWQgaW50ZXJuYWxSZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgeworCQlib29sZWFuIHJlY29nbml6ZWQgPSB0aGlzLnJlYWRFbGVtZW50KGVsZW1lbnQpOworCQlpZiAoIXJlY29nbml6ZWQpIHsKKwkJCWxvZ0Vycm9yKGVsZW1lbnQsICJFcnJvciBwcm9jZXNzaW5nIGV4dGVuc2lvbjogIiArIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisKKwkvKgorCSAqIExvZ3MgdGhlIGVycm9yIGluIHRoZSBkZXNrdG9wIGxvZyB1c2luZyB0aGUgcHJvdmlkZWQgdGV4dCBhbmQgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQuCisJICovCisJcHJvdGVjdGVkIHZvaWQgbG9nRXJyb3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFN0cmluZyB0ZXh0KSB7CisJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKTsKKwkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJYnVmLmFwcGVuZCgiUGx1Z2luICIgKyBleHRlbnNpb24uZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkgKyAiLCBleHRlbnNpb24gIiArIGV4dGVuc2lvbi5nZXRFeHRlbnNpb25Qb2ludFVuaXF1ZUlkZW50aWZpZXIoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlidWYuYXBwZW5kKCJcbiIgKyB0ZXh0KTsgLy8kTk9OLU5MUy0xJAorCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoYnVmLnRvU3RyaW5nKCkpOworCX0KKworCS8qCisJICogTG9ncyBhIHZlcnkgY29tbW9uIHJlZ2lzdHJ5IGVycm9yIHdoZW4gYSByZXF1aXJlZCBhdHRyaWJ1dGUgaXMgbWlzc2luZy4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBsb2dNaXNzaW5nQXR0cmlidXRlKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYXR0cmlidXRlTmFtZSkgeworCQlsb2dFcnJvcihlbGVtZW50LCAiUmVxdWlyZWQgYXR0cmlidXRlICciICsgYXR0cmlidXRlTmFtZSArICInIG5vdCBkZWZpbmVkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCS8qCisJICogSW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJlYWQgZWxlbWVudCBhdHRyaWJ1dGVzLiBJZiB0aGlzIGVsZW1lbnQgaGFzIHN1YmVsZW1lbnRzLCB0aGUgcmVhZGVyIHdpbGwgcmVjdXJzaXZlbHkgY3ljbGUgdGhyb3VnaCB0aGVtIGFuZCBjYWxsIHRoaXMKKwkgKiBtZXRob2Qgc28gZG9uJ3QgZG8gaXQgaGVyZS4KKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCk7CisKKwkvKioKKwkgKiBSZWFkIHRoZSBleHRlbnNpb24gcG9pbnQgYW5kIHBhcnNlIGl0LgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyB2b2lkIHJlYWRSZWdpc3RyeSgpIHsKKwkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludChwbHVnaW5JZCwgZXh0ZW5zaW9uUG9pbnRJZCk7CisJCWlmIChwb2ludCA9PSBudWxsKQorCQkJcmV0dXJuOworCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CisJCQlpbnRlcm5hbFJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRlc3RzIHRvIHNlZSBpZiBpdCBpcyB2YWxpZCBhdCB0aGlzIHBvaW50IGluIHRpbWUgdG8gY3JlYXRlIGFuIGV4ZWN1dGFibGUgZXh0ZW5zaW9uLiBBIHZhbGlkIHJlYXNvbiBub3QgdG8gd291bGQgYmUgdGhhdCB0aGUgd29ya3NwYWNlIGlzCisJICogc2h1dHRpbmcgZG9udy4KKwkgKiAKKwkgKiBAcGFyYW0gZWxlbWVudAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaXQgaXMgdmFsaWQgcG9pbnQgdG8gY3JlYXRlIGFuIGV4ZWN1dGFibGUgZXh0ZW5zaW9uLgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5DcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7CisJCWlmIChQbGF0Zm9ybS5pc1J1bm5pbmcoKSAmJiBnZXRTeXN0ZW1CdW5kbGUoKS5nZXRTdGF0ZSgpICE9IEJ1bmRsZS5TVE9QUElORykKKwkJCXJldHVybiB0cnVlOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBzeXN0ZW0gYnVuZGxlCisJICogCisJICogQHJldHVybiBzeXN0ZW0gYnVuZGxlLgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgQnVuZGxlIGdldFN5c3RlbUJ1bmRsZSgpIHsKKwkJaWYgKHN5c3RlbUJ1bmRsZSA9PSBudWxsKQorCQkJc3lzdGVtQnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5vc2dpIik7IC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIHN5c3RlbUJ1bmRsZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvVGltZXJUZXN0cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL1RpbWVyVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTI0Zjc4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL1RpbWVyVGVzdHMuamF2YQpAQCAtMCwwICsxLDM1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorCisKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbDsKKworaW1wb3J0IGphdmEudGV4dC5OdW1iZXJGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLio7CisKKy8qKgorICogCisgKiBAc2luY2UgMS4wLjIKKyAqLworcHVibGljIGNsYXNzIFRpbWVyVGVzdHMgeworCisJLyoqCisJICogRGVmYXVsdCBUaW1lclRlc3RzIGNsYXNzIHRvIHVzZSB3aGVuIG5vdCB1c2luZyB5b3VyIG93bi4gSXQncyBhIGdsb2JhbC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFRpbWVyVGVzdHMgYmFzaWNUZXN0ID0gbmV3IFRpbWVyVGVzdHMoKTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVUlJFTlRfUEFSRU5UX0lEID0gImN1cnJlbnQgcGFyZW50IjsgLy8kTk9OLU5MUy0xJAorCXByb3RlY3RlZCBTdHJpbmcgY3VycmVudFBhcmVudElkID0gbnVsbDsKKworCisJcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBUaW1lclN0ZXAgeworCQlzdGF0aWMgZmluYWwgaW50IFNUQVJUID0gMDsKKwkJc3RhdGljIGZpbmFsIGludCBTVE9QID0gMTsKKwkJc3RhdGljIGZpbmFsIGludCBTVEFSVF9DVU1VTEFUSVZFID0gMjsKKwkJc3RhdGljIGZpbmFsIGludCBTVE9QX0NVTVVMQVRJVkUgPSAzOworCQlzdGF0aWMgZmluYWwgaW50IFNUQVJUX0FDQ1VNVUxBVElORyA9IDQ7CisJCXN0YXRpYyBmaW5hbCBpbnQgU1RPUF9BQ0NVTVVMQVRJTkcgPSA1OworCQlwcm90ZWN0ZWQgU3RyaW5nIGlkOworCQlwcm90ZWN0ZWQgaW50IHR5cGU7CisJCXByb3RlY3RlZCBsb25nIGN1cnJlbnRUaW1lOworCQlwcm90ZWN0ZWQgaW50IHRocmVhZElkOworfQorCisJcHJvdGVjdGVkIGJvb2xlYW4gdGVzdE9uID0gZmFsc2U7CisJcHJvdGVjdGVkIExpc3Qgc3RlcHM7CisKKwlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc3RhcnRTdGVwKFN0cmluZyBpZCkgeworCQlpZiAoIXRlc3RPbikKKwkJCXJldHVybiB0cnVlOworCisJCVRpbWVyU3RlcCBzdGVwID0gY3JlYXRlVGltZXJTdGVwKGlkLCBUaW1lclN0ZXAuU1RBUlQpOworCQlyZXR1cm4gc3RlcCAhPSBudWxsOworCX0KKworCXByb3RlY3RlZCBUaW1lclN0ZXAgY3JlYXRlVGltZXJTdGVwKFN0cmluZyBpZCwgaW50IHN0ZXBUeXBlKSB7CisJCVRpbWVyU3RlcCBuZXdTdGVwID0gbmV3IFRpbWVyU3RlcCgpOworCQluZXdTdGVwLnRocmVhZElkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5oYXNoQ29kZSgpOworCQluZXdTdGVwLmlkID0gaWQ7CisJCW5ld1N0ZXAudHlwZSA9IHN0ZXBUeXBlOworCQluZXdTdGVwLmN1cnJlbnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCXN0ZXBzLmFkZChuZXdTdGVwKTsKKworCQlyZXR1cm4gbmV3U3RlcDsKKwl9CisKKwlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc3RvcFN0ZXAoU3RyaW5nIGlkKSB7CisJCWlmICghdGVzdE9uKQorCQkJcmV0dXJuIHRydWU7CisJCVRpbWVyU3RlcCBzdGVwID0gY3JlYXRlVGltZXJTdGVwKGlkLCBUaW1lclN0ZXAuU1RPUCk7CisJCXJldHVybiBzdGVwICE9IG51bGw7CisJfQorCisJcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHN0YXJ0QWNjdW11bGF0aW5nKFN0cmluZyBpZCkgeworCQlpZiAoIXRlc3RPbikKKwkJCXJldHVybiB0cnVlOworCisJCXJldHVybiBjcmVhdGVUaW1lclN0ZXAoaWQsIFRpbWVyU3RlcC5TVEFSVF9BQ0NVTVVMQVRJTkcpICE9IG51bGw7CisJfQorCisJcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHN0b3BBY2N1bXVsYXRpbmcoU3RyaW5nIGlkKSB7CisJCWlmICghdGVzdE9uKQorCQkJcmV0dXJuIHRydWU7CisKKwkJcmV0dXJuIGNyZWF0ZVRpbWVyU3RlcChpZCwgVGltZXJTdGVwLlNUT1BfQUNDVU1VTEFUSU5HKSAhPSBudWxsOworCX0KKwlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc3RhcnRDdW11bGF0aXZlU3RlcChTdHJpbmcgaWQpIHsKKwkJaWYgKCF0ZXN0T24pCisJCQlyZXR1cm4gdHJ1ZTsKKworCQlyZXR1cm4gY3JlYXRlVGltZXJTdGVwKGlkLCBUaW1lclN0ZXAuU1RBUlRfQ1VNVUxBVElWRSkgIT0gbnVsbDsKKwl9CisKKwlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc3RvcEN1bXVsYXRpdmVTdGVwKFN0cmluZyBpZCkgeworCQlpZiAoIXRlc3RPbikKKwkJCXJldHVybiB0cnVlOworCQlyZXR1cm4gY3JlYXRlVGltZXJTdGVwKGlkLCBUaW1lclN0ZXAuU1RPUF9DVU1VTEFUSVZFKSAhPSBudWxsOworCX0KKworCS8qKgorCSAqIENsZWFyIHRoZSB0ZXN0cyBzbyB0aGF0IHlvdSBjYW4gcmVzdGFydCBhbmQgZG8gc29tZSBtb3JlIHRlc3RzLgorCSAqIAorCSAqIAorCSAqIEBzaW5jZSAxLjAuMgorCSAqLworCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbGVhclRlc3RzKCkgeworCQlpZiAoIXRlc3RPbikKKwkJCXJldHVybjsKKwkJc3RlcHMuY2xlYXIoKTsKKwkJY3VycmVudFBhcmVudElkID0gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBUdXJuIHRoaXMgdGVzdCBvbi4gSWYgbm90IHR1cm5lZCBvbiB0aGVuIGFsbCBjYWxscyB3aWxsIHF1aWNrbHkgcmV0dXJuIHdpdGggbm8gZXJyb3JzLiBUaGlzIGFsbG93cyB0aGUgY29kZSB0byBzdGF5IGluIHBsYWNlIGV2ZW4gd2hlbiBub3QKKwkgKiBkZWJ1Z2dpbmcuCisJICogPHA+CisJICogV2hlbiB0dXJuZWQgb2ZmLCBpdCB3aWxsIGNsZWFyIHRoZSB0ZXN0LgorCSAqIAorCSAqIEBwYXJhbSBvbgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMgorCSAqLworCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB0ZXN0U3RhdGUoYm9vbGVhbiBvbikgeworCQlpZiAob24gPT0gdGVzdE9uKQorCQkJcmV0dXJuOworCQlpZiAob24pIHsKKwkJCXRlc3RPbiA9IHRydWU7CisJCQlpZiAoc3RlcHMgPT0gbnVsbCkKKwkJCQlzdGVwcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJfSBlbHNlIHsKKwkJCXRlc3RPbiA9IGZhbHNlOworCQkJc3RlcHMgPSBudWxsOworCQl9CisJCWN1cnJlbnRQYXJlbnRJZCA9IG51bGw7CisJfQorCXByaXZhdGUgc3RhdGljIGNsYXNzIEN1bXVsYXRpdmVJbmZvcm1hdGlvbiB7CisJCXB1YmxpYyBUaW1lclN0ZXAgY3VycmVudEN1bXVsYXRpdmVTdGVwOworCQlwdWJsaWMgbG9uZyBjdW1UaW1lOworCQlwdWJsaWMgaW50IGN1bUNvdW50OworCQlwdWJsaWMgaW50IGN1bUNvdW50Tm9uWmVybzsKKwkJcHVibGljIGxvbmcgbWF4VGltZTsKKwkJcHVibGljIGxvbmcgbWluVGltZSA9IEludGVnZXIuTUFYX1ZBTFVFOworCQlwdWJsaWMgbG9uZyBtaW5UaW1lTm9uWmVybyA9IEludGVnZXIuTUFYX1ZBTFVFOworCX0KKwlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcHJpbnRJdCgpIHsKKwkJaWYgKCF0ZXN0T24pCisJCQlyZXR1cm47CisJCWlmIChzdGVwcyA9PSBudWxsKQorCQkJcmV0dXJuOworCQlNYXAgc3RlcEluZm9CeVRocmVhZElkID0gbmV3IEhhc2hNYXAoKTsKKwkJTWFwIGluZGVudHNCeVRocmVhZElkID0gbmV3IEhhc2hNYXAoKTsKKwkJTWFwIGN1bVN0ZXBzOworCQlUaW1lclN0ZXAgcHJldlN0ZXAgPSBudWxsOworCQlUaW1lclN0ZXAgc3RhcnRTdGVwOworCQlOdW1iZXJGb3JtYXQgcGVyY2VudEZvcm1hdHRlciA9IE51bWJlckZvcm1hdC5nZXRQZXJjZW50SW5zdGFuY2UoKTsKKwkJZG91YmxlIHRvdGFsVGltZSA9IDA7CisJCVN0cmluZ0J1ZmZlciBzdHJiID0gbmV3IFN0cmluZ0J1ZmZlcigxNTApOworCQlpZiAoc3RlcHMuc2l6ZSgpID4gMil7CisJCQl0b3RhbFRpbWUgPSAoKFRpbWVyU3RlcClzdGVwcy5nZXQoc3RlcHMuc2l6ZSgpLTEpKS5jdXJyZW50VGltZSAtICgoVGltZXJTdGVwKXN0ZXBzLmdldCgwKSkuY3VycmVudFRpbWU7CisJCX0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdGVwcy5zaXplKCk7IGkrKykgeworCQkJVGltZXJTdGVwIHN0ZXAgPSAoVGltZXJTdGVwKSBzdGVwcy5nZXQoaSk7CisJCQlJbnRlZ2VyIHRocmVhZElkID0gbmV3IEludGVnZXIoc3RlcC50aHJlYWRJZCk7CisJCQlzd2l0Y2ggKHN0ZXAudHlwZSkgeworCQkJCWNhc2UgVGltZXJTdGVwLlNUQVJUOgorCQkJCWNhc2UgVGltZXJTdGVwLlNUT1A6CisJCQkJCUludGVnZXIgdGhyZWFkSW5kZW50ID0gKEludGVnZXIpIGluZGVudHNCeVRocmVhZElkLmdldCh0aHJlYWRJZCk7CisJCQkJCWludCBpbmRlbnQgPSAwOworCQkJCQlpZiAoc3RlcC50eXBlID09IFRpbWVyU3RlcC5TVEFSVCkgeworCQkJCQkJaWYgKHRocmVhZEluZGVudCAhPSBudWxsKQorCQkJCQkJCWluZGVudCA9IHRocmVhZEluZGVudC5pbnRWYWx1ZSgpICsgMTsKKwkJCQkJCWluZGVudHNCeVRocmVhZElkLnB1dCh0aHJlYWRJZCwgbmV3IEludGVnZXIoaW5kZW50KSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpZiAodGhyZWFkSW5kZW50ICE9IG51bGwpCisJCQkJCQkJaW5kZW50ID0gdGhyZWFkSW5kZW50LmludFZhbHVlKCk7CisJCQkJCQlpZiAoaW5kZW50ID4gMCkKKwkJCQkJCQlpbmRlbnRzQnlUaHJlYWRJZC5wdXQodGhyZWFkSWQsIG5ldyBJbnRlZ2VyKGluZGVudCAtIDEpKTsKKwkJCQkJCWVsc2UgeworCQkJCQkJCWluZGVudHNCeVRocmVhZElkLnJlbW92ZSh0aHJlYWRJZCk7CisJCQkJCQkJaW5kZW50ID0gMDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlzdHJiLnNldExlbmd0aCgwKTsKKwkJCQkJc3RyYi5hcHBlbmQoc3RlcC5jdXJyZW50VGltZSk7CisJCQkJCXN0cmIuYXBwZW5kKCJcdCIpOyAvLyROT04tTkxTLTEkCisJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgaW5kZW50OyBqKyspIHsKKwkJCQkJCXN0cmIuYXBwZW5kKCIgICAgICIpOyAvLyROT04tTkxTLTEkCisJCQkJCX0KKwkJCQkJc3dpdGNoIChzdGVwLnR5cGUpIHsKKwkJCQkJCWNhc2UgVGltZXJTdGVwLlNUQVJUOgorCQkJCQkJCXN0cmIuYXBwZW5kKCJTdGFydCIpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJYnJlYWs7CisKKwkJCQkJCWNhc2UgVGltZXJTdGVwLlNUT1A6CisJCQkJCQkJc3RyYi5hcHBlbmQoIlN0b3AgIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQlicmVhazsKKwkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJOworCQkJCQlzdHJiLmFwcGVuZCgiIFwiIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJc3RyYi5hcHBlbmQoc3RlcC5pZCk7CisJCQkJCXN0cmIuYXBwZW5kKCJcIiAgIGlkKCIpOyAvLyROT04tTkxTLTEkCisJCQkJCXN0cmIuYXBwZW5kKHN0ZXAudGhyZWFkSWQpOworCQkJCQlzdHJiLmFwcGVuZCgiKSIpOyAvLyROT04tTkxTLTEkCisJCQkJCU1hcCBzdGFydFN0ZXBzID0gKE1hcCkgc3RlcEluZm9CeVRocmVhZElkLmdldCh0aHJlYWRJZCk7CisJCQkJCWlmIChzdGFydFN0ZXBzID09IG51bGwpCisJCQkJCQlzdGVwSW5mb0J5VGhyZWFkSWQucHV0KHRocmVhZElkLCBzdGFydFN0ZXBzID0gbmV3IEhhc2hNYXAoKSk7CisJCQkJCWlmIChzdGVwLnR5cGUgPT0gVGltZXJTdGVwLlNUQVJUKSB7CisJCQkJCQkvLyBTdG9yZSB0aGUgc3RhcnQgc3RlcCBmb3IgbGF0ZXIgbG9va3VwIHdoZW4gY2FsdWxhdGluZyB0aGUgdG90YWwgdGltZQorCQkJCQkJc3RhcnRTdGVwcy5wdXQoc3RlcC5pZCwgc3RlcCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvLyBUaGlzIGlzIHRoZSBzdG9wIHRpbWUgZm9yIGEgc3RlcC4gV2UgbmVlZCB0byBmaW5kCisJCQkJCQkvLyB0aGUgY29ycmVzcG9uZGluZyBzdGFydCB0aW1lIGFuZCBjYWxjdWxhdGUgdGhlIHRvdGFsIHRpbWUuCisJCQkJCQlPYmplY3QgaXRlbSA9IHN0YXJ0U3RlcHMucmVtb3ZlKHN0ZXAuaWQpOworCQkJCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBUaW1lclN0ZXApIHsKKwkJCQkJCQlzdGFydFN0ZXAgPSAoVGltZXJTdGVwKSBpdGVtOworCQkJCQkJCWlmIChzdGFydFN0ZXAgIT0gbnVsbCkgeworCQkJCQkJCQlpbnQgYWRkY2hhcnMgPSAxMDAgLSBzdHJiLmxlbmd0aCgpOworCQkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGFkZGNoYXJzOyBqKyspIHsKKwkJCQkJCQkJCXN0cmIuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJfQorCQkJCQkJCQlsb25nIGRlbHRhID0gc3RlcC5jdXJyZW50VGltZSAtIHN0YXJ0U3RlcC5jdXJyZW50VGltZTsKKwkJCQkJCQkJc3RyYi5hcHBlbmQoIiAgICBUb3RhbCA9ICIgKyBkZWx0YSArICIgbXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQkJCWlmICh0b3RhbFRpbWUgPiAwKQorCQkJCQkJCQkJc3RyYi5hcHBlbmQoIiAgICIgKyBwZXJjZW50Rm9ybWF0dGVyLmZvcm1hdChkZWx0YS90b3RhbFRpbWUpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCX0KKwkJCQkJCX0gZWxzZQorCQkJCQkJCXN0cmIuYXBwZW5kKCIgICAgLS0tPiBDb3VsZG4ndCBmaW5kIFN0YXJ0aW5nIHBvaW50IGZvciBcIiIgKyBzdGVwLmlkICsgIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQl9CisJCQkJCWlmIChpID4gMCAmJiAoc3RlcC5jdXJyZW50VGltZSAtIHByZXZTdGVwLmN1cnJlbnRUaW1lKSA+IDApCisJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tICIgKyAoc3RlcC5jdXJyZW50VGltZSAtIHByZXZTdGVwLmN1cnJlbnRUaW1lKSArICIgbXMgLS0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCXByZXZTdGVwID0gc3RlcDsKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKHN0cmIpOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgVGltZXJTdGVwLlNUQVJUX0FDQ1VNVUxBVElORzoKKwkJCQkJY3VtU3RlcHMgPSAoTWFwKSBzdGVwSW5mb0J5VGhyZWFkSWQuZ2V0KHRocmVhZElkKTsKKwkJCQkJaWYgKGN1bVN0ZXBzID09IG51bGwpCisJCQkJCQlzdGVwSW5mb0J5VGhyZWFkSWQucHV0KHRocmVhZElkLCBjdW1TdGVwcyA9IG5ldyBIYXNoTWFwKCkpOworCQkJCQljdW1TdGVwcy5wdXQoc3RlcC5pZCwgbmV3IEN1bXVsYXRpdmVJbmZvcm1hdGlvbigpKTsKKwkJCQkJdGhyZWFkSW5kZW50ID0gKEludGVnZXIpIGluZGVudHNCeVRocmVhZElkLmdldCh0aHJlYWRJZCk7CisJCQkJCWluZGVudCA9IDA7CisJCQkJCWlmICh0aHJlYWRJbmRlbnQgIT0gbnVsbCkKKwkJCQkJCWluZGVudCA9IHRocmVhZEluZGVudC5pbnRWYWx1ZSgpOworCQkJCQlzdHJiLnNldExlbmd0aCgwKTsKKwkJCQkJc3RyYi5hcHBlbmQoc3RlcC5jdXJyZW50VGltZSk7CisJCQkJCXN0cmIuYXBwZW5kKCJcdCIpOyAvLyROT04tTkxTLTEkCisJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgaW5kZW50OyBqKyspIHsKKwkJCQkJCXN0cmIuYXBwZW5kKCIgICAgICIpOyAvLyROT04tTkxTLTEkCisJCQkJCX0KKwkJCQkJc3RyYi5hcHBlbmQoIlN0YXJ0IEFjY3VtdWxhdGluZyIpOyAvLyROT04tTkxTLTEkCisJCQkJCXN0cmIuYXBwZW5kKCIgXCIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlzdHJiLmFwcGVuZChzdGVwLmlkKTsKKwkJCQkJc3RyYi5hcHBlbmQoIlwiICAgaWQoIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJc3RyYi5hcHBlbmQoc3RlcC50aHJlYWRJZCk7CisJCQkJCXN0cmIuYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJaWYgKGkgPiAwICYmIChzdGVwLmN1cnJlbnRUaW1lIC0gcHJldlN0ZXAuY3VycmVudFRpbWUpID4gMCkKKwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0gIiArIChzdGVwLmN1cnJlbnRUaW1lIC0gcHJldlN0ZXAuY3VycmVudFRpbWUpICsgIiBtcyAtLSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJcHJldlN0ZXAgPSBzdGVwOworCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oc3RyYik7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBUaW1lclN0ZXAuU1RBUlRfQ1VNVUxBVElWRToKKwkJCQkJY3VtU3RlcHMgPSAoTWFwKSBzdGVwSW5mb0J5VGhyZWFkSWQuZ2V0KHRocmVhZElkKTsKKwkJCQkJaWYgKGN1bVN0ZXBzICE9IG51bGwpIHsKKwkJCQkJCU9iamVjdCBpbmZvID0gY3VtU3RlcHMuZ2V0KHN0ZXAuaWQpOworCQkJCQkJaWYgKGluZm8gaW5zdGFuY2VvZiBDdW11bGF0aXZlSW5mb3JtYXRpb24pCisJCQkJCQkJKChDdW11bGF0aXZlSW5mb3JtYXRpb24pIGluZm8pLmN1cnJlbnRDdW11bGF0aXZlU3RlcCA9IHN0ZXA7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJCQorCQkJCWNhc2UgVGltZXJTdGVwLlNUT1BfQ1VNVUxBVElWRToKKwkJCQkJY3VtU3RlcHMgPSAoTWFwKSBzdGVwSW5mb0J5VGhyZWFkSWQuZ2V0KHRocmVhZElkKTsKKwkJCQkJaWYgKGN1bVN0ZXBzICE9IG51bGwpIHsKKwkJCQkJCU9iamVjdCBpbmZvID0gY3VtU3RlcHMuZ2V0KHN0ZXAuaWQpOworCQkJCQkJaWYgKGluZm8gaW5zdGFuY2VvZiBDdW11bGF0aXZlSW5mb3JtYXRpb24pIHsKKwkJCQkJCQlDdW11bGF0aXZlSW5mb3JtYXRpb24gY3VtSW5mbyA9IChDdW11bGF0aXZlSW5mb3JtYXRpb24pIGluZm87CisJCQkJCQkJaWYgKGN1bUluZm8uY3VycmVudEN1bXVsYXRpdmVTdGVwICE9IG51bGwpIHsKKwkJCQkJCQkJY3VtSW5mby5jdW1Db3VudCsrOworCQkJCQkJCQlsb25nIGRlbHRhID0gc3RlcC5jdXJyZW50VGltZSAtIGN1bUluZm8uY3VycmVudEN1bXVsYXRpdmVTdGVwLmN1cnJlbnRUaW1lOworCQkJCQkJCQljdW1JbmZvLmN1bVRpbWUgKz0gZGVsdGE7CisJCQkJCQkJCWlmIChjdW1JbmZvLm1heFRpbWUgPCBkZWx0YSkKKwkJCQkJCQkJCWN1bUluZm8ubWF4VGltZSA9IGRlbHRhOworCQkJCQkJCQlpZiAoZGVsdGEgPCBjdW1JbmZvLm1pblRpbWUpCisJCQkJCQkJCQljdW1JbmZvLm1pblRpbWUgPSBkZWx0YTsKKwkJCQkJCQkJaWYgKGRlbHRhICE9IDApIHsKKwkJCQkJCQkJCWN1bUluZm8uY3VtQ291bnROb25aZXJvKys7CisJCQkJCQkJCQlpZiAoZGVsdGEgPCBjdW1JbmZvLm1pblRpbWVOb25aZXJvKQorCQkJCQkJCQkJCWN1bUluZm8ubWluVGltZU5vblplcm8gPSBkZWx0YTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQkJCisJCQkJY2FzZSBUaW1lclN0ZXAuU1RPUF9BQ0NVTVVMQVRJTkc6CisJCQkJCXRocmVhZEluZGVudCA9IChJbnRlZ2VyKSBpbmRlbnRzQnlUaHJlYWRJZC5nZXQodGhyZWFkSWQpOworCQkJCQlpbmRlbnQgPSAwOworCQkJCQlpZiAodGhyZWFkSW5kZW50ICE9IG51bGwpCisJCQkJCQlpbmRlbnQgPSB0aHJlYWRJbmRlbnQuaW50VmFsdWUoKTsKKwkJCQkJc3RyYi5zZXRMZW5ndGgoMCk7CisJCQkJCXN0cmIuYXBwZW5kKHN0ZXAuY3VycmVudFRpbWUpOworCQkJCQlzdHJiLmFwcGVuZCgiXHQiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGluZGVudDsgaisrKSB7CisJCQkJCQlzdHJiLmFwcGVuZCgiICAgICAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJCXN0cmIuYXBwZW5kKCJTdG9wICBBY2N1bXVsYXRpbmciKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlzdHJiLmFwcGVuZCgiIFwiIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJc3RyYi5hcHBlbmQoc3RlcC5pZCk7CisJCQkJCXN0cmIuYXBwZW5kKCJcIiAgIGlkKCIpOyAvLyROT04tTkxTLTEkCisJCQkJCXN0cmIuYXBwZW5kKHN0ZXAudGhyZWFkSWQpOworCQkJCQlzdHJiLmFwcGVuZCgiKSIpOyAvLyROT04tTkxTLTEkCisJCQkJCWN1bVN0ZXBzID0gKE1hcCkgc3RlcEluZm9CeVRocmVhZElkLmdldCh0aHJlYWRJZCk7CisJCQkJCWlmIChjdW1TdGVwcyAhPSBudWxsKSB7CisJCQkJCQlPYmplY3QgaW5mbyA9IGN1bVN0ZXBzLmdldChzdGVwLmlkKTsKKwkJCQkJCWlmIChpbmZvIGluc3RhbmNlb2YgQ3VtdWxhdGl2ZUluZm9ybWF0aW9uKSB7CisJCQkJCQkJQ3VtdWxhdGl2ZUluZm9ybWF0aW9uIGN1bUluZm8gPSAoQ3VtdWxhdGl2ZUluZm9ybWF0aW9uKSBpbmZvOworCQkJCQkJCWlmIChjdW1JbmZvLmN1cnJlbnRDdW11bGF0aXZlU3RlcCAhPSBudWxsKSB7CisJCQkJCQkJCXN0cmIuYXBwZW5kKCIgICBjdW11bGF0aXZlIHRpbWU9Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJc3RyYi5hcHBlbmQoY3VtSW5mby5jdW1UaW1lKTsKKwkJCQkJCQkJc3RyYi5hcHBlbmQoIiAgIGN1bXVsYXRpdmUgY291bnQ9Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJc3RyYi5hcHBlbmQoY3VtSW5mby5jdW1Db3VudCk7CisJCQkJCQkJCXN0cmIuYXBwZW5kKCIgICBtYXggdGltZT0iKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQlzdHJiLmFwcGVuZChjdW1JbmZvLm1heFRpbWUpOworCQkJCQkJCQlzdHJiLmFwcGVuZCgiICAgbWluIHRpbWU9Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJc3RyYi5hcHBlbmQoY3VtSW5mby5taW5UaW1lKTsKKwkJCQkJCQkJc3RyYi5hcHBlbmQoIiAgIGF2ZyB0aW1lPSIpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJCXN0cmIuYXBwZW5kKCgoZG91YmxlKSBjdW1JbmZvLmN1bVRpbWUpL2N1bUluZm8uY3VtQ291bnQpOworCQkJCQkJCQlzdHJiLmFwcGVuZCgiICAgTm9uWmVybyB0aW1lczogY3VtdWxhdGl2ZSB+MCBjb3VudD0iKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQlzdHJiLmFwcGVuZChjdW1JbmZvLmN1bUNvdW50Tm9uWmVybyk7CisJCQkJCQkJCWlmIChjdW1JbmZvLmN1bUNvdW50Tm9uWmVybyAhPSAwKSB7CisJCQkJCQkJCQlzdHJiLmFwcGVuZCgiICAgbWluIH4wIHRpbWU9Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCXN0cmIuYXBwZW5kKGN1bUluZm8ubWluVGltZU5vblplcm8pOworCQkJCQkJCQkJc3RyYi5hcHBlbmQoIiAgIGF2ZyB+MCB0aW1lPSIpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJCQlzdHJiLmFwcGVuZCgoKGRvdWJsZSkgY3VtSW5mby5jdW1UaW1lKSAvIGN1bUluZm8uY3VtQ291bnROb25aZXJvKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAoaSA+IDAgJiYgKHN0ZXAuY3VycmVudFRpbWUgLSBwcmV2U3RlcC5jdXJyZW50VGltZSkgPiAwKQorCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCItLSAiICsgKHN0ZXAuY3VycmVudFRpbWUgLSBwcmV2U3RlcC5jdXJyZW50VGltZSkgKyAiIG1zIC0tIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQlwcmV2U3RlcCA9IHN0ZXA7CisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihzdHJiKTsKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvVUlDb250ZXh0RGV0ZXJtaW5hdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL1VJQ29udGV4dERldGVybWluYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTU1ODgyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL1VJQ29udGV4dERldGVybWluYXRpb24uamF2YQpAQCAtMCwwICsxLDE5MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiAgJCRSQ1NmaWxlOiBVSUNvbnRleHREZXRlcm1pbmF0aW9uLmphdmEsdiAkJAorICogICQkUmV2aXNpb246IDEuNSAkJCAgJCREYXRlOiAyMDA3LzA0LzEwIDAxOjA5OjM2ICQkIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW47CisKKworLyoqCisgKiBTdGF0aWMgdXRpbGl0eSBjbGFzcyBmb3IgVUlDb250ZXh0IGRldGVybWluYXRpb24uCisgKiAKKyAqIEBzaW5jZSAxLjAuMAorICovCitwdWJsaWMgY2xhc3MgVUlDb250ZXh0RGV0ZXJtaW5hdGlvbiB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVU5LTk9XTiA9IDEwMDsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURMRVNTX0NPTlRFWFRfTElURVJBTCA9ICJIZWFkbGVzcyI7IC8vJE5PTi1OTFMtMSQKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX0NPTlRFWFRfTElURVJBTCA9ICJVSSI7IC8vJE5PTi1OTFMtMSQKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhFQURMRVNTX0NPTlRFWFQgPSAxMDI7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVSV9DT05URVhUID0gMTAxOworCisJcHJpdmF0ZSBzdGF0aWMgTWFwIGNhY2hlZEV4dGVuc2lvbnMgPSBudWxsOworCisJcHJpdmF0ZSBzdGF0aWMgaW50IGN1cnJlbnRDb250ZXh0ID0gVU5LTk9XTjsKKworCXByaXZhdGUgVUlDb250ZXh0RGV0ZXJtaW5hdGlvbigpIHsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIGEgZ2l2ZW4gY2xhc3MgYmFzZWQgb24gdGhlIFVJIG9yIEhlYWRsZXNzIGNvbnRleHQuCisJICogCisJICogQHBhcmFtIGtleQorCSAqIEByZXR1cm4gbmV3IGNsYXNzIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4ga2V5LgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisJICogICAgICAgICAgICAgSWYgdGhlIGtleSBpcyBpbnZhbGlkIChlLmcuIG5vIGV4dGVuc2lvbiBpcyBmb3VuZCBmb3IgdGhlIGtleSkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVJbnN0YW5jZShTdHJpbmcga2V5KSB7CisJCU9iamVjdCByZXN1bHQgPSBudWxsOworCQlpZiAoY2FjaGVkRXh0ZW5zaW9ucyA9PSBudWxsKQorCQkJaW5pdEV4dGVuc2lvbnMoKTsKKwkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbnRleHRTZW5zaXRpdmVDbGFzcyA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIGNhY2hlZEV4dGVuc2lvbnMuZ2V0KGtleSk7CisJCXRyeSB7CisJCQlpZiAoY29udGV4dFNlbnNpdGl2ZUNsYXNzICE9IG51bGwpCisJCQkJcmVzdWx0ID0gY29udGV4dFNlbnNpdGl2ZUNsYXNzCisJCQkJCQkuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihVSUNvbnRleHREZXRlcm1pbmF0aW9uUmVnaXN0cnlSZWFkZXIuVUlfQ09OVEVYVF9TRU5TVElWRV9DTEFTU19DTEFTU05BTUVfQVRUUik7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJQcm9ibGVtIGxvYWRpbmcgZXh0ZW5zaW9uIG5vdCBmb3VuZCBmb3Iga2V5IFwiIiArIGtleSArICJcIi4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CisJCX0KKwkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJFeHRlbnNpb24gbm90IGZvdW5kIGZvciBrZXkgXCIiICsga2V5ICsgIlwiLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGNvbnRleHQgLS0gZGV0ZXJtaW5lcyB0aGUgdmFsdWUgaWYgbmVjZXNzYXJ5LgorCSAqIAorCSAqIEByZXR1cm4gY3VycmVudCBjb250ZXh0CisJICogQHNlZSAjSEVBRExFU1NfQ09OVEVYVAorCSAqIEBzZWUgI1VJX0NPTlRFWFQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGludCBnZXRDdXJyZW50Q29udGV4dCgpIHsKKwkJaWYgKGN1cnJlbnRDb250ZXh0ID09IFVOS05PV04pIHsKKwkJCWN1cnJlbnRDb250ZXh0ID0gSEVBRExFU1NfQ09OVEVYVDsKKwkJCW5ldyBVSVRlc3RlclJlZ2lzdHJ5UmVhZGVyKCkucmVhZFJlZ2lzdHJ5KCk7CisJCX0KKwkJcmV0dXJuIGN1cnJlbnRDb250ZXh0OworCX0KKworCS8qCisJICogSW52b2tlcyB0aGUgVUlDb250ZXh0RGV0ZXJtaW5hdGlvblJlZ2lzdHJ5UmVhZGVyIHRvIGNhY2hlIGFsbCBvZiB0aGUgZXh0ZW5zaW9ucywgaWYgbmVjZXNzYXJ5LgorCSAqICAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRFeHRlbnNpb25zKCkgeworCQlpZiAoY2FjaGVkRXh0ZW5zaW9ucyA9PSBudWxsKSB7CisJCQljYWNoZWRFeHRlbnNpb25zID0gbmV3IEhhc2hNYXAoKTsKKwkJCW5ldyBVSUNvbnRleHREZXRlcm1pbmF0aW9uUmVnaXN0cnlSZWFkZXIoKS5yZWFkUmVnaXN0cnkoKTsKKwkJfQorCX0KKworCS8qCisJICogQ29udmVydHMgdGhlIGlucHV0IHRvIG9uZSBvZiBVSV9DT05URVhUIG9yIEhFQURMRVNTX0NPTlRFWFQuIERlZmF1bHRzIHRvIEhFQURMRVNTIG9uIGludmFsaWQgaW5wdXQKKwkgKiAKKwkgKiBAcGFyYW0gbGl0ZXJhbCBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgaW50IGNvbnZlcnRMaXRlcmFsKFN0cmluZyBsaXRlcmFsKSB7CisJCXJldHVybiAoVUlfQ09OVEVYVF9MSVRFUkFMLmVxdWFscyhsaXRlcmFsKSkgPyBVSV9DT05URVhUIDogSEVBRExFU1NfQ09OVEVYVDsKKwl9CisKKwkvKgorCSAqIFJlYWRzIHRoZSByZWdpc3RyYXRpb24gb2YgVUkgQ29udGV4dC1zZW5zaXRpdmUgY2xhc3MgZXh0ZW5zaW9ucyBhbmQgaW5pdGlhbGl6ZXMgdGhlIGNhY2hlIG9mIHRoZSBVSUNvbnRleHREZXRlcm1pbmF0aW9uIG9iamVjdC4KKwkgKiAKKwkgKiBAYXV0aG9yIG1kZWxkZXIKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBVSUNvbnRleHREZXRlcm1pbmF0aW9uUmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7CisKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfQ09OVEVYVF9TRU5TVElWRV9DTEFTU19FTEVNRU5UID0gInVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzIjsgLy8kTk9OLU5MUy0xJAorCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX0NPTlRFWFRfU0VOU1RJVkVfQ0xBU1NfS0VZX0FUVFIgPSAia2V5IjsgLy8kTk9OLU5MUy0xJAorCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX0NPTlRFWFRfU0VOU1RJVkVfQ0xBU1NfQ0xBU1NOQU1FX0FUVFIgPSAiY2xhc3NOYW1lIjsgLy8kTk9OLU5MUy0xJAorCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX0NPTlRFWFRfU0VOU1RJVkVfQ0xBU1NfQ09OVEVYVF9BVFRSID0gImNvbnRleHQiOyAvLyROT04tTkxTLTEkCisKKwkJcHVibGljIFVJQ29udGV4dERldGVybWluYXRpb25SZWdpc3RyeVJlYWRlcigpIHsKKwkJCXN1cGVyKEpFTVV0aWxQbHVnaW4uUExVR0lOX0lELCBKRU1VdGlsUGx1Z2luLlVJX0NPTlRFWFRfRVhURU5TSU9OX1BPSU5UKTsKKwkJfQorCisJCS8qCisJCSAqIChub24tSmF2YWRvYykKKwkJICogCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuUmVnaXN0cnlSZWFkZXIjcmVhZEVsZW1lbnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCkKKwkJICovCisJCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7CisJCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOworCQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhVSV9DT05URVhUX1NFTlNUSVZFX0NMQVNTX0VMRU1FTlQpKSB7CisKKwkJCQlTdHJpbmcga2V5ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoVUlfQ09OVEVYVF9TRU5TVElWRV9DTEFTU19LRVlfQVRUUik7CisJCQkJU3RyaW5nIGNvbnRleHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShVSV9DT05URVhUX1NFTlNUSVZFX0NMQVNTX0NPTlRFWFRfQVRUUik7CisKKwkJCQlpZiAoIWNhY2hlZEV4dGVuc2lvbnMuY29udGFpbnNLZXkoa2V5KSB8fCBnZXRDdXJyZW50Q29udGV4dCgpID09IGNvbnZlcnRMaXRlcmFsKGNvbnRleHQpKQorCQkJCQljYWNoZWRFeHRlbnNpb25zLnB1dChrZXksIGVsZW1lbnQpOworCQkJCXJlc3VsdCA9IHRydWU7CisJCQl9CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJfQorCisJLyoKKwkgKiBSZWFkcyB0aGUgdWlUZXN0ZXIgZXh0ZW5zaW9uIGFuZCBpbnN0YW50aWF0ZSB0aGUgYW55IG9mIHRoZSBVSVRlc3RlciBjbGFzc2VzIGl0IGZpbmRzLgorCSAqIAorCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBoYXMgdGhlIHNpZGUgZWZmZWN0IHRoYXQgaWYgbXVsdGlwbGUgVUlUZXN0ZXJzIGFyZSByZWdpc3RlcmVkLCBhbnkgb2YgdGhlbSBjYW4gdHJpcCB0aGUgY3VycmVudENvbnRleHQgaW50byB0aGUgVUlfQ09OVEVYVAorCSAqIHN0YXRlLgorCSAqIAorCSAqIEBhdXRob3IgbWRlbGRlcgorCSAqLworCXByaXZhdGUgc3RhdGljIGNsYXNzIFVJVGVzdGVyUmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7CisKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfVEVTVEVSX0VMRU1FTlQgPSAidWlUZXN0ZXIiOyAvLyROT04tTkxTLTEkCisKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfVEVTVEVSX0NMQVNTTkFNRV9BVFRSID0gImNsYXNzTmFtZSI7IC8vJE5PTi1OTFMtMSQKKworCQlwdWJsaWMgVUlUZXN0ZXJSZWdpc3RyeVJlYWRlcigpIHsKKwkJCXN1cGVyKEpFTVV0aWxQbHVnaW4uUExVR0lOX0lELCBKRU1VdGlsUGx1Z2luLlVJX1RFU1RFUl9FWFRFTlNJT05fUE9JTlQpOworCQl9CisKKwkJLyoKKwkJICogKG5vbi1KYXZhZG9jKQorCQkgKiAKKwkJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYud29ya2JlbmNoLlJlZ2lzdHJ5UmVhZGVyI3JlYWRFbGVtZW50KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQpCisJCSAqLworCQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgeworCQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKKwkJCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVUlfVEVTVEVSX0VMRU1FTlQpKSB7CisJCQkJcmVzdWx0ID0gdHJ1ZTsKKwkJCQl0cnkgeworCQkJCQkvLyBEb24ndCBib3RoZXIgcnVubmluZyB0ZXN0ZXIgaXQgaWYgd2UgYWxyZWFkeSBwcm9jZXNzZWQgb25lIGV4dGVuc2lvbiB0aGF0IHJldHVybmVkIHRydWUuCisJCQkJCWlmIChjdXJyZW50Q29udGV4dCAhPSBVSV9DT05URVhUICYmIGNhbkNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oZWxlbWVudCkpIHsKKwkJCQkJCVVJVGVzdGVyIHRlc3RlciA9IChVSVRlc3RlcikgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKFVJX1RFU1RFUl9DTEFTU05BTUVfQVRUUik7CisJCQkJCQlpZiAodGVzdGVyLmlzQ3VycmVudENvbnRleHRVSSgpKQorCQkJCQkJCWN1cnJlbnRDb250ZXh0ID0gVUlfQ09OVEVYVDsKKwkJCQkJfQorCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiB0KSB7CisJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coIlVJQ29udGV4dERldGVybWluYXRpb24gaXMgcHJvY2VlZGluZyBpbiBIRUFETEVTUyBtb2RlIik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9VSVRlc3Rlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL1VJVGVzdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ1MTdlOAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9VSVRlc3Rlci5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWw7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqICAkJFJDU2ZpbGU6IFVJVGVzdGVyLmphdmEsdiAkJAorICogICQkUmV2aXNpb246IDEuMiAkJCAgJCREYXRlOiAyMDA1LzAyLzE1IDIzOjA0OjE0ICQkIAorICovCisvKioKKyAqIEludGVyZmFjZSBmb3IgYSBVSVRlc3Rlci4gVGhlICJjbGFzc25hbWUiIGF0dHJpYnV0ZSBvbiB0aGUgInVpVGVzdGVyIiBleHRlbnNpb24gcG9pbnQgc2hvdWxkIGltcGxlbWVudCB0aGlzIGNsYXNzLgorICogCisgKiBAc2luY2UgMS4wLjAKKyAqLworcHVibGljIGludGVyZmFjZSBVSVRlc3RlciB7CisKKwkvKioKKwkgKiBBbnN3ZXIgaWYgdGhlIGN1cnJlbnQgY29udGV4dCBpcyBhbiBVSSBjb250ZXh0LgorCSAqIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW4gVUkgY29udGV4dC4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0N1cnJlbnRDb250ZXh0VUkoKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9FTUZXb3JrYmVuY2hDb250ZXh0QmFzZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvRU1GV29ya2JlbmNoQ29udGV4dEJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWRmZjYwCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvRU1GV29ya2JlbmNoQ29udGV4dEJhc2UuamF2YQpAQCAtMCwwICsxLDE5MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiAgJCRSQ1NmaWxlOiBFTUZXb3JrYmVuY2hDb250ZXh0QmFzZS5qYXZhLHYgJCQKKyAqICAkJFJldmlzaW9uOiAxLjIgJCQgICQkRGF0ZTogMjAwNS8wMi8xNSAyMzowNDoxNCAkJCAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5ubHMuRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbi5KRU1VdGlsUGx1Z2luOworCisKKy8qKgorICogQ29udGV4dEJhc2UgZm9yIEVNRldvcmtiZW5jaC4KKyAqIAorICogPHA+CisgKiBUaGlzIGlzIG1lYW50IHRvIGJlIHN1YmNsYXNzZWQgYXMgbmVlZGVkIGZvciBhZGRpdGlvbmFsIG9yIG92ZXJyaWRlIGZ1bmN0aW9uLiBJdCB3aWxsIGJlIGluc3RhbnRpYXRlZCBieSBkZWZhdWx0LgorICogPC9wPgorICogCisgKiBAc2luY2UgMS4wLjAKKyAqLworcHVibGljIGNsYXNzIEVNRldvcmtiZW5jaENvbnRleHRCYXNlIHsKKworCXByb3RlY3RlZCBJUHJvamVjdCBwcm9qZWN0OworCisJcHJvdGVjdGVkIFByb2plY3RSZXNvdXJjZVNldCByZXNvdXJjZVNldDsKKworCS8qKgorCSAqIENvbnN0cnVjdCB3aXRoIGEgcHJvamVjdC4KKwkgKiAKKwkgKiBAcGFyYW0gYVByb2plY3QKKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgRU1GV29ya2JlbmNoQ29udGV4dEJhc2UoSVByb2plY3QgYVByb2plY3QpIHsKKwkJaWYgKGFQcm9qZWN0ID09IG51bGwpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKEVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVNRldvcmtiZW5jaENvbnRleHRCYXNlX0VSUk9SXzEiKSk7IC8vJE5PTi1OTFMtMSQKKwkJcHJvamVjdCA9IGFQcm9qZWN0OworCX0KKworCS8qKgorCSAqIERpc3Bvc2Ugb2YgdGhlIGNvbnRleHQgYmFzZS4KKwkgKiAKKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlpZiAocmVzb3VyY2VTZXQgIT0gbnVsbCkKKwkJCXJlc291cmNlU2V0LnJlbGVhc2UoKTsKKwkJcmVzb3VyY2VTZXQgPSBudWxsOworCQlwcm9qZWN0ID0gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIHByb2plY3QgdGhpcyBjb250ZXh0IGlzIGFzc29jaWF0ZWQgd2l0aC4KKwkgKiAKKwkgKiBAcmV0dXJuIHByb2plY3QKKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKKwkJcmV0dXJuIHByb2plY3Q7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSByZXNvdXJjZSBzZXQgKGNyZWF0aW5nIGlmIG5lZWRlZCkgZm9yIGNvbnRleHQuCisJICogCisJICogQHJldHVybiByZXNvdXJjZSBzZXQKKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgUHJvamVjdFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KCkgeworCQlpZiAocmVzb3VyY2VTZXQgPT0gbnVsbCkgeworCQkJcmVzb3VyY2VTZXQgPSBjcmVhdGVSZXNvdXJjZVNldCgpOworCQkJaW5pdGlhbGl6ZVJlc291cmNlU2V0KHJlc291cmNlU2V0KTsKKwkJfQorCQlyZXR1cm4gcmVzb3VyY2VTZXQ7CisJfQorCisJLyoqCisJICogVXNlZCBmb3Igb3B0aW1pemF0aW9uOyBhbnN3ZXIgd2hldGhlciBhIHJlc291cmNlU2V0IGhhcyBiZWVuIGNyZWF0ZWQKKwkgKiAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgcmVzb3VyY2Ugc2V0IGhhcyBiZWVuIGNyZWF0ZWQuCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIGJvb2xlYW4gaGFzUmVzb3VyY2VTZXQoKSB7CisJCXJldHVybiByZXNvdXJjZVNldCAhPSBudWxsOworCX0KKworCS8qKgorCSAqIEluaXRpYWxpemUgdGhlIHJlc291cmNlIHNldC4KKwkgKiAKKwkgKiBAcGFyYW0gYVJlc291cmNlU2V0CisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVJlc291cmNlU2V0KFByb2plY3RSZXNvdXJjZVNldCBhUmVzb3VyY2VTZXQpIHsKKwkJY3JlYXRlUmVzb3VyY2VTZXRTeW5jaHJvbml6ZXIoYVJlc291cmNlU2V0KTsKKwkJYVJlc291cmNlU2V0LnNldFVSSUNvbnZlcnRlcihjcmVhdGVVUklDb252ZXJ0ZXIoYVJlc291cmNlU2V0KSk7CisJCWFSZXNvdXJjZVNldC5hZGQobmV3IFdvcmtzcGFjZVJlc291cmNlSGFuZGxlcigpKTsKKwkJSkVNVXRpbFBsdWdpbi5nZXREZWZhdWx0KCkuYWRkRXh0ZW5kZWRSZXNvdXJjZUhhbmRsZXJzKGFSZXNvdXJjZVNldCk7CisKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgdGhlIHJlc291cmNlIHNldC4gQnkgZGVmYXVsdCBpdCBpcyBhIFByb2plY3RSZXNvdXJjZVNldEltcGwuCisJICogCisJICogQHJldHVybiBwcm9qZWN0J3MgbmV3IHJlc291cmNlIHNldC4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwcm90ZWN0ZWQgUHJvamVjdFJlc291cmNlU2V0IGNyZWF0ZVJlc291cmNlU2V0KCkgeworCQlpZiAocHJvamVjdCA9PSBudWxsKQorCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihFTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFTUZXb3JrYmVuY2hDb250ZXh0QmFzZV9FUlJPUl8yIikpOyAvLyROT04tTkxTLTEkCisJCXJldHVybiBuZXcgUHJvamVjdFJlc291cmNlU2V0SW1wbChwcm9qZWN0KTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSBVUklDb252ZXJ0ZXIgZm9yIHRoZSByZXNvdXJjZSBzZXQuCisJICogCisJICogQHBhcmFtIGFSZXNvdXJjZVNldAorCSAqIEByZXR1cm4gYSB1cmkgY29udmVydGVyLgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXByb3RlY3RlZCBXb3JrYmVuY2hVUklDb252ZXJ0ZXIgY3JlYXRlVVJJQ29udmVydGVyKFByb2plY3RSZXNvdXJjZVNldCBhUmVzb3VyY2VTZXQpIHsKKwkJcmV0dXJuIG5ldyBXb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsKGdldFByb2plY3QoKSwgYVJlc291cmNlU2V0LmdldFN5bmNocm9uaXplcigpKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSByZXNvdXJjZSBzZXQgd29ya2JlbmNoIHN5bmNocm9uaXplci4KKwkgKiAKKwkgKiBAcGFyYW0gYVJlc291cmNlU2V0CisJICogQHJldHVybiBhIHJlc291cmNlIHNldCB3b3JrYmVuY2ggc3luY2hyb25pemVyLgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXByb3RlY3RlZCBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciBjcmVhdGVSZXNvdXJjZVNldFN5bmNocm9uaXplcihQcm9qZWN0UmVzb3VyY2VTZXQgYVJlc291cmNlU2V0KSB7CisJCXJldHVybiBFTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeS5JTlNUQU5DRS5jcmVhdGVTeW5jaHJvbml6ZXIoYVJlc291cmNlU2V0LCBnZXRQcm9qZWN0KCkpOworCX0KKworCS8qKgorCSAqIERlbGV0ZSB0aGUgcmVzb3VyY2UgZnJvbSB0aGUgd29ya3NwYWNlLgorCSAqIAorCSAqIEBwYXJhbSBhUmVzb3VyY2UKKwkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgdm9pZCBkZWxldGVSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJaWYgKGFSZXNvdXJjZSAhPSBudWxsKQorCQkJZGVsZXRlRmlsZShhUmVzb3VyY2UpOworCX0KKworCS8qKgorCSAqIERlbGV0ZSB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlLgorCSAqIAorCSAqIEBwYXJhbSByZXNvdXJjZQorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyB2b2lkIGRlbGV0ZUZpbGUoUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKEVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVNRldvcmtiZW5jaENvbnRleHRCYXNlX0VSUk9SXzAiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBHZXQgcmVzb3VyY2UgKHdpdGggdGhlIGdpdmVuIFVSSSkgZnJvbSB0aGUgcHJvamVjdCByZXNvdXJjZSBzZXQuIExvYWQgaXQgaWYgbm90IGFscmVhZHkgbG9hZGVkLgorCSAqIAorCSAqIEBwYXJhbSB1cmkKKwkgKiBAcmV0dXJuIHJlc291cmNlIGZvciB0aGUgdXJpLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgZm91bmQuCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKFVSSSB1cmkpIHsKKwkJcmV0dXJuIHRoaXMucmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9GbGV4aWJsZVByb2plY3RSZXNvdXJjZVNldC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvRmxleGlibGVQcm9qZWN0UmVzb3VyY2VTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTIzMWYwCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvRmxleGlibGVQcm9qZWN0UmVzb3VyY2VTZXQuamF2YQpAQCAtMCwwICsxLDY4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2g7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UuRmFjdG9yeTsKKworCitwdWJsaWMgaW50ZXJmYWNlIEZsZXhpYmxlUHJvamVjdFJlc291cmNlU2V0IGV4dGVuZHMgUHJvamVjdFJlc291cmNlU2V0IHsKKwkKKwkKKwkvKioKKwkgICAqIFJldHVybnMgdGhlIHJlc291cmNlIHJlc29sdmVkIGJ5IHRoZSBVUkkuCisJICAgKiA8cD4KKwkgICAqIEEgcmVzb3VyY2Ugc2V0IGlzIGV4cGVjdGVkIHRvIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIHN0cmF0ZWd5IAorCSAgICogaW4gb3JkZXIgdG8gcmVzb2x2ZSB0aGUgZ2l2ZW4gVVJJIHRvIGEgcmVzb3VyY2UuCisJICAgKiBGaXJzdCBpdCB1c2VzIGl0J3Mge0BsaW5rICNnZXRVUklDb252ZXJ0ZXIgVVJJIGNvbnZlcnRlcn0gdG8ge0BsaW5rIFVSSUNvbnZlcnRlciNub3JtYWxpemUgbm9ybWFsaXplfSB0aGUgVVJJIAorCSAgICogYW5kIHRoZW4gdG8gY29tcGFyZSBpdCB3aXRoIHRoZSBub3JtYWxpemVkIFVSSSBvZiBlYWNoIHJlc291cmNlOworCSAgICogaWYgaXQgZmluZHMgYSBtYXRjaCwgCisJICAgKiB0aGF0IHJlc291cmNlIGJlY29tZXMgdGhlIHJlc3VsdC4KKwkgICAqIEZhaWxpbmcgdGhhdCwKKwkgICAqIGl0IHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGwjZGVsZWdhdGVkR2V0UmVzb3VyY2UgZGVsZWdhdGVzfSAKKwkgICAqIHRvIGFsbG93IHRoZSBVUkkgdG8gYmUgcmVzb2x2ZWQgZWxzZXdoZXJlLgorCSAgICogRm9yIGV4YW1wbGUsIAorCSAgICogdGhlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkjSU5TVEFOQ0UgcGFja2FnZSByZWdpc3RyeX0KKwkgICAqIGlzIHVzZWQgdG8ge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSNnZXRFUGFja2FnZSByZXNvbHZlfSAKKwkgICAqIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlIG5hbWVzcGFjZSBVUkl9IG9mIGEgcGFja2FnZQorCSAgICogdG8gdGhlIHN0YXRpYyBpbnN0YW5jZSBvZiB0aGF0IHBhY2thZ2UuCisJICAgKiBTbyB0aGUgaW1wb3J0YW50IHBvaW50IGlzIHRoYXQgYW4gYXJiaXRyYXJ5IGltcGxlbWVudGF0aW9uIG1heSByZXNvbHZlIHRoZSBVUkkgdG8gYW55IHJlc291cmNlLAorCSAgICogbm90IG5lY2Vzc2FyaWx5IHRvIG9uZSBjb250YWluZWQgYnkgdGhpcyBwYXJ0aWN1bGFyIHJlc291cmNlIHNldC4KKwkgICAqIElmIHRoZSBkZWxlZ2F0aW9uIHN0ZXAgZmFpbHMgdG8gcHJvdmlkZSBhIHJlc3VsdCwKKwkgICAqIGFuZCBpZiA8Y29kZT5sb2FkT25EZW1hbmQ8L2NvZGU+IGlzIDxjb2RlPnRydWU8L2NvZGU+LAorCSAgICogYSByZXNvdXJjZSBpcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsI2RlbWFuZENyZWF0ZVJlc291cmNlIGNyZWF0ZWR9IAorCSAgICogYW5kIHRoYXQgcmVzb3VyY2UgYmVjb21lcyB0aGUgcmVzdWx0LgorCSAgICogSWYgPGNvZGU+bG9hZE9uRGVtYW5kPC9jb2RlPiBpcyA8Y29kZT50cnVlPC9jb2RlPgorCSAgICogYW5kIHRoZSByZXN1bHQgcmVzb3VyY2UgaXMgbm90IHtAbGluayBSZXNvdXJjZSNpc0xvYWRlZCBsb2FkZWR9LCAKKwkgICAqIGl0IHdpbGwgYmUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbCNkZW1hbmRMb2FkIGxvYWRlZH0gYmVmb3JlIGl0IGlzIHJldHVybmVkLgorCSAgICogPC9wPgorCSAgICogQHBhcmFtIHVyaSB0aGUgVVJJIHRvIHJlc29sdmUuCisJICAgKiBAcGFyYW0gbG9hZE9uRGVtYW5kIHdoZXRoZXIgdG8gY3JlYXRlIGFuZCBsb2FkIHRoZSByZXNvdXJjZSwgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0cy4KKwkgICAqIEBwYXJhbSByZWdpc3RlcmVkRmFjdG9yeSB0aGF0IGlzIHVzZWQgdG8gY3JlYXRlIHJlc291cmNlIGlmIG5lZWRlZCAKKwkgICAqIEByZXR1cm4gdGhlIHJlc291cmNlIHJlc29sdmVkIGJ5IHRoZSBVUkksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzbid0IG9uZSBhbmQgaXQncyBub3QgYmVpbmcgZGVtYW5kIGxvYWRlZC4KKwkgICAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiBpZiBhIHJlc291cmNlIGNhbid0IGJlIGRlbWFuZCBjcmVhdGVkLgorCSAgICogQHRocm93cyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbiBpZiBhIHByb2JsZW0gb2NjdXJzIGR1cmluZyBkZW1hbmQgbG9hZC4KKwkgICAqIEBzaW5jZSAyLjEKKwkgICAqLworCQorCVJlc291cmNlIGdldFJlc291cmNlKFVSSSB1cmksIGJvb2xlYW4gbG9hZE9uRGVtYW5kLCBGYWN0b3J5IHJlZ2lzdGVyZWRGYWN0b3J5KTsKKwkKKwkvKioKKwkgICAqIENyZWF0ZXMgYSBuZXcgcmVzb3VyY2UsIG9mIHRoZSBhcHByb3ByaWF0ZSB0eXBlLCBhbmQgcmV0dXJucyBpdC4KKwkgICAqIDxwPgorCSAgICogSXQgZGVsZWdhdGVzIHRvIHRoZSByZXNvdXJjZSBmYWN0b3J5IHtAbGluayAjZ2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnl9IAorCSAgICogdG8gZGV0ZXJtaW5lIHRoZSB7QGxpbmsgUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeSNnZXRGYWN0b3J5IGNvcnJlY3R9IGZhY3RvcnksCisJICAgKiBhbmQgdGhlbiBpdCB1c2VzIHRoYXQgZmFjdG9yeSB0byB7QGxpbmsgUmVzb3VyY2UuRmFjdG9yeSNjcmVhdGVSZXNvdXJjZSBjcmVhdGV9IHRoZSByZXNvdXJjZQorCSAgICogYW5kIGFkZCBpdCB0byB0aGUge0BsaW5rICNnZXRSZXNvdXJjZXMgY29udGVudHN9LgorCSAgICogSWYgdGhlcmUgaXMgbm8gcmVnaXN0ZXJlZCBmYWN0b3J5LCA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIGJlIHJldHVybmVkOworCSAgICogd2hlbiBydW5uaW5nIHdpdGhpbiBFY2xpcHNlLAorCSAgICogYSBkZWZhdWx0IFhNSSBmYWN0b3J5IHdpbGwgYmUgcmVnaXN0ZXJlZCwKKwkgICAqIGFuZCB0aGlzIHdpbGwgbmV2ZXIgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorCSAgICogPC9wPgorCSAgICogQHBhcmFtIHVyaSB0aGUgVVJJIG9mIHRoZSByZXNvdXJjZSB0byBjcmVhdGUuCisJICAgKiBAcGFyYW0gcmVzb3VyY2VGYWN0b3J5IAorCSAgICogQHJldHVybiBhIG5ldyByZXNvdXJjZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gZmFjdG9yeSBpcyByZWdpc3RlcmVkLgorCSAgICovCisJCisJcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFJlc291cmNlLkZhY3RvcnkgcmVzb3VyY2VGYWN0b3J5KTsKKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvSUVNRkNvbnRleHRDb250cmlidXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvSUVNRkNvbnRleHRDb250cmlidXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NWQ3ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9JRU1GQ29udGV4dENvbnRyaWJ1dG9yLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiAgJCRSQ1NmaWxlOiBJRU1GQ29udGV4dENvbnRyaWJ1dG9yLmphdmEsdiAkJAorICogICQkUmV2aXNpb246IDEuMiAkJCAgJCREYXRlOiAyMDA1LzAyLzE1IDIzOjA0OjE0ICQkIAorICovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaDsKKworLyoqCisgKiBFTUYgQ29udGV4dCBDb250cmlidXRvciBpbnRlcmZhY2UuIEltcGxpbWVudGVycyBhcmUgY2FsbGVkIHRvIGNvbnRyaWJ1dGUgdG8gdGhlIGNvbnRleHQuCisgKiAKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UjY3JlYXRlRU1GQ29udGV4dChJUHJvamVjdCwgSUVNRkNvbnRleHRDb250cmlidXRvcikKKyAqIEBzaW5jZSAxLjAuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIElFTUZDb250ZXh0Q29udHJpYnV0b3IgeworCisJLyoqCisJICogVGhpcyBpcyB5b3VyIG9wcG9ydHVuaXR5IHRvIGFkZCBhIHByaW1hcnkgRU1GTmF0dXJlLiBUeXBpY2FsbHkgeW91IHdvdWxkIGFkZCB0byB0aGUgV29ya2JlbmNoQ29udGV4dCBoZWxkIGJ5IDxjb2RlPmFOYXR1cmU8L2NvZGU+IGluIG9yZGVyIHRvCisJICogY2hhbmdlIHRoZSBjb250YWluZXIgZm9yIHRoZSBXb3JrYmVuY2hVUklDb252ZXJ0ZXIgb3IgYWRkIGFkYXB0ZXIgZmFjdG9yaWVzIHRvIHRoZSBSZXNvdXJjZVNldCBvciBhbnl0aGluZyBlbHNlIHRoYXQgaXMgbmVlZGVkLgorCSAqIAorCSAqIEBwYXJhbSBhTmF0dXJlCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJdm9pZCBwcmltYXJ5Q29udHJpYnV0ZVRvQ29udGV4dChFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBhTmF0dXJlKTsKKworCS8qKgorCSAqIFRoaXMgaXMgeW91ciBvcHBvcnR1bml0eSB0byBhZGQgYSBzZWNvbmRhcnkgRU1GTmF0dXJlLiBUeXBpY2FsbHkgeW91IHdvdWxkIGFkZCB0byB0aGUgV29ya2JlbmNoQ29udGV4dCBoZWxkIGJ5IDxjb2RlPmFOYXR1cmU8L2NvZGU+IGluIG9yZGVyCisJICogdG8gY2hhbmdlIHRoZSBjb250YWluZXIgZm9yIHRoZSBXb3JrYmVuY2hVUklDb252ZXJ0ZXIgb3IgYWRkIGFkYXB0ZXIgZmFjdG9yaWVzIHRvIHRoZSBSZXNvdXJjZVNldCBvciBhbnl0aGluZyBlbHNlIHRoYXQgaXMgbmVlZGVkLgorCSAqIAorCSAqIEBwYXJhbSBhTmF0dXJlCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJdm9pZCBzZWNvbmRhcnlDb250cmlidXRlVG9Db250ZXh0KEVNRldvcmtiZW5jaENvbnRleHRCYXNlIGFOYXR1cmUpOworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvSVN5bmNocm9uaXplckV4dGVuZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9JU3luY2hyb25pemVyRXh0ZW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzBkZDFlCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvSVN5bmNocm9uaXplckV4dGVuZGVyLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiAgJCRSQ1NmaWxlOiBJU3luY2hyb25pemVyRXh0ZW5kZXIuamF2YSx2ICQkCisgKiAgJCRSZXZpc2lvbjogMS4yICQkICAkJERhdGU6IDIwMDUvMDIvMTUgMjM6MDQ6MTQgJCQgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOworCisvKioKKyAqIEltcGxpbWVudGVycyBhbGxvd3MgY2xpZW50cywgZWcge0BsaW5rIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guRU1GTmF0dXJlQ29udHJpYnV0b3J9LCB0byBleHRlbmQgdGhlIGJlaGF2aW9yIG9mIHRoZQorICogUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIuCisgKiAKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5SZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciNhZGRFeHRlbmRlcihJU3luY2hyb25pemVyRXh0ZW5kZXIpCisgKiBAc2luY2UgMS4wLjAKKyAqLworcHVibGljIGludGVyZmFjZSBJU3luY2hyb25pemVyRXh0ZW5kZXIgeworCisJLyoqCisJICogTm90aWZpY2F0aW9uIHRoYXQgcHJvamVjdCBoYXMgY2hhbmdlZC4KKwkgKiAKKwkgKiBAcGFyYW0gZGVsdGEKKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwl2b2lkIHByb2plY3RDaGFuZ2VkKElSZXNvdXJjZURlbHRhIGRlbHRhKTsKKworCS8qKgorCSAqIE5vdGlmaWNhdGlvbiB0aGF0IHByb2plY3QgaGFzIGJlZW4gY2xvc2VkLgorCSAqIAorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXZvaWQgcHJvamVjdENsb3NlZCgpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1Byb2plY3RSZXNvdXJjZVNldC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvUHJvamVjdFJlc291cmNlU2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM5NzY5OQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1Byb2plY3RSZXNvdXJjZVNldC5qYXZhCkBAIC0wLDAgKzEsMTE5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqICAkJFJDU2ZpbGU6IFByb2plY3RSZXNvdXJjZVNldC5qYXZhLHYgJCQKKyAqICAkJFJldmlzaW9uOiAxLjUgJCQgICQkRGF0ZTogMjAwNy8wOC8zMCAwMjozNzowNSAkJCAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKKworLyoqCisgKiBBIFJlc291cmNlU2V0IGZvciBhbiBlbnRpcmUgcHJvamVjdC4gSXQgYWxsb3dzIHNoYXJpbmcgb2YgcmVzb3VyY2VzIGZyb20gbXVsdGlwbGUgZWRpdG9ycy92aWV3ZXJzIGZvciBhIHByb2plY3QuCisgKiA8cD4KKyAqIEFuIGFkZGl0aW9uYWwgTm90aWZpY2F0aW9uIHR5cGUgaXMgc2VudCBvdXQgYnkgUHJvamVjdFJlc291cmNlU2V0J3Mgb2YgcHJvamVjdCByZXNvdXJjZSBzZXQgYWJvdXQgdG8gYmUgcmVsZWFzZWQuIEEgcmVsZWFzZSBpcworICogY2FsbGVkIHdoZW4gcHJvamVjdHMgYXJlIGFib3V0IHRvIGJlIGNsb3NlZC4gVGhleSByZWxlYXNlIGFsbCBvZiB0aGUgcmVzb3VyY2VzIGFuZCB1bmxvYWQgdGhlbS4gVGhpcyBub3RpZmljYXRpb24gY2FuIGJlIHVzZWQgCisgKiB0byBrbm93IHRoYXQgdGhpcyBpcyBhYm91dCB0byBoYXBwZW4gYW5kIHRvIGRvIHNvbWV0aGluZyBiZWZvcmUgdGhlIHJlc291cmNlcyBiZWNvbWUgaW52YWxpZC4gSXQgd2lsbCBiZSBzZW50IG91dCBqdXN0IGJlZm9yZSB0aGUKKyAqIHJlc291cmNlIHNldCB3aWxsIGJlIHJlbGVhc2VkLiAKKyAqIAorICogQHNlZSBQcm9qZWN0UmVzb3VyY2VTZXQjU1BFQ0lBTF9OT1RJRklDQVRJT05fVFlQRQorICogQHNlZSBQcm9qZWN0UmVzb3VyY2VTZXQjUFJPSkVDVFJFU09VUkNFU0VUX0FCT1VUX1RPX1JFTEVBU0VfSUQgCisgKiBAc2luY2UgMS4wLjAKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIFByb2plY3RSZXNvdXJjZVNldCBleHRlbmRzIFJlc291cmNlU2V0IHsKKworCUlQcm9qZWN0IGdldFByb2plY3QoKTsKKwkKKwkvKioKKwkgKiBOb3RpZmljYXRpb24gdHlwZSBpbiBub3RpZmljYXRpb25zIGZyb20gdGhlIFByb2plY3RSZXNvdXJjZVNldCBmb3IKKwkgKiBzcGVjaWFsIG5vdGlmaWNhdGlvbnMsIGFuZCBub3QgdGhlIHN0YW5kYXJkIG9uZXMgZnJvbSBSZXNvdXJjZVNldC4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiNnZXRFdmVudFR5cGUoKQorCSAqIEBzaW5jZSAxLjEuMAorCSAqLworCXN0YXRpYyBpbnQgU1BFQ0lBTF9OT1RJRklDQVRJT05fVFlQRSA9IE5vdGlmaWNhdGlvbi5FVkVOVF9UWVBFX0NPVU5UKzQ7CisJCisJLyoqCisJICogTm90aWZpY2F0aW9uIEZlYXR1cmUgSUQgZm9yIHJlc291cmNlIHNldCBhYm91dCB0byBiZSByZWxlYXNlZC4KKwkgKiBVc2Uge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiNnZXRGZWF0dXJlSUQoamF2YS5sYW5nLkNsYXNzKX0gdG8KKwkgKiBnZXQgdGhpcyBpZC4gVGhlIGdldEZlYXR1cmUoKSBvbiBub3RpZmljYXRpb24gd2lsbCByZXR1cm4gbnVsbC4KKwkgKiAKKwkgKiBAc2luY2UgMS4xLjAKKwkgKi8KKwlzdGF0aWMgaW50IFBST0pFQ1RSRVNPVVJDRVNFVF9BQk9VVF9UT19SRUxFQVNFX0lEID0gMTAwMDsKKworCS8qKgorCSAqIENhbGwgd2hlbiB0aGUgUmVzb3VyY2VTZXQgaXMgbm8gbG9uZ2VyIHRvIGJlIHVzZWQuCisJICogCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJdm9pZCByZWxlYXNlKCk7CisKKwkvKioKKwkgKiBBZGQgdGhlIDxjb2RlPnJlc291cmNlSGFuZGxlcjwvY29kZT4gdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBvZiByZXNvdXJjZUhhbmRsZXJzLgorCSAqIAorCSAqIEBwYXJhbSByZXNvdXJjZUhhbmRsZXIKKwkgKiAgICAgICAgICAgIElSZXNvdXJjZUhhbmRsZXIKKwkgKiBAcmV0dXJuIGJvb2xlYW4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGl0IHdhcyBhZGRlZC4KKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlib29sZWFuIGFkZChSZXNvdXJjZUhhbmRsZXIgcmVzb3VyY2VIYW5kbGVyKTsKKworCS8qKgorCSAqIEFkZCB0aGUgPGNvZGU+cmVzb3VyY2VIYW5kbGVyPC9jb2RlPiB0byB0aGUgZnJvbnQgb2YgdGhlIGxpc3Qgb2YgcmVzb3VyY2VIYW5kbGVycy4KKwkgKiAKKwkgKiBAcGFyYW0gcmVzb3VyY2VIYW5kbGVyCisJICogICAgICAgICAgICBJUmVzb3VyY2VIYW5kbGVyCisJICogQHNpbmNlIDEuMC4wCisJICovCisJdm9pZCBhZGRGaXJzdChSZXNvdXJjZUhhbmRsZXIgcmVzb3VyY2VIYW5kbGVyKTsKKworCS8qKgorCSAqIFJlbW92ZSB0aGUgPGNvZGU+cmVzb3VyY2VIYW5kbGVyPC9jb2RlPiBmcm9tIHRoZSBsaXN0IG9mIHJlc291cmNlSGFuZGxlcnMuCisJICogCisJICogQHBhcmFtIHJlc291cmNlSGFuZGxlcgorCSAqICAgICAgICAgICAgSVJlc291cmNlSGFuZGxlcgorCSAqIEByZXR1cm4gYm9vbGVhbiBSZXR1cm4gdHJ1ZSBpZiBpdCB3YXMgcmVtb3ZlZC4KKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlib29sZWFuIHJlbW92ZShSZXNvdXJjZUhhbmRsZXIgcmVzb3VyY2VIYW5kbGVyKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgUmVzb3VyY2VTZXQgc3luY2hyb25pemVyIHRoYXQgd2lsbCBzeW5jaHJvbml6ZSB0aGUgUmVzb3VyY2VTZXQgd2l0aCBjaGFuZ2VzIGZyb20gdGhlIFdvcmtiZW5jaC4KKwkgKiAKKwkgKiBAcmV0dXJuIFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyCisJICogQHNpbmNlIDEuMC4wCisJICovCisJUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgZ2V0U3luY2hyb25pemVyKCk7CisKKwkvKioKKwkgKiBTZXQgdGhlIFJlc291cmNlU2V0IHN5bmNocm9uaXplciB0aGF0IHdpbGwgc3luY2hyb25pemUgdGhlIFJlc291cmNlU2V0IHdpdGggY2hhbmdlcyBmcm9tIHRoZSBXb3JrYmVuY2guCisJICogCisJICogQHBhcmFtIGFTeW5jaHJvbml6ZXIKKwkgKiBAcmV0dXJuIFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyCisJICogQHNpbmNlIDEuMC4wCisJICovCisJdm9pZCBzZXRTeW5jaHJvbml6ZXIoUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgYVN5bmNocm9uaXplcik7CisKKwkvKioKKwkgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYnkgY2xpZW50cyB3aGVuZXZlciB0aGUgc3RydWN0dXJlIG9mIHRoZSBwcm9qZWN0IGNoYW5nZXMgc3VjaCB0aGF0IGFueSBjYWNoZWQgVVJJcyB3aWxsIGJlIGludmFsaWQuIEZvciBleGFtcGxlLCBpZiB0aGUKKwkgKiBzb3VyY2UgZm9sZGVycyB3aXRoaW4gdGhlIFVSSUNvbnZlcnRlciBjaGFuZ2UuCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJdm9pZCByZXNldE5vcm1hbGl6ZWRVUklDYWNoZSgpOworCisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9Qcm9qZWN0VXRpbGl0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9Qcm9qZWN0VXRpbGl0aWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFlMmU4MQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1Byb2plY3RVdGlsaXRpZXMuamF2YQpAQCAtMCwwICsxLDc3NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiAgJCRSQ1NmaWxlOiBQcm9qZWN0VXRpbGl0aWVzLmphdmEsdiAkJAorICogICQkUmV2aXNpb246IDEuNiAkJCAgJCREYXRlOiAyMDA4LzAzLzA1IDE5OjQzOjE4ICQkIAorICovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaDsKKworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW47CisKKworLyoqCisgKiBFTUYgV29ya2JlbmNoIFByb2plY3QgVXRpbGl0aWVzLgorICogCisgKiBAc2luY2UgMS4wLjAKKyAqLworCitwdWJsaWMgY2xhc3MgUHJvamVjdFV0aWxpdGllcyB7CisKKwkvKioKKwkgKiBQcm9qZWN0IGNvbnRyb2wgZmlsZSBuYW1lIGluIHByb2plY3QuCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRE9UX1BST0pFQ1QgPSAiLnByb2plY3QiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBDbGFzc3BhdGggY29udHJvbCBmaWxlIG5hbWUgaW4gcHJvamVjdC4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBET1RfQ0xBU1NQQVRIID0gIi5jbGFzc3BhdGgiOyAvLyROT04tTkxTLTEkCisKKwlwdWJsaWMgUHJvamVjdFV0aWxpdGllcygpIHsKKwl9CisKKwkvKioKKwkgKiBBZGQgdGhlIG5hdHVyZSBpZCB0byB0aGUgcHJvamVjdCBhaGVhZCBvZiBhbGwgb3RoZXIgbmF0dXJlIGlkcy4KKwkgKiAKKwkgKiBAcGFyYW0gcHJvagorCSAqIEBwYXJhbSBuYXR1cmVJZAorCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGROYXR1cmVUb1Byb2plY3QoSVByb2plY3QgcHJvaiwgU3RyaW5nIG5hdHVyZUlkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qLmdldERlc2NyaXB0aW9uKCk7CisJCVN0cmluZ1tdIHByZXZOYXR1cmVzID0gZGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7CisJCVN0cmluZ1tdIG5ld05hdHVyZXMgPSBuZXcgU3RyaW5nW3ByZXZOYXR1cmVzLmxlbmd0aCArIDFdOworCQlTeXN0ZW0uYXJyYXljb3B5KHByZXZOYXR1cmVzLCAwLCBuZXdOYXR1cmVzLCAxLCBwcmV2TmF0dXJlcy5sZW5ndGgpOworCQluZXdOYXR1cmVzWzBdID0gbmF0dXJlSWQ7CisJCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXdOYXR1cmVzKTsKKwkJcHJvai5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7CisJfQorCisJLyoqCisJICogQWRkIHRoZSBuYXR1cmUgaWQgYWZ0ZXIgYWxsIG9mIHRoZSBvdGhlciBuYXR1cmUgaWRzIGZvciB0aGUgcHJvamVjdC4KKwkgKiAKKwkgKiBAcGFyYW0gcHJvagorCSAqIEBwYXJhbSBuYXR1cmVJZAorCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGROYXR1cmVUb1Byb2plY3RMYXN0KElQcm9qZWN0IHByb2osIFN0cmluZyBuYXR1cmVJZCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvai5nZXREZXNjcmlwdGlvbigpOworCQlTdHJpbmdbXSBwcmV2TmF0dXJlcyA9IGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpOworCQlTdHJpbmdbXSBuZXdOYXR1cmVzID0gbmV3IFN0cmluZ1twcmV2TmF0dXJlcy5sZW5ndGggKyAxXTsKKwkJU3lzdGVtLmFycmF5Y29weShwcmV2TmF0dXJlcywgMCwgbmV3TmF0dXJlcywgMCwgcHJldk5hdHVyZXMubGVuZ3RoKTsKKwkJbmV3TmF0dXJlc1twcmV2TmF0dXJlcy5sZW5ndGhdID0gbmF0dXJlSWQ7CisJCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXdOYXR1cmVzKTsKKwkJcHJvai5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7CisJfQorCisJLyoqCisJICogUmVtb3ZlIHRoZSBuYXR1cmUgaWQgZnJvbSB0aGUgcHJvamVjdC4KKwkgKiAKKwkgKiBAcGFyYW0gcHJvamVjdAorCSAqIEBwYXJhbSBuYXR1cmVJZAorCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVOYXR1cmVGcm9tUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgbmF0dXJlSWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKKwkJU3RyaW5nW10gcHJldk5hdHVyZXMgPSBkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKTsKKwkJaW50IHNpemUgPSBwcmV2TmF0dXJlcy5sZW5ndGg7CisJCWludCBuZXdzaXplID0gMDsKKwkJU3RyaW5nW10gbmV3TmF0dXJlcyA9IG5ldyBTdHJpbmdbc2l6ZV07CisJCWJvb2xlYW4gbWF0Y2hmb3VuZCA9IGZhbHNlOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJaWYgKHByZXZOYXR1cmVzW2ldLmVxdWFscyhuYXR1cmVJZCkpIHsKKwkJCQltYXRjaGZvdW5kID0gdHJ1ZTsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZQorCQkJCW5ld05hdHVyZXNbbmV3c2l6ZSsrXSA9IHByZXZOYXR1cmVzW2ldOworCQl9CisJCWlmICghbWF0Y2hmb3VuZCkKKwkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkVNVXRpbFBsdWdpbi5JRCwgMCwKKwkJCQkJIlRoZSBuYXR1cmUgaWQgIiArIG5hdHVyZUlkICsgIiBkb2VzIG5vdCBleGlzdCBvbiB0aGUgcHJvamVjdCAiICsgcHJvamVjdC5nZXROYW1lKCksIG51bGwpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJZWxzZSB7CisJCQlTdHJpbmdbXSB0ZW1wID0gbmV3TmF0dXJlczsKKwkJCW5ld05hdHVyZXMgPSBuZXcgU3RyaW5nW25ld3NpemVdOworCQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCBuZXdOYXR1cmVzLCAwLCBuZXdzaXplKTsKKwkJCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXdOYXR1cmVzKTsKKwkJCXByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOworCQl9CisJfQorCisJLyoqCisJICogQWRkIHRoZSBsaXN0IG9mIHByb2plY3RzIHRvIGVuZCBvZiB0aGUgInJlZmVyZW5jZWQgcHJvamVjdHMiIGxpc3QgZnJvbSB0aGUgcHJvamVjdCdzIGRlc2NyaXB0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBwcm9qZWN0CisJICogQHBhcmFtIHRvQmVBZGRlZFByb2plY3RzTGlzdAorCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRSZWZlcmVuY2VQcm9qZWN0cyhJUHJvamVjdCBwcm9qZWN0LCBMaXN0IHRvQmVBZGRlZFByb2plY3RzTGlzdCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCisJCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7CisJCUlQcm9qZWN0W10gcHJvamVjdHMgPSBkZXNjcmlwdGlvbi5nZXRSZWZlcmVuY2VkUHJvamVjdHMoKTsKKworCQlBcnJheUxpc3QgcHJvamVjdHNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKKwkJCXByb2plY3RzTGlzdC5hZGQocHJvamVjdHNbaV0pOworCQl9CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b0JlQWRkZWRQcm9qZWN0c0xpc3Quc2l6ZSgpOyBpKyspIHsKKwkJCXByb2plY3RzTGlzdC5hZGQodG9CZUFkZGVkUHJvamVjdHNMaXN0LmdldChpKSk7CisJCX0KKworCQlJUHJvamVjdFtdIHJlZlByb2plY3RzID0gbmV3IElQcm9qZWN0W3Byb2plY3RzTGlzdC5zaXplKCldOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmUHJvamVjdHMubGVuZ3RoOyBpKyspIHsKKwkJCXJlZlByb2plY3RzW2ldID0gKElQcm9qZWN0KSAocHJvamVjdHNMaXN0LmdldChpKSk7CisJCX0KKworCQlkZXNjcmlwdGlvbi5zZXRSZWZlcmVuY2VkUHJvamVjdHMocmVmUHJvamVjdHMpOworCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKKwl9CisKKwkvKioKKwkgKiBBZGQgdGhlIHNpbmdsZSBwcm9qZWN0IHRvIHRoZSBlbmQgb2YgdGhlICJyZWZlcmVuY2VkIHByb2plY3RzIiBsaXN0IGZyb20gdGhlIHByb2plY3QncyBkZXNjcmlwdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gcHJvamVjdAorCSAqIEBwYXJhbSBwcm9qZWN0VG9CZUFkZGVkCisJICogQHRocm93cyBDb3JlRXhjZXB0aW9uCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGFkZFJlZmVyZW5jZVByb2plY3RzKElQcm9qZWN0IHByb2plY3QsIElQcm9qZWN0IHByb2plY3RUb0JlQWRkZWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKKwkJSVByb2plY3RbXSBwcm9qZWN0cyA9IGRlc2NyaXB0aW9uLmdldFJlZmVyZW5jZWRQcm9qZWN0cygpOworCisJCUFycmF5TGlzdCBwcm9qZWN0c0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgeworCQkJcHJvamVjdHNMaXN0LmFkZChwcm9qZWN0c1tpXSk7CisJCX0KKworCQlwcm9qZWN0c0xpc3QuYWRkKHByb2plY3RUb0JlQWRkZWQpOworCisJCUlQcm9qZWN0W10gcmVmUHJvamVjdHMgPSBuZXcgSVByb2plY3RbcHJvamVjdHNMaXN0LnNpemUoKV07CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZQcm9qZWN0cy5sZW5ndGg7IGkrKykgeworCQkJcmVmUHJvamVjdHNbaV0gPSAoSVByb2plY3QpIChwcm9qZWN0c0xpc3QuZ2V0KGkpKTsKKwkJfQorCisJCWRlc2NyaXB0aW9uLnNldFJlZmVyZW5jZWRQcm9qZWN0cyhyZWZQcm9qZWN0cyk7CisJCXByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOworCX0KKworCS8qKgorCSAqIEZvcmNlIGEgYW4gaW1tZWRpYXRlIGJ1aWxkIG9mIHRoZSBwcm9qZWN0LgorCSAqIAorCSAqIEBwYXJhbSBwcm9qZWN0CisJICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBmb3JjZUF1dG9CdWlsZChJUHJvamVjdCBwcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgeworCQl0cnkgeworCQkJcHJvamVjdC5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkZVTExfQlVJTEQsIHByb2dyZXNzTW9uaXRvcik7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKKwkJCS8vUmV2aXNpdDogTmVlZCB0byB1c2UgYSBMb2dnZXIKKwkJCS8vTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGNlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybiBpZiBhdXRvIGJ1aWxkIGlzIHR1cm5lZCBvbi4KKwkgKiAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGF1dG8gYnVpbGQgaXMgdHVybmVkIG9uLgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRDdXJyZW50QXV0b0J1aWxkU2V0dGluZygpIHsKKworCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKKwkJSVdvcmtzcGFjZURlc2NyaXB0aW9uIHdkID0gd29ya3NwYWNlLmdldERlc2NyaXB0aW9uKCk7CisJCXJldHVybiB3ZC5pc0F1dG9CdWlsZGluZygpOworCX0KKworCS8qKgorCSAqIEdldCB0aGUgcHJvamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG9iamVjdC4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogICAgICAgICAgICBtYXkgYmUgYW4gPGNvZGU+SVByb2plY3QsIElSZXNvdXJjZSwgSUFkYXB0YWJsZSAodG8gYW4gSVByb2plY3QpLCBFT2JqZWN0IChnZXRzIElQcm9qZWN0IGlmIG9iamVjdCBpcyBpbiBhIFByb2plY3RSZXNvdXJjZVNldDwvY29kZT4uCisJICogQHBhcmFtIG5hdHVyZUlkCisJICogICAgICAgICAgICBpZiA8Y29kZT5udWxsPC9jb2RlPiB0aGVuIHJldHVybnMgcHJvamVjdC4gSWYgbm90IDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gcmV0dXJucyBwcm9qZWN0IG9ubHkgaWYgcHJvamVjdCBoYXMgdGhpcyBuYXR1cmUgaWQuCisJICogQHJldHVybiBwcm9qZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBmb3VuZC4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGdldFByb2plY3QoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG5hdHVyZUlkKSB7CisJCUlQcm9qZWN0IHJlc3VsdCA9IGdldFByb2plY3Qob2JqZWN0KTsKKwkJaWYgKG5hdHVyZUlkID09IG51bGwpCisJCQlyZXR1cm4gcmVzdWx0OworCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LmlzQWNjZXNzaWJsZSgpICYmIG5hdHVyZUlkICE9IG51bGwpCisJCQl0cnkgeworCQkJCWlmIChyZXN1bHQuaGFzTmF0dXJlKG5hdHVyZUlkKSkKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBwcm9qZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gb2JqZWN0LgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QKKwkgKiAgICAgICAgICAgIG1heSBiZSBhbiA8Y29kZT5JUHJvamVjdCwgSVJlc291cmNlLCBJQWRhcHRhYmxlICh0byBhbiBJUHJvamVjdCksIEVPYmplY3QgKGdldHMgSVByb2plY3QgaWYgb2JqZWN0IGlzIGluIGEgUHJvamVjdFJlc291cmNlU2V0PC9jb2RlPi4KKwkgKiBAcmV0dXJuIHByb2plY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBvYmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGZvdW5kLgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0UHJvamVjdChPYmplY3Qgb2JqZWN0KSB7CisJCUlQcm9qZWN0IHJlc3VsdCA9IG51bGw7CisKKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElQcm9qZWN0KQorCQkJcmVzdWx0ID0gKElQcm9qZWN0KSBvYmplY3Q7CisJCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElSZXNvdXJjZSkKKwkJCXJlc3VsdCA9ICgoSVJlc291cmNlKSBvYmplY3QpLmdldFByb2plY3QoKTsKKwkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkKKwkJCXJlc3VsdCA9IChJUHJvamVjdCkgKChJQWRhcHRhYmxlKSBvYmplY3QpLmdldEFkYXB0ZXIoSVByb2plY3QuY2xhc3MpOworCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KQorCQkJcmVzdWx0ID0gZ2V0UHJvamVjdCgoRU9iamVjdCkgb2JqZWN0KTsKKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIEdldCB0aGUgcHJvamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIEVPYmplY3QuIChJZiBpbiBhIFByb2plY3RSZXNvdXJjZVNldCwgdGhlbiB0aGUgcHJvamVjdCBmcm9tIHRoYXQgcmVzb3VyY2Ugc2V0KS4KKwkgKiAKKwkgKiBAcGFyYW0gYVJlZk9iamVjdAorCSAqIEByZXR1cm4gcHJvamVjdCBpZiBhc3NvY2lhdGVkIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBmb3VuZC4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGdldFByb2plY3QoRU9iamVjdCBhUmVmT2JqZWN0KSB7CisJCWlmIChhUmVmT2JqZWN0ICE9IG51bGwpIHsKKwkJCVJlc291cmNlIHJlc291cmNlID0gYVJlZk9iamVjdC5lUmVzb3VyY2UoKTsKKwkJCWlmIChyZXNvdXJjZSAhPSBudWxsKQorCQkJCXJldHVybiBnZXRQcm9qZWN0KHJlc291cmNlKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHVibGljIHN0YXRpYyBJRmlsZSBnZXRQbGF0Zm9ybUZpbGUoVVJJIHVyaSkgeworCQlpZiAoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmlzUGxhdGZvcm1SZXNvdXJjZVVSSSh1cmkpKSB7CisJCQlTdHJpbmcgZmlsZVN0cmluZyA9IFVSSS5kZWNvZGUodXJpLnBhdGgoKSk7CisJCQlmaWxlU3RyaW5nID0gZmlsZVN0cmluZy5zdWJzdHJpbmcoSkVNVXRpbFBsdWdpbi5QTEFURk9STV9SRVNPVVJDRS5sZW5ndGgoKSArIDEpOworCQkJcmV0dXJuIFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShuZXcgUGF0aChmaWxlU3RyaW5nKSk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBwcm9qZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gUmVzb3VyY2UuIChJZiBpbiBhIFByb2plY3RSZXNvdXJjZVNldCwgdGhlbiB0aGUgcHJvamVjdCBmcm9tIHRoYXQgcmVzb3VyY2Ugc2V0KS4KKwkgKiAKKwkgKiBAcGFyYW0gcmVzb3VyY2UKKwkgKiBAcmV0dXJuIHByb2plY3QgaWYgYXNzb2NpYXRlZCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgZm91bmQuCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0KFJlc291cmNlIHJlc291cmNlKSB7CisJCVJlc291cmNlU2V0IHNldCA9IHJlc291cmNlID09IG51bGwgPyBudWxsIDogcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKTsKKwkJaWYgKHNldCA9PSBudWxsKSB7CisJCQlVUkkgdXJpID0gcmVzb3VyY2UuZ2V0VVJJKCk7CisJCQlpZiAodXJpID09IG51bGwpIHJldHVybiBudWxsOworCQkJSUZpbGUgZmlsZSA9IGdldFBsYXRmb3JtRmlsZShyZXNvdXJjZS5nZXRVUkkoKSk7CisJCQlpZiAoZmlsZSA9PSBudWxsKSAKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCXJldHVybiBmaWxlLmdldFByb2plY3QoKTsKKwkJfQorCQkJCisJCWlmIChzZXQgaW5zdGFuY2VvZiBQcm9qZWN0UmVzb3VyY2VTZXQpCisJCQlyZXR1cm4gKChQcm9qZWN0UmVzb3VyY2VTZXQpIHNldCkuZ2V0UHJvamVjdCgpOworCQlVUklDb252ZXJ0ZXIgY29udmVydGVyID0gc2V0ID09IG51bGwgPyBudWxsIDogc2V0LmdldFVSSUNvbnZlcnRlcigpOworCQlpZiAoY29udmVydGVyICE9IG51bGwgJiYgY29udmVydGVyIGluc3RhbmNlb2YgV29ya2JlbmNoVVJJQ29udmVydGVyICYmICgoV29ya2JlbmNoVVJJQ29udmVydGVyKSBjb252ZXJ0ZXIpLmdldE91dHB1dENvbnRhaW5lcigpICE9IG51bGwpCisJCQlyZXR1cm4gKChXb3JrYmVuY2hVUklDb252ZXJ0ZXIpIGNvbnZlcnRlcikuZ2V0T3V0cHV0Q29udGFpbmVyKCkuZ2V0UHJvamVjdCgpOworCQllbHNlCisJCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZW1vdmUgdGhlIGxpc3Qgb2YgcHJvamVjdHMgZnJvbSB0aGUgbGlzdCBvZiAicmVmZXJlbmNlZCBwcm9qZWN0cyIgaW4gdGhlIHByb2plY3QncyBkZXNjcmlwdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gcHJvamVjdAorCSAqIEBwYXJhbSB0b0JlUmVtb3ZlZFByb2plY3RMaXN0CisJICogQHRocm93cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVSZWZlcmVuY2VQcm9qZWN0cyhJUHJvamVjdCBwcm9qZWN0LCBMaXN0IHRvQmVSZW1vdmVkUHJvamVjdExpc3QpIHRocm93cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbiB7CisJCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7CisJCUlQcm9qZWN0W10gcHJvamVjdHMgPSBkZXNjcmlwdGlvbi5nZXRSZWZlcmVuY2VkUHJvamVjdHMoKTsKKworCQlBcnJheUxpc3QgcHJvamVjdHNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKKwkJCXByb2plY3RzTGlzdC5hZGQocHJvamVjdHNbaV0pOworCQl9CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b0JlUmVtb3ZlZFByb2plY3RMaXN0LnNpemUoKTsgaSsrKSB7CisJCQlwcm9qZWN0c0xpc3QucmVtb3ZlKHRvQmVSZW1vdmVkUHJvamVjdExpc3QuZ2V0KGkpKTsKKwkJfQorCisJCUlQcm9qZWN0W10gcmVmUHJvamVjdHMgPSBuZXcgSVByb2plY3RbcHJvamVjdHNMaXN0LnNpemUoKV07CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZQcm9qZWN0cy5sZW5ndGg7IGkrKykgeworCQkJcmVmUHJvamVjdHNbaV0gPSAoSVByb2plY3QpIChwcm9qZWN0c0xpc3QuZ2V0KGkpKTsKKwkJfQorCisJCWRlc2NyaXB0aW9uLnNldFJlZmVyZW5jZWRQcm9qZWN0cyhyZWZQcm9qZWN0cyk7CisJCXByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOworCX0KKworCS8qKgorCSAqIFJlbW92ZSB0aGUgcHJvamVjdCBmcm9tIHRoZSBsaXN0IG9mICJyZWZlcmVuY2VkIHByb2plY3RzIiBpbiB0aGUgZGVzY3JpcHRpb24gZm9yIHRoZSBnaXZlbiBwcm9qZWN0LgorCSAqIAorCSAqIEBwYXJhbSBwcm9qZWN0CisJICogQHBhcmFtIHRvQmVSZW1vdmVkUHJvamVjdAorCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb24KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlUmVmZXJlbmNlUHJvamVjdHMoSVByb2plY3QgcHJvamVjdCwgSVByb2plY3QgdG9CZVJlbW92ZWRQcm9qZWN0KSB0aHJvd3Mgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb24geworCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOworCQlJUHJvamVjdFtdIHByb2plY3RzID0gZGVzY3JpcHRpb24uZ2V0UmVmZXJlbmNlZFByb2plY3RzKCk7CisKKwkJQXJyYXlMaXN0IHByb2plY3RzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7CisJCQlwcm9qZWN0c0xpc3QuYWRkKChwcm9qZWN0c1tpXSkpOworCQl9CisKKwkJcHJvamVjdHNMaXN0LnJlbW92ZSh0b0JlUmVtb3ZlZFByb2plY3QpOworCisJCUlQcm9qZWN0W10gcmVmUHJvamVjdHMgPSBuZXcgSVByb2plY3RbcHJvamVjdHNMaXN0LnNpemUoKV07CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZQcm9qZWN0cy5sZW5ndGg7IGkrKykgeworCQkJcmVmUHJvamVjdHNbaV0gPSAoSVByb2plY3QpIChwcm9qZWN0c0xpc3QuZ2V0KGkpKTsKKwkJfQorCisJCWRlc2NyaXB0aW9uLnNldFJlZmVyZW5jZWRQcm9qZWN0cyhyZWZQcm9qZWN0cyk7CisJCXByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOworCX0KKworCS8qKgorCSAqIFR1cm4gYXV0by1idWlsZGluZyBvZmYuCisJICogCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHR1cm5BdXRvQnVpbGRPZmYoKSB7CisJCXRyeSB7CisJCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKKwkJCUlXb3Jrc3BhY2VEZXNjcmlwdGlvbiB3ZCA9IHdvcmtzcGFjZS5nZXREZXNjcmlwdGlvbigpOworCQkJd2Quc2V0QXV0b0J1aWxkaW5nKGZhbHNlKTsKKwkJCXdvcmtzcGFjZS5zZXREZXNjcmlwdGlvbih3ZCk7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKKwkJCS8vTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGNlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFR1cm4gYXV0by1idWlsZGluZyBvbi4KKwkgKiAKKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgdHVybkF1dG9CdWlsZE9uKCkgeworCQl0cnkgeworCQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7CisJCQlJV29ya3NwYWNlRGVzY3JpcHRpb24gd2QgPSB3b3Jrc3BhY2UuZ2V0RGVzY3JpcHRpb24oKTsKKwkJCXdkLnNldEF1dG9CdWlsZGluZyh0cnVlKTsKKwkJCXdvcmtzcGFjZS5zZXREZXNjcmlwdGlvbih3ZCk7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKKwkJCS8vTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGNlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFNldCB0aGUgYXV0by1idWlsZGluZyBzdGF0ZS4KKwkgKiAKKwkgKiBAcGFyYW0gYUJvb2xlYW4KKwkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IHRvIHR1cm4gYXV0by1idWlsZGluZyBvbi4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgdHVybkF1dG9CdWlsZE9uKGJvb2xlYW4gYUJvb2xlYW4pIHsKKwkJdHJ5IHsKKwkJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOworCQkJSVdvcmtzcGFjZURlc2NyaXB0aW9uIHdkID0gd29ya3NwYWNlLmdldERlc2NyaXB0aW9uKCk7CisJCQl3ZC5zZXRBdXRvQnVpbGRpbmcoYUJvb2xlYW4pOworCQkJd29ya3NwYWNlLnNldERlc2NyaXB0aW9uKHdkKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgeworCQkJLy9Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoY2UpOworCisJCX0KKwl9CisKKwkvKioKKwkgKiBBZGRzIGEgYnVpbGRlciB0byB0aGUgYnVpbGQgc3BlYyBmb3IgdGhlIGdpdmVuIHByb2plY3QuCisJICogCisJICogQHBhcmFtIGJ1aWxkZXJJRAorCSAqICAgICAgICAgICAgVGhlIGlkIG9mIHRoZSBidWlsZGVyLgorCSAqIEBwYXJhbSBwcm9qZWN0CisJICogICAgICAgICAgICBQcm9qZWN0IHRvIGFkZCB0by4KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGJ1aWxkZXIgaWQgd2FzIGFjdHVhbGx5IGFkZGVkIChpdCBtYXkgaGF2ZSBhbHJlYWR5IGV4aXN0ZWQpCisJICogQHRocm93cyBDb3JlRXhjZXB0aW9uCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGFkZFRvQnVpbGRTcGVjKFN0cmluZyBidWlsZGVySUQsIElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGFkZFRvQnVpbGRTcGVjQmVmb3JlKGJ1aWxkZXJJRCwgbnVsbCwgcHJvamVjdCk7CisJfQorCisJLyoqCisJICogQWRkcyBhIGJ1aWxkZXIgdG8gdGhlIGJ1aWxkIHNwZWMgZm9yIHRoZSBnaXZlbiBwcm9qZWN0LCBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIHNwZWNpZmllZCBzdWNjZXNzb3IgYnVpbGRlci4KKwkgKiAKKwkgKiBAcGFyYW0gYnVpbGRlcklECisJICogICAgICAgICAgICBUaGUgaWQgb2YgdGhlIGJ1aWxkZXIuCisJICogQHBhcmFtIHN1Y2Nlc3NvcklECisJICogICAgICAgICAgICBUaGUgaWQgdG8gcHV0IHRoZSBidWlsZGVyIGJlZm9yZS4KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGJ1aWxkZXIgaWQgd2FzIGFjdHVhbGx5IGFkZGVkIChpdCBtYXkgaGF2ZSBhbHJlYWR5IGV4aXN0ZWQpCisJICogQHRocm93cyBDb3JlRXhjZXB0aW9uCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGFkZFRvQnVpbGRTcGVjQmVmb3JlKFN0cmluZyBidWlsZGVySUQsIFN0cmluZyBzdWNjZXNzb3JJRCwgSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOworCQlJQ29tbWFuZFtdIGNvbW1hbmRzID0gZGVzY3JpcHRpb24uZ2V0QnVpbGRTcGVjKCk7CisJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb21tYW5kcy5sZW5ndGg7ICsraSkgeworCQkJaWYgKGNvbW1hbmRzW2ldLmdldEJ1aWxkZXJOYW1lKCkuZXF1YWxzKGJ1aWxkZXJJRCkpIHsKKwkJCQlmb3VuZCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKCFmb3VuZCkgeworCQkJYm9vbGVhbiBzdWNjZXNzb3JGb3VuZCA9IGZhbHNlOworCQkJSUNvbW1hbmQgY29tbWFuZCA9IGRlc2NyaXB0aW9uLm5ld0NvbW1hbmQoKTsKKwkJCWNvbW1hbmQuc2V0QnVpbGRlck5hbWUoYnVpbGRlcklEKTsKKwkJCUlDb21tYW5kW10gbmV3Q29tbWFuZHMgPSBuZXcgSUNvbW1hbmRbY29tbWFuZHMubGVuZ3RoICsgMV07CisJCQlmb3IgKGludCBqID0gMCwgaW5kZXggPSAwOyBqIDwgY29tbWFuZHMubGVuZ3RoOyBqKyssIGluZGV4KyspIHsKKwkJCQlpZiAoc3VjY2Vzc29ySUQgIT0gbnVsbCAmJiBjb21tYW5kc1tqXS5nZXRCdWlsZGVyTmFtZSgpLmVxdWFscyhzdWNjZXNzb3JJRCkpIHsKKwkJCQkJc3VjY2Vzc29yRm91bmQgPSB0cnVlOworCQkJCQluZXdDb21tYW5kc1tpbmRleCsrXSA9IGNvbW1hbmQ7CisJCQkJfQorCQkJCW5ld0NvbW1hbmRzW2luZGV4XSA9IGNvbW1hbmRzW2pdOworCQkJfQorCQkJaWYgKCFzdWNjZXNzb3JGb3VuZCkKKwkJCQluZXdDb21tYW5kc1tuZXdDb21tYW5kcy5sZW5ndGggLSAxXSA9IGNvbW1hbmQ7CisJCQlkZXNjcmlwdGlvbi5zZXRCdWlsZFNwZWMobmV3Q29tbWFuZHMpOworCQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7CisJCX0KKwkJcmV0dXJuICFmb3VuZDsKKwl9CisKKwkvKioKKwkgKiBSZW1vdmUgdGhlIGJ1aWxkZXIgZnJvbSB0aGUgYnVpbGQgc3BlYy4KKwkgKiAKKwkgKiBAcGFyYW0gYnVpbGRlcklECisJICogICAgICAgICAgICBUaGUgaWQgb2YgdGhlIGJ1aWxkZXIuCisJICogQHBhcmFtIHByb2plY3QKKwkgKiAgICAgICAgICAgIFByb2plY3QgdG8gcmVtb3ZlIGZyb20uCisJICogQHJldHVybiBib29sZWFuIGlmIHRoZSBidWlsZGVyIGlkIHdhcyBmb3VuZCBhbmQgcmVtb3ZlZAorCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZW1vdmVGcm9tQnVpbGRTcGVjKFN0cmluZyBidWlsZGVySUQsIElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKKwkJSUNvbW1hbmRbXSBjb21tYW5kcyA9IGRlc2NyaXB0aW9uLmdldEJ1aWxkU3BlYygpOworCQlib29sZWFuIGZvdW5kID0gZmFsc2U7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY29tbWFuZHMubGVuZ3RoOyArK2kpIHsKKwkJCWlmIChjb21tYW5kc1tpXS5nZXRCdWlsZGVyTmFtZSgpLmVxdWFscyhidWlsZGVySUQpKSB7CisJCQkJZm91bmQgPSB0cnVlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChmb3VuZCkgeworCQkJSUNvbW1hbmRbXSBuZXdDb21tYW5kcyA9IG5ldyBJQ29tbWFuZFtjb21tYW5kcy5sZW5ndGggLSAxXTsKKwkJCWludCBuZXdDb3VudCA9IDA7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbW1hbmRzLmxlbmd0aDsgKytpKSB7CisJCQkJaWYgKCEoY29tbWFuZHNbaV0uZ2V0QnVpbGRlck5hbWUoKS5lcXVhbHMoYnVpbGRlcklEKSkpIHsKKwkJCQkJLy9BZGQgdGhlIGV4aXN0bmcgdG8gdGhlIG5ldyBhcnJheQorCQkJCQluZXdDb21tYW5kc1tuZXdDb3VudF0gPSBjb21tYW5kc1tpXTsKKwkJCQkJbmV3Q291bnQrKzsKKwkJCQl9CisJCQl9CisKKwkJCWRlc2NyaXB0aW9uLnNldEJ1aWxkU3BlYyhuZXdDb21tYW5kcyk7CisJCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKKworCQl9CisJCXJldHVybiBmb3VuZDsKKworCX0KKworCS8qKgorCSAqIEVuc3VyZSB0aGUgY29udGFpbmVyIGlzIG5vdCByZWFkLW9ubHkuCisJICogPHA+CisJICogRm9yIExpbnV4LCBhIFJlc291cmNlIGNhbm5vdCBiZSBjcmVhdGVkIGluIGEgUmVhZE9ubHkgZm9sZGVyLiBUaGlzIGlzIG9ubHkgbmVjZXNzYXJ5IGZvciBuZXcgZmlsZXMuCisJICogCisJICogQHBhcmFtIHJlc291cmNlCisJICogICAgICAgICAgICB3b3Jrc3BhY2UgcmVzb3VyY2UgdG8gbWFrZSByZWFkL3dyaXRlCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGVuc3VyZUNvbnRhaW5lck5vdFJlYWRPbmx5KElSZXNvdXJjZSByZXNvdXJjZSkgeworCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiAhcmVzb3VyY2UuZXhpc3RzKCkpIHsgLy9pdCBtdXN0IGJlIG5ldworCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSByZXNvdXJjZS5nZXRQYXJlbnQoKTsKKwkJCVJlc291cmNlQXR0cmlidXRlcyBhdHRyID0gY29udGFpbmVyLmdldFJlc291cmNlQXR0cmlidXRlcygpOworCQkJd2hpbGUgKGF0dHIgIT0gbnVsbCAmJiAhYXR0ci5pc1JlYWRPbmx5KCkpIHsKKwkJCQljb250YWluZXIgPSBjb250YWluZXIuZ2V0UGFyZW50KCk7CisJCQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKQorCQkJCQlicmVhazsKKwkJCQlhdHRyID0gY29udGFpbmVyLmdldFJlc291cmNlQXR0cmlidXRlcygpOworCQkJfQorCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsICYmIGF0dHIgIT0gbnVsbCkKKwkJCQlhdHRyLnNldFJlYWRPbmx5KGZhbHNlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEdldCBwcm9qZWN0cyBmcm9tIHByaW1hcnkgbmF0dXJlLgorCSAqIAorCSAqIEBwYXJhbSBuYXR1cmVJRAorCSAqIEByZXR1cm4gQWxsIHByb2plY3RzIHRoYXQgaGF2ZSB0aGUgZ2l2ZW4gbmF0dXJlIGlkIGFzIHRoZSBmaXJzdCBuYXR1cmUgaWQuCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIHN0YXRpYyBJUHJvamVjdFtdIGdldFByb2plY3RzRm9yUHJpbWFyeU5hdHVyZShTdHJpbmcgbmF0dXJlSUQpIHsKKwkJSVByb2plY3RbXSBwcm9qZWN0c1dpdGhOYXR1cmUgPSBuZXcgSVByb2plY3RbXSB7fTsKKwkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7CisJCUlQcm9qZWN0W10gcHJvamVjdHMgPSBnZXRBbGxQcm9qZWN0cygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7CisJCQlpZiAoaXNQcm9qZWN0UHJpbWFyeU5hdHVyZShwcm9qZWN0c1tpXSwgbmF0dXJlSUQpKQorCQkJCXJlc3VsdC5hZGQocHJvamVjdHNbaV0pOworCQl9CisJCXJldHVybiAoSVByb2plY3RbXSkgcmVzdWx0LnRvQXJyYXkocHJvamVjdHNXaXRoTmF0dXJlKTsKKwl9CisKKwkvKioKKwkgKiBHZXQgYWxsIHByb2plY3RzIGluIHRoZSB3b3Jrc3BhY2UKKwkgKiAKKwkgKiBAcmV0dXJuIGFsbCB3b3Jrc3BhY2UgcHJvamVjdHMKKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIElQcm9qZWN0W10gZ2V0QWxsUHJvamVjdHMoKSB7CisJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7CisJfQorCisJLyoqCisJICogSXMgdGhpcyBuYXR1cmUgaWQgdGhlIHByaW1hcnkgbmF0dXJlIGlkIGZvciB0aGUgcHJvamVjdAorCSAqIAorCSAqIEBwYXJhbSBwcm9qZWN0CisJICogQHBhcmFtIG5hdHVyZUlECisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBmaXJzdCBuYXR1cmUgaWQgZm9yIHRoZSBwcm9qZWN0LgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Byb2plY3RQcmltYXJ5TmF0dXJlKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBuYXR1cmVJRCkgeworCQlTdHJpbmdbXSBuYXR1cmVzID0gbnVsbDsKKwkJdHJ5IHsKKwkJCW5hdHVyZXMgPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCkuZ2V0TmF0dXJlSWRzKCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgeworCQl9CisJCXJldHVybiAobmF0dXJlcyAhPSBudWxsICYmIG5hdHVyZXMubGVuZ3RoID4gMCAmJiBuYXR1cmVzWzBdLmVxdWFscyhuYXR1cmVJRCkpOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgSVBhdGggY3JlYXRlUGF0aChJUHJvamVjdCBwLCBTdHJpbmcgZGVmYXVsdFNvdXJjZU5hbWUpIHsKKwkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHAuZ2V0TmFtZSgpKTsKKwkJcGF0aCA9IHBhdGguYXBwZW5kKGRlZmF1bHRTb3VyY2VOYW1lKTsKKwkJcGF0aCA9IHBhdGgubWFrZUFic29sdXRlKCk7CisJCXJldHVybiBwYXRoOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYSBsaXN0IG9mIGV4aXN0aW5nIGZpbGVzIHdoaWNoIHdpbGwgYmUgbW9kaWZpZWQgaWYgdGhlIGNsYXNzcGF0aCBjaGFuZ2VzIGZvciB0aGUgZ2l2ZW4gcHJvZWplY3QuCisJICogCisJICogQHBhcmFtIHAKKwkgKiAgICAgICAgICAgIHByb2plY3QKKwkgKiBAcmV0dXJuIGxpc3Qgb2YgYWZmZWN0ZWQgZmlsZXMuCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIHN0YXRpYyBMaXN0IGdldEZpbGVzQWZmZWN0ZWRCeUNsYXNzcGF0aENoYW5nZShJUHJvamVjdCBwKSB7CisJCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgyKTsKKwkJYWRkRmlsZUlmRXhpc3RzKHAsIHJlc3VsdCwgRE9UX0NMQVNTUEFUSCk7CisJCWFkZEZpbGVJZkV4aXN0cyhwLCByZXN1bHQsIERPVF9QUk9KRUNUKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgYWRkRmlsZUlmRXhpc3RzKElQcm9qZWN0IHAsIExpc3QgYUxpc3QsIFN0cmluZyBmaWxlbmFtZSkgeworCQlJRmlsZSBhRmlsZSA9IHAuZ2V0RmlsZShmaWxlbmFtZSk7CisJCWlmIChhRmlsZSAhPSBudWxsICYmIGFGaWxlLmV4aXN0cygpKQorCQkJYUxpc3QuYWRkKGFGaWxlKTsKKwl9CisKKwkvKioKKwkgKiBTdHJpcCBvZmYgYSBsZWFkaW5nICIvIiBmcm9tIGVhY2ggcHJvamVjdCBuYW1lIGluIHRoZSBhcnJheSwgaWYgaXQgaGFzIG9uZS4KKwkgKiAKKwkgKiBAcGFyYW0gcHJvamVjTmFtZXMKKwkgKiBAcmV0dXJuIGFycmF5IG9mIHByb2plY3QgbmFtZXMgd2l0aCBhbGwgbGVhZGluZyAnLycgcmVtb3ZlZC4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFByb2plY3ROYW1lc1dpdGhvdXRGb3J3YXJkU2xhc2goU3RyaW5nW10gcHJvamVjTmFtZXMpIHsKKwkJU3RyaW5nW10gcHJvak5hbWVzID0gbmV3IFN0cmluZ1twcm9qZWNOYW1lcy5sZW5ndGhdOworCQlMaXN0IHRlbXAgPSBqYXZhLnV0aWwuQXJyYXlzLmFzTGlzdChwcm9qZWNOYW1lcyk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdGVtcC5zaXplKCk7IGkrKykgeworCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSAodGVtcC5nZXQoaSkpOworCQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiLyIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlwcm9qTmFtZXNbaV0gPSBuYW1lLnN1YnN0cmluZygxLCBuYW1lLmxlbmd0aCgpKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJvak5hbWVzW2ldID0gbmFtZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcHJvak5hbWVzOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgVVJMIGNyZWF0ZUZpbGVVUkwoSVBhdGggcGF0aCkgeworCQl0cnkgeworCQkJcmV0dXJuIHBhdGgudG9GaWxlKCkudG9VUkwoKTsKKwkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKwkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZSwgTGV2ZWwuV0FSTklORyk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCS8qKgorCSAqIEZpbmQgZmlyc3QgbmV3T2JqZWN0IHRoYXQgaXMgbm90IGluIHRoZSBvbGRPYmplY3RzIGFycmF5ICh1c2luZyAiPT0iKS4KKwkgKiAKKwkgKiBAcGFyYW0gb2xkT2JqZWN0cworCSAqIEBwYXJhbSBuZXdPYmplY3RzCisJICogQHJldHVybiBmaXJzdCBuZXdPYmplY3Qgbm90IGZvdW5kIGluIG9sZE9iamVjdHMsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGFsbCBmb3VuZC4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXROZXdPYmplY3QoT2JqZWN0W10gb2xkT2JqZWN0cywgT2JqZWN0W10gbmV3T2JqZWN0cykgeworCQlpZiAob2xkT2JqZWN0cyAhPSBudWxsICYmIG5ld09iamVjdHMgIT0gbnVsbCAmJiBvbGRPYmplY3RzLmxlbmd0aCA8IG5ld09iamVjdHMubGVuZ3RoKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld09iamVjdHMubGVuZ3RoOyBpKyspIHsKKwkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7CisJCQkJT2JqZWN0IG9iamVjdCA9IG5ld09iamVjdHNbaV07CisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBvbGRPYmplY3RzLmxlbmd0aDsgaisrKSB7CisJCQkJCWlmIChvbGRPYmplY3RzW2pdID09IG9iamVjdCkgeworCQkJCQkJZm91bmQgPSB0cnVlOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKCFmb3VuZCkKKwkJCQkJcmV0dXJuIG9iamVjdDsKKwkJCX0KKwkJfQorCQlpZiAob2xkT2JqZWN0cyA9PSBudWxsICYmIG5ld09iamVjdHMgIT0gbnVsbCAmJiBuZXdPYmplY3RzLmxlbmd0aCA9PSAxKQorCQkJcmV0dXJuIG5ld09iamVjdHNbMF07CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIExpc3Qgb2YgYWxsIGZpbGVzIGluIHRoZSBwcm9qZWN0LgorCSAqIDxwPgorCSAqIE5vdGU6IEEgbW9yZSBlZmZpY2llbnQgd2F5IHRvIGRvIHRoaXMgaXMgdG8gdXNlIHtAbGluayBJUmVzb3VyY2UjYWNjZXB0KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5VmlzaXRvciwgaW50KX0KKwkgKiAKKwkgKiBAcGFyYW0gMS4wLjAKKwkgKiBAcmV0dXJuIGxpc3Qgb2YgZmlsZXMgaW4gdGhlIHByb2plY3QKKwkgKiAKKwkgKiBAc2VlIElSZXNvdXJjZSNhY2NlcHQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHlWaXNpdG9yLCBpbnQpCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIHN0YXRpYyBMaXN0IGdldEFsbFByb2plY3RGaWxlcyhJUHJvamVjdCBwcm9qZWN0KSB7CisJCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOworCQlpZiAocHJvamVjdCA9PSBudWxsKQorCQkJcmV0dXJuIHJlc3VsdDsKKwkJdHJ5IHsKKwkJCXJlc3VsdCA9IGNvbGxlY3RGaWxlcyhwcm9qZWN0Lm1lbWJlcnMoKSwgcmVzdWx0KTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBMaXN0IGNvbGxlY3RGaWxlcyhJUmVzb3VyY2VbXSBtZW1iZXJzLCBMaXN0IHJlc3VsdCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkvLyByZWN1cnNpdmVseSBjb2xsZWN0IGZpbGVzIGZvciB0aGUgZ2l2ZW4gbWVtYmVycworCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsKKwkJCUlSZXNvdXJjZSByZXMgPSBtZW1iZXJzW2ldOworCQkJaWYgKHJlcyBpbnN0YW5jZW9mIElGb2xkZXIpIHsKKwkJCQljb2xsZWN0RmlsZXMoKChJRm9sZGVyKSByZXMpLm1lbWJlcnMoKSwgcmVzdWx0KTsKKwkJCX0gZWxzZSBpZiAocmVzIGluc3RhbmNlb2YgSUZpbGUpIHsKKwkJCQlyZXN1bHQuYWRkKHJlcyk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIHByb2plY3QuCisJICogCisJICogQHBhcmFtIHByb2plY3ROYW1lCisJICogQHJldHVybiBhIElQcm9qZWN0IGdpdmVuIHRoZSBwcm9qZWN0TmFtZQorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0UHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUpIHsKKwkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIGJ1aWxkZXIgbmFtZSBpcyBhdHRhY2hlZCB0byB0aGUgcHJvamVjdC4KKwkgKiAKKwkgKiBAcGFyYW0gcHJvamVjdAorCSAqIEBwYXJhbSBidWlsZGVyTmFtZQorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYnVpbGRlciBuYW1lIGlzIGF0dGFjaGVkIHRvIHRoZSBwcm9qZWN0LgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNCdWlsZGVyKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBidWlsZGVyTmFtZSkgeworCQl0cnkgeworCQkJSUNvbW1hbmRbXSBidWlsZGVycyA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKS5nZXRCdWlsZFNwZWMoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYnVpbGRlcnMubGVuZ3RoOyBpKyspIHsKKwkJCQlJQ29tbWFuZCBidWlsZGVyID0gYnVpbGRlcnNbaV07CisJCQkJaWYgKGJ1aWxkZXIgIT0gbnVsbCkgeworCQkJCQlpZiAoYnVpbGRlci5nZXRCdWlsZGVyTmFtZSgpLmVxdWFscyhidWlsZGVyTmFtZSkpCisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9SZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1Jlc291cmNlSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNzA3ODAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9SZXNvdXJjZUhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqICAkJFJDU2ZpbGU6IFJlc291cmNlSGFuZGxlci5qYXZhLHYgJCQKKyAqICAkJFJldmlzaW9uOiAxLjIgJCQgICQkRGF0ZTogMjAwNS8wMi8xNSAyMzowNDoxNCAkJCAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OworCisvKioKKyAqIEltcGxlbWVudGVycyBvZiB0aGlzIGludGVyZmFjZSBhcmUgcHJvdmlkZSBleHRlbnNpb24gY2FwYWJpbGl0aWVzIG9uIHJlc291cmNlIHNldC4gU3VjaCBhcyBsb29raW5nIG9yIGNyZWF0aW5nIGluIG90aGVyIHJlc291cmNlIHNldHMgZm9yIGEKKyAqIHJlc291cmNlIG9yIGFuIEVPYmplY3QuCisgKiAKKyAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXQjYWRkKFJlc291cmNlSGFuZGxlcikKKyAqIEBzaW5jZSAxLjAuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlSGFuZGxlciB7CisKKwkvKioKKwkgKiBFYWNoIFJlc291cmNlSGFuZGxlciBmb3IgYSBXb3JrYmVuY2hDb250ZXh0ICh3aGljaCBob2xkcyBhIFByb2plY3RSZXNvdXJjZVNldCkgd2lsbCBnZXQgYW4gb3BvcnR1bml0eSB0byBnZXQgdGhlIFJlc291cmNlIGdpdmVuIHRoZSB1cmlTdHJpbmcKKwkgKiBwcmlvciB0byB0aGUgb3JpZ2luYXRpbmdSZXNvdXJjZVNldCBnZXR0aW5nIGl0IGluIHRoZSBub3JtYWwgbWFubmVyLgorCSAqIAorCSAqIElmIHRoaXMgaGFuZGxlciBsb2FkZWQgYSBSZXNvdXJjZSBpbiBpdHMgY3JlYXRlKFJlc291cmNlU2V0LCB1cmlTdHJpbmcpIHRoZW4gdGhpcyBtZXRob2Qgc2hvdWxkIGJlIGFibGUgdG8gcmV0dXJuIGl0IGFzIHdlbGwuCisJICogCisJICogQHBhcmFtIG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQKKwkgKiBAcGFyYW0gdXJpCisJICogQHJldHVybiByZXNvdXJjZSBpZiBmb3VuZCBvciA8Y29kZT5udWxsbC9jb2RlPiBpZiB0aGlzIGhhbmRsZXIgZGlkbid0IGZpbmQgaXQuCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoUmVzb3VyY2VTZXQgb3JpZ2luYXRpbmdSZXNvdXJjZVNldCwgVVJJIHVyaSk7CisKKwkvKioKKwkgKiBHZXQgdGhlIEVPYmplY3QgZm9yIHRoZSBnaXZlbiBVUkksIGlmIGl0IGNhbi4gTG9hZCB0aGUgcmVzb3VyY2UgaWYgbG9hZE9uRGVtYW5kIGlzIDxjb2RlPnRydWU8L2NvZGU+LgorCSAqIAorCSAqIEBwYXJhbSBvcmlnaW5hdGluZ1Jlc291cmNlU2V0CisJICogQHBhcmFtIHVyaQorCSAqICAgICAgICAgICAgdXJpIG9mIEVPYmplY3QgYmVpbmcgcmVxdWVzdGVkCisJICogQHBhcmFtIGxvYWRPbkRlbWFuZAorCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcmVzb3VyY2Ugc2hvdWxkIGJlIGxvYWRlZAorCSAqIEByZXR1cm4gZW9iamVjdCBpZiBmb3VuZCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QuCisJICovCisJRU9iamVjdCBnZXRFT2JqZWN0RmFpbGVkKFJlc291cmNlU2V0IG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQsIFVSSSB1cmksIGJvb2xlYW4gbG9hZE9uRGVtYW5kKTsKKworCS8qKgorCSAqIENyZWF0ZSB0aGUgcmVzb3VyY2UgcG9pbnRlZCB0byBiZSB0aGUgVVJJIGlmIHRoaXMgaGFuZGxlciB3aWxsIGhhbmRsZSBpdC4KKwkgKiAKKwkgKiBAcGFyYW0gb3JpZ2luYXRpbmdSZXNvdXJjZVNldAorCSAqIEBwYXJhbSB1cmkKKwkgKiBAcmV0dXJuIHJlc291cmNlIGlmIGNyZWF0ZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGhhbmRsZXIgZG9lc24ndCBoYW5kbGUgdGhpcyB0eXBlLgorCSAqLworCVJlc291cmNlIGNyZWF0ZVJlc291cmNlKFJlc291cmNlU2V0IG9yaWdpbmF0aW5nUmVzb3VyY2VTZXQsIFVSSSB1cmkpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1Jlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9SZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZWM1OTcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9SZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplci5qYXZhCkBAIC0wLDAgKzEsMTkyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiAgJCRSQ1NmaWxlOiBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplci5qYXZhLHYgJCQKKyAqICAkJFJldmlzaW9uOiAxLjQgJCQgICQkRGF0ZTogMjAwNi8wNS8xNyAyMDoxMzo0NSAkJCAKKyAqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2g7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbi5KRU1VdGlsUGx1Z2luOworCisKKy8qKgorICogU3luY2hyb25pemVyIG9uIHRoZSB3b3JrYmVuY2guIEl0IGxpc3RlbnMgZm9yIHRoZSBwcm9qZWN0IHRvIHNlZSBpZiBpdCBpcyBjbG9zZWQgb3IgZGVsZXRlZC4gSWYgaXQgZG9lcyBpdCBub3RpZmllcyB0aGlzIG91dC4KKyAqIAorICogQHNpbmNlIDEuMC4wCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKKworCXByb3RlY3RlZCBJUHJvamVjdCBwcm9qZWN0OworCisJcHJvdGVjdGVkIFJlc291cmNlU2V0IHJlc291cmNlU2V0OworCisJLyoqIEV4dGVuZGVycyB0aGF0IHdpbGwgYmUgbm90aWZpZWQgYWZ0ZXIgYSBwcmUgYnVpbGQgcmVzb3VyY2UgY2hhbmdlICovCisJcHJvdGVjdGVkIExpc3QgZXh0ZW5kZXJzOworCisJLyoqIFRoZSBkZWx0YSBmb3IgdGhpcyBwcm9qZWN0IHRoYXQgd2lsbCBiZSBicm9hZGNhc3QgdG8gdGhlIGV4dGVuZGVycyAqLworCXByb3RlY3RlZCBJUmVzb3VyY2VEZWx0YSBjdXJyZW50UHJvamVjdERlbHRhOworCisJcHJpdmF0ZSBpbnQgY3VycmVudEV2ZW50VHlwZSA9IC0xOworCisJLyoqCisJICogQ29uc3RydWN0b3IgdGFraW5nIGEgcmVzb3VyY2Ugc2V0IGFuZCBwcm9qZWN0LgorCSAqIAorCSAqIEBwYXJhbSBhUmVzb3VyY2VTZXQKKwkgKiBAcGFyYW0gYVByb2plY3QKKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIoUmVzb3VyY2VTZXQgYVJlc291cmNlU2V0LCBJUHJvamVjdCBhUHJvamVjdCkgeworCQlyZXNvdXJjZVNldCA9IGFSZXNvdXJjZVNldDsKKwkJcHJvamVjdCA9IGFQcm9qZWN0OworCQlpZiAoYVJlc291cmNlU2V0ICE9IG51bGwgJiYgYVJlc291cmNlU2V0IGluc3RhbmNlb2YgUHJvamVjdFJlc291cmNlU2V0KQorCQkJKChQcm9qZWN0UmVzb3VyY2VTZXQpIGFSZXNvdXJjZVNldCkuc2V0U3luY2hyb25pemVyKHRoaXMpOworCQlpbml0aWFsaXplKCk7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBwcm9qZWN0IGZvciB0aGlzIHN5bmNocm9uaXplcgorCSAqIAorCSAqIEByZXR1cm4gcHJvamVjdAorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgeworCQlyZXR1cm4gcHJvamVjdDsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIjcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50KQorCSAqLworCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgeworCQljdXJyZW50RXZlbnRUeXBlID0gZXZlbnQuZ2V0VHlwZSgpOworCQljdXJyZW50UHJvamVjdERlbHRhID0gbnVsbDsKKwkJaWYgKChjdXJyZW50RXZlbnRUeXBlID09IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9DTE9TRSB8fCBjdXJyZW50RXZlbnRUeXBlID09IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEUpCisJCQkJJiYgZXZlbnQuZ2V0UmVzb3VyY2UoKS5lcXVhbHMoZ2V0UHJvamVjdCgpKSkgeworCQkJbm90aWZ5RXh0ZW5kZXJzT2ZDbG9zZSgpOworCQkJcmVsZWFzZSgpOworCQl9CisJfQorCisKKwlwcm90ZWN0ZWQgdm9pZCBub3RpZnlFeHRlbmRlcnNJZk5lY2Vzc2FyeSgpIHsKKwkJaWYgKGN1cnJlbnRFdmVudFR5cGUgIT0gSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UgfHwgZXh0ZW5kZXJzID09IG51bGwgfHwgY3VycmVudFByb2plY3REZWx0YSA9PSBudWxsKQorCQkJcmV0dXJuOworCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuZGVycy5zaXplKCk7IGkrKykgeworCQkJSVN5bmNocm9uaXplckV4dGVuZGVyIGV4dGVuZGVyID0gKElTeW5jaHJvbml6ZXJFeHRlbmRlcikgZXh0ZW5kZXJzLmdldChpKTsKKwkJCWV4dGVuZGVyLnByb2plY3RDaGFuZ2VkKGN1cnJlbnRQcm9qZWN0RGVsdGEpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgbm90aWZ5RXh0ZW5kZXJzT2ZDbG9zZSgpIHsKKwkJaWYgKGV4dGVuZGVycyAhPSBudWxsICYmICFleHRlbmRlcnMuaXNFbXB0eSgpKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuZGVycy5zaXplKCk7IGkrKykgeworCQkJCUlTeW5jaHJvbml6ZXJFeHRlbmRlciBleHRlbmRlciA9IChJU3luY2hyb25pemVyRXh0ZW5kZXIpIGV4dGVuZGVycy5nZXQoaSk7CisJCQkJZXh0ZW5kZXIucHJvamVjdENsb3NlZCgpOworCQkJfQorCQl9CisJfQorCisJcHJvdGVjdGVkIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgeworCQlpZiAoZ2V0UHJvamVjdCgpID09IG51bGwpCisJCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOworCQlyZXR1cm4gZ2V0UHJvamVjdCgpLmdldFdvcmtzcGFjZSgpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7CisJCWdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcywKKwkJCQlJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQ0xPU0UgfCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfREVMRVRFIHwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UgfCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQlVJTEQpOworCX0KKworCS8qKgorCSAqIERpc3Bvc2Ugb2YgdGhlIHN5bmNocm9uaXplci4gQ2FsbGVkIHdoZW4gbm8gbG9uZ2VyIG5lZWRlZC4KKwkgKiAKKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlnZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOworCX0KKworCS8qKgorCSAqIFRoZSBwcm9qZWN0IGlzIGdvaW5nIGF3YXkgc28gd2UgbmVlZCB0byBjbGVhbnVwIG91cnNlbGYgYW5kIHRoZSBSZXNvdXJjZVNldC4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCByZWxlYXNlKCkgeworCQlpZiAoSkVNVXRpbFBsdWdpbi5pc0FjdGl2YXRlZCgpKSB7CisJCQl0cnkgeworCQkJCWlmIChyZXNvdXJjZVNldCBpbnN0YW5jZW9mIFByb2plY3RSZXNvdXJjZVNldCkKKwkJCQkJKChQcm9qZWN0UmVzb3VyY2VTZXQpIHJlc291cmNlU2V0KS5yZWxlYXNlKCk7CisJCQl9IGZpbmFsbHkgeworCQkJCUVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5LklOU1RBTkNFLnJlbW92ZUNhY2hlZFByb2plY3QoZ2V0UHJvamVjdCgpKTsKKwkJCQlkaXNwb3NlKCk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBBZGQgYW4gZXh0ZW5kZXIgdG8gYmUgbm90aWZpZWQgb2YgZXZlbnRzLgorCSAqIAorCSAqIEBwYXJhbSBleHRlbmRlcgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyB2b2lkIGFkZEV4dGVuZGVyKElTeW5jaHJvbml6ZXJFeHRlbmRlciBleHRlbmRlcikgeworCQlpZiAoZXh0ZW5kZXJzID09IG51bGwpCisJCQlleHRlbmRlcnMgPSBuZXcgQXJyYXlMaXN0KDMpOworCQlleHRlbmRlcnMuYWRkKGV4dGVuZGVyKTsKKwl9CisKKwkvKioKKwkgKiBSZW1vdmUgZXh0ZW5kZXIgZnJvbSBub3RpZmljYXRpb24gb2YgZXZlbnRzLgorCSAqIAorCSAqIEBwYXJhbSBleHRlbmRlcgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZUV4dGVuZGVyKElTeW5jaHJvbml6ZXJFeHRlbmRlciBleHRlbmRlcikgeworCQlpZiAoZXh0ZW5kZXJzID09IG51bGwpCisJCQlyZXR1cm47CisJCWV4dGVuZGVycy5yZW1vdmUoZXh0ZW5kZXIpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCisJICovCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgJygnICsgKChnZXRQcm9qZWN0KCkgIT0gbnVsbCkgPyBnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpIDogIm51bGwiKSArICcpJzsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIFRlbGwgU3luY2hyb25pemVyIHRoYXQgYSBmaWxlIGlzIGFib3V0IHRvIGJlIHNhdmVkLiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHByaW9yIHRvIHdyaXRpbmcgdG8gYW4gSUZpbGUgZnJvbSBhbiBFTUYgcmVzb3VyY2UuCisJICogPHA+CisJICogRGVmYXVsdCBkb2VzIG5vdGhpbmcsIGJ1dCBzdWJjbGFzc2VzIGNhbiBkbyBzb21ldGhpbmcuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBhRmlsZQorCSAqICAgICAgICAgICAgZmlsZSBhYm91dCB0byBiZSBzYXZlZC4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgdm9pZCBwcmVTYXZlKElGaWxlIGFGaWxlKSB7CisJCS8vRGVmYXVsdCBpcyBkbyBub3RoaW5nCisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9Xb3JrYmVuY2hCeXRlQXJyYXlPdXRwdXRTdHJlYW0uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1dvcmtiZW5jaEJ5dGVBcnJheU91dHB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNzJmNTEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9Xb3JrYmVuY2hCeXRlQXJyYXlPdXRwdXRTdHJlYW0uamF2YQpAQCAtMCwwICsxLDE0OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiAgJCRSQ1NmaWxlOiBXb3JrYmVuY2hCeXRlQXJyYXlPdXRwdXRTdHJlYW0uamF2YSx2ICQkCisgKiAgJCRSZXZpc2lvbjogMS4yICQkICAkJERhdGU6IDIwMDUvMDIvMTUgMjM6MDQ6MTQgJCQgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsOworCisvKioKKyAqIEJ5dGVBcnJheSBPdXRwdXRTdHJlYW0gZm9yIHRoZSBXb3JrYmVuY2guIEl0IHdvcmtzIHdpdGggdGhlIHN5bmNocm9uaXplciB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5SZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplcn10bworICogbm90aWZ5IG9mIGEgc2F2ZS4gSXQgYWxzbyBjaGFuZ2VzIGFsbCBvZiB0aGUgbGluZSBzZXBhcmF0b3JzIHRvIHRoZSBjdXJyZW50IHN5c3RlbSBsaW5lIHNlcGFyYXRvciwgaS5lLiBpZiB0aGVyZSBhcmUgc29tZSAnXHInIGFuZCB3ZSBhcmUgb24KKyAqIFdpbmRvd3MoUikgdGhlbiB0aGV5IHdpbGwgYmUgY29udmVydGVkIHRvICdcblxyJyksIGlmIHRoZSBzZXR0aW5nIGZvciB0aGUgc3RyZWFtIGlzIHRvIGRvIGVvbCBjb252ZXJzaW9uLgorICogCisgKiBAc2luY2UgMS4wLjAKKyAqLworcHVibGljIGNsYXNzIFdvcmtiZW5jaEJ5dGVBcnJheU91dHB1dFN0cmVhbSBleHRlbmRzIFVSSUNvbnZlcnRlckltcGwuUGxhdGZvcm1SZXNvdXJjZU91dHB1dFN0cmVhbSB7CisKKwlwcml2YXRlIGJvb2xlYW4gZkNvbnZlcnRFT0wgPSBmYWxzZTsKKworCXByb3RlY3RlZCBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciBzeW5jaHJvbml6ZXI7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Qgd2l0aCBhbiBJRmlsZQorCSAqIAorCSAqIEBwYXJhbSBhRmlsZQorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBXb3JrYmVuY2hCeXRlQXJyYXlPdXRwdXRTdHJlYW0oSUZpbGUgYUZpbGUpIHsKKwkJdGhpcyhhRmlsZSwgbnVsbCk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0IHdpdGggYSBJRmlsZSBhbmQgYSBzeW5jaHJvbml6ZXIuIFRoaXMgd2F5IHN5bmNocm9uaXplciB3aWxsIGtub3cgd2hlbiBmaWxlIGlzIGFib3V0IHRvIGJlIHNhdmVkLgorCSAqIAorCSAqIEBwYXJhbSBhRmlsZQorCSAqIEBwYXJhbSBhU3luY2hyb25pemVyCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIFdvcmtiZW5jaEJ5dGVBcnJheU91dHB1dFN0cmVhbShJRmlsZSBhRmlsZSwgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgYVN5bmNocm9uaXplcikgeworCQlzdXBlcihhRmlsZSwgZmFsc2UsIHRydWUsIG51bGwpOworCQlzeW5jaHJvbml6ZXIgPSBhU3luY2hyb25pemVyOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgamF2YS5pby5PdXRwdXRTdHJlYW0jY2xvc2UoKQorCSAqLworCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKHN5bmNocm9uaXplciAhPSBudWxsKQorCQkJc3luY2hyb25pemVyLnByZVNhdmUoZmlsZSk7CisJCXN1cGVyLmNsb3NlKCk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsLlBsYXRmb3JtUmVzb3VyY2VPdXRwdXRTdHJlYW0jZmx1c2goKQorCSAqLworCXB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKHN5bmNocm9uaXplciAhPSBudWxsKQorCQkJc3luY2hyb25pemVyLnByZVNhdmUoZmlsZSk7CisJCXN1cGVyLmZsdXNoKCk7CisJfQorCisJLyoKKwkgKiBDb252ZXJ0IHRoZSBlbmQgb2YgbGluZSBjaGFyYWN0ZXJzLgorCSAqLworCXByaXZhdGUgaW50IGNvbnZlcnRFT0woYnl0ZVtdIGRhdGEpIHsKKwkJLy8gQWxnb3JpdGhtOgorCQkvLyBSZW1vdmUgYWxsICdccicgY2hhcnMKKwkJLy8gUmVwbGFjZSBhbGwgJ1xuJyBjaGFycyB3aXRoIGxpbmUgc2VwZXJhdG9yIGNoYXJzCisKKwkJU3RyaW5nIEVPTCA9IFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKKwkJYnl0ZVtdIEVPTEJ5dGVzID0gRU9MLmdldEJ5dGVzKCk7CisKKwkJaW50IG91dCA9IDA7CisKKwkJZm9yIChpbnQgaW4gPSAwOyBpbiA8IGRhdGEubGVuZ3RoOyBpbisrKSB7CisJCQlpZiAoZGF0YVtpbl0gPT0gJ1xyJykgeworCQkJCS8vIGRvbid0IG91dHB1dCAoaWUsIHRocm93IHRoZSBjaGFyIGF3YXkpCisJCQl9IGVsc2UgaWYgKGRhdGFbaW5dID09ICdcbicpIHsKKwkJCQkvLyBUaGUgY29kZSBkb2VzIG5vdCBjdXJyZW50bHkgaGFuZGxlIGV4cGFuZGluZyB0aGUgYXJyYXkKKwkJCQlpZiAoKGluIC0gb3V0ICsgMSkgPCBFT0xCeXRlcy5sZW5ndGgpCisJCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiV29ya2JlbmNoQnl0ZUFycmF5T3V0cHV0U3RyZWFtOiBFeHBhbmRpbmcgRU9MIGNoYXJzIG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCisKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IEVPTEJ5dGVzLmxlbmd0aDsgaSsrKSB7CisJCQkJCWRhdGFbb3V0KytdID0gRU9MQnl0ZXNbaV07CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvLyBKdXN0IGNvcHkgdGhlIGRhdGEKKwkJCQlkYXRhW291dCsrXSA9IGRhdGFbaW5dOworCQkJfQorCQl9CisKKwkJcmV0dXJuIG91dDsKKwl9CisKKwkvKioKKwkgKiBJcyBFT0wgY29udmVyc2lvbiB0dXJuZWQgb24uCisJICogCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBFT0wgY29udmVyc2lvbiBpcyB0dXJuZWQgb24uCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIGJvb2xlYW4gaXNDb252ZXJ0RU9MQ2hhcnMoKSB7CisJCXJldHVybiBmQ29udmVydEVPTDsKKwl9CisKKwkvKioKKwkgKiBTZXQgdGhlIEVPTCBjb252ZXJzaW9uIGZsYWcuCisJICogCisJICogQHBhcmFtIHNldAorCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgRU9MIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gY3VycmVudCBsaW5lIHNlcGFyYXRvci4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0RU9MQ2hhcnMoYm9vbGVhbiBzZXQpIHsKKwkJZkNvbnZlcnRFT0wgPSBzZXQ7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSN0b0J5dGVBcnJheSgpCisJICovCisJcHVibGljIHN5bmNocm9uaXplZCBieXRlW10gdG9CeXRlQXJyYXkoKSB7CisJCWJ5dGVbXSBjb250ZW50cyA9IHN1cGVyLnRvQnl0ZUFycmF5KCk7CisJCWlmIChpc0NvbnZlcnRFT0xDaGFycygpKQorCQkJY29udmVydEVPTChjb250ZW50cyk7CisJCXJldHVybiBjb250ZW50czsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTI2MjM3Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmphdmEKQEAgLTAsMCArMSw2OTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogICQkUkNTZmlsZTogV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmphdmEsdiAkJAorICogICQkUmV2aXNpb246IDEuNiAkJCAgJCREYXRlOiAyMDA4LzAzLzEyIDE0OjIxOjM5ICQkIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2g7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLldvcmtzcGFjZVJlc291cmNlSGFuZGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbjsKKworCisvKioKKyAqIFdvcmtiZW5jaCByZXNvdXJjZSBoZWxwZXIKKyAqIAorICogQHNpbmNlIDEuMC4wCisgKi8KK3B1YmxpYyBjbGFzcyBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UgeworCisJLyoqCisJICogRXZlcnl0aGluZyBpcyBzdGF0aWMsIGRvbid0IGtub3cgd2h5IHRoZXJlIGlzIGFuIGluc3RhbmNlIGhlcmUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UgSU5TVEFOQ0UgPSBuZXcgV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlKCk7CisKKwlwcm90ZWN0ZWQgc3RhdGljIFdvcmtzcGFjZVJlc291cmNlSGFuZGxlciB3b3Jrc3BhY2VVUklMb2FkZXIgPSBuZXcgV29ya3NwYWNlUmVzb3VyY2VIYW5kbGVyKCk7CisKKwlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgcmVzb2x2ZUNvbnRhaW5lZFByb3hpZXMoRU9iamVjdCByZWZPYmplY3QpIHsKKwkJTGlzdCBjb250YWluZWQgPSByZWZPYmplY3QuZUNvbnRlbnRzKCk7CisJCUVPYmplY3QgbW9mT2JqZWN0OworCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRhaW5lZC5zaXplKCk7IGkrKykgeworCQkJbW9mT2JqZWN0ID0gKEVPYmplY3QpIGNvbnRhaW5lZC5nZXQoaSk7CisJCQlyZXNvbHZlUHJveGllcyhtb2ZPYmplY3QpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHJlc29sdmVOb25Db250YWluZWRQcm94aWVzKEVPYmplY3QgcmVmT2JqZWN0KSB7CisJCUxpc3QgcmVmZXJlbmNlcyA9IHJlZk9iamVjdC5lQ2xhc3MoKS5nZXRFQWxsUmVmZXJlbmNlcygpOworCQlFUmVmZXJlbmNlIHJlZmVyZW5jZTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2VzLnNpemUoKTsgaSsrKSB7CisJCQlyZWZlcmVuY2UgPSAoRVJlZmVyZW5jZSkgcmVmZXJlbmNlcy5nZXQoaSk7CisJCQlpZiAoIXJlZmVyZW5jZS5pc0NvbnRhaW5tZW50KCkpIHsKKwkJCQlpZiAocmVmZXJlbmNlLmlzTWFueSgpKSB7CisJCQkJCUxpc3QgdmFsdWUgPSAoTGlzdCkgcmVmT2JqZWN0LmVHZXQocmVmZXJlbmNlKTsKKwkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCB2YWx1ZS5zaXplKCk7IGorKykKKwkJCQkJCXZhbHVlLmdldChqKTsKKwkJCQl9IGVsc2UgeworCQkJCQlyZWZPYmplY3QuZUdldChyZWZlcmVuY2UpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIEZvcmNlIGFsbCBvZiB0aGUgcHJveGllcyB3aXRoIDxjb2RlPnJlc291cmNlPC9jb2RlPiB0byBiZSByZXNvbHZlZC4KKwkgKiAKKwkgKiBAcGFyYW0gcmVzb3VyY2UKKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgcmVzb2x2ZVByb3hpZXMoUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKKwkJCUxpc3QgdG9wTGV2ZWxzID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKTsKKwkJCUVPYmplY3QgbW9mT2JqZWN0OworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b3BMZXZlbHMuc2l6ZSgpOyBpKyspIHsKKwkJCQltb2ZPYmplY3QgPSAoRU9iamVjdCkgdG9wTGV2ZWxzLmdldChpKTsKKwkJCQlyZXNvbHZlUHJveGllcyhtb2ZPYmplY3QpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogUmV0dXJuIGEgTGlzdCBvZiBwcm94aWVzIHRoYXQgYXJlIGNvbnRhaW5lZCBieSB0aGUgPGNvZGU+cmVzb3VyY2U8L2NvZGU+LgorCSAqIAorCSAqIEBwYXJhbSByZXNvdXJjZQorCSAqIEByZXR1cm4gbGlzdCBvZiBwcm94aWVzLgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgTGlzdCBnYXRoZXJQcm94aWVzKFJlc291cmNlIHJlc291cmNlKSB7CisJCWlmIChyZXNvdXJjZSA9PSBudWxsKQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CisJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJTGlzdCB0b3BMZXZlbHMgPSByZXNvdXJjZS5nZXRDb250ZW50cygpOworCQlpbnQgc2l6ZSA9IHRvcExldmVscy5zaXplKCk7CisJCUVPYmplY3QgbW9mT2JqZWN0OworCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJbW9mT2JqZWN0ID0gKEVPYmplY3QpIHRvcExldmVscy5nZXQoaSk7CisJCQlnYXRoZXJQcm94aWVzKChJbnRlcm5hbEVPYmplY3QpIG1vZk9iamVjdCwgbGlzdCk7CisJCX0KKwkJcmV0dXJuIGxpc3Q7CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGdhdGhlclByb3hpZXMoSW50ZXJuYWxFT2JqZWN0IHJlZk9iamVjdCwgTGlzdCBwcm94aWVzKSB7CisJCWlmIChyZWZPYmplY3QgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJTGlzdCBjb250YWlucyA9IHJlZk9iamVjdC5lQ2xhc3MoKS5nZXRFQWxsQ29udGFpbm1lbnRzKCk7CisJCWlmIChjb250YWlucyAhPSBudWxsKSB7CisJCQlpbnQgc2l6ZSA9IGNvbnRhaW5zLnNpemUoKTsKKwkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBzZiA9IG51bGw7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCXNmID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgY29udGFpbnMuZ2V0KGkpOworCQkJCWdhdGhlclByb3hpZXMocmVmT2JqZWN0LCBzZiwgcHJveGllcyk7CisJCQl9CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZ2F0aGVyUHJveGllcyhJbnRlcm5hbEVPYmplY3QgcmVmT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgc2YsIExpc3QgcHJveGllcykgeworCQlPYmplY3QgdmFsdWUgPSBudWxsOworCQlJbnRlcm5hbEVPYmplY3QgcHJveHkgPSBudWxsOworCQlpZiAoc2YuaXNNYW55KCkgfHwgcmVmT2JqZWN0LmVJc1NldChzZikpIHsKKwkJCXZhbHVlID0gcmVmT2JqZWN0LmVHZXQoc2YsIGZhbHNlKTsKKwkJCWlmICh2YWx1ZSAhPSBudWxsKSB7CisJCQkJaWYgKHNmLmlzTWFueSgpKSB7CisJCQkJCUl0ZXJhdG9yIGogPSAoKEludGVybmFsRUxpc3QpIHZhbHVlKS5iYXNpY0l0ZXJhdG9yKCk7CisJCQkJCXdoaWxlIChqLmhhc05leHQoKSkgeworCQkJCQkJcHJveHkgPSAoSW50ZXJuYWxFT2JqZWN0KSBqLm5leHQoKTsKKwkJCQkJCWlmIChwcm94eS5lSXNQcm94eSgpKQorCQkJCQkJCXByb3hpZXMuYWRkKHByb3h5KTsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoKChJbnRlcm5hbEVPYmplY3QpIHZhbHVlKS5lSXNQcm94eSgpKQorCQkJCQlwcm94aWVzLmFkZCh2YWx1ZSk7CisJCQl9CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgcmVzb2x2ZVByb3hpZXMoRU9iamVjdCByZWZPYmplY3QpIHsKKwkJaWYgKHJlZk9iamVjdCAhPSBudWxsKSB7CisJCQlyZXNvbHZlTm9uQ29udGFpbmVkUHJveGllcyhyZWZPYmplY3QpOworCQkJcmVzb2x2ZUNvbnRhaW5lZFByb3hpZXMocmVmT2JqZWN0KTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybiBhbiBleGlzdGluZyBjb250ZXh0IGJhc2Ugb24gPGNvZGU+YVByb2plY3Q8L2NvZGU+LgorCSAqIAorCSAqIEBwYXJhbSBhUHJvamVjdAorCSAqIEByZXR1cm4gdGhlIGNvbnRleHQgYmFzZSBmb3IgdGhlIHByb2plY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEVNRldvcmtiZW5jaENvbnRleHRCYXNlIGdldEVNRkNvbnRleHQoSVByb2plY3QgYVByb2plY3QpIHsKKwkJcmV0dXJuIEVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5LklOU1RBTkNFLmdldEVNRkNvbnRleHQoYVByb2plY3QpOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhIHJlc291cmNlIGZyb20gdGhlIFVSSS4gVGhlIFVSSSBtdXN0IGNvbnRhaW4gdGhlIHByb2plY3QgbmFtZSwgZWl0aGVyIGFzIHRoZSBmaXJzdCBzZWdtZW50LCBvciBpZiBpbiBwbGF0Zm9ybSByZXNvdXJjZSB1cmwgcHJvdG9jb2wuCisJICoge0BsaW5rICNnZXRSZXNvdXJjZVNldChVUkkpfQorCSAqIAorCSAqIEBwYXJhbSB1cmkKKwkgKiBAcmV0dXJuIGEgbmV3IHJlc291cmNlIGZvciB0aGUgdXJpIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBhIHByb2plY3QgdXJpCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIHN0YXRpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7CisJCVJlc291cmNlU2V0IHNldCA9IGdldFJlc291cmNlU2V0KHVyaSk7CisJCWlmIChzZXQgIT0gbnVsbCkKKwkJCXJldHVybiBzZXQuY3JlYXRlUmVzb3VyY2UodXJpKTsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ2hlY2sgZm9yIGEgY2FjaGVkIFJlc291cmNlIGZvciB0aGUgZ2l2ZW4gVVJJLCBpZiBub25lIGlzIGZvdW5kLCBjcmVhdGUgYSBuZXcgUmVzb3VyY2UgZm9yIHdpdGggdGhlIFVSSSBhZ2FpbnN0IHRoZSBwcm9wZXIgUmVzb3VyY2VTZXQuCisJICogCisJICogQHBhcmFtIHVyaSBUaGUgVVJJIE1VU1QgYmUgZWl0aGVyIGEgIjxiPnBsYXRmb3JtOi9yZXNvdXJjZS88L2I+cHJvamVjdC1uYW1lLy4uLi4iIHR5cGUgVVJJIG9yIGl0CisJICogbXVzdCBiZSBvZiB0eXBlICJwcm9qZWN0LW5hbWUvLi4uIi4gVGhpcyBtZXRob2Qgd2lsbCBvbmx5IHJldHVybiByZXNvdXJjZXMgdGhhdCBhcmUgd29ya2JlbmNoIHByb2plY3QgcmVzb3VyY2VzLgorCSAqIEFueSBvdGhlciB0eXBlIG9mIFVSSSB3aWxsIGNhdXNlIDxjb2RlPm51bGw8L2NvZGU+IHRvIGJlIHJldHVybmVkLgorCSAqIEByZXR1cm4gcmVzb3VyY2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGEgcHJvamVjdCB1cmkuCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIHN0YXRpYyBSZXNvdXJjZSBnZXRFeGlzdGluZ09yQ3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgeworCQlyZXR1cm4gZ2V0RXhpc3RpbmdPckNyZWF0ZVJlc291cmNlKHVyaSwgZ2V0UmVzb3VyY2VTZXQodXJpKSk7CisJfQorCQorCS8qKgorCSAqIEdldCB0aGUgSUZpbGUgZm9yIHRoZSBVUkkuIFRoZSBVUkkgbXVzdCBiZSBhIHdvcmtiZW5jaCBwcm9qZWN0IHN0eWxlIFVSSS4gCisJICogQHBhcmFtIHVyaSBUaGUgVVJJIE1VU1QgYmUgZWl0aGVyIGEgIjxiPnBsYXRmb3JtOi9yZXNvdXJjZS88L2I+cHJvamVjdC1uYW1lLy4uLi4iIHR5cGUgVVJJIG9yIGl0CisJICogbXVzdCBiZSBvZiB0eXBlICJwcm9qZWN0LW5hbWUvLi4uIi4gVGhpcyBtZXRob2Qgd2lsbCBvbmx5IHJldHVybiByZXNvdXJjZXMgdGhhdCBhcmUgd29ya2JlbmNoIHByb2plY3QgcmVzb3VyY2VzLgorCSAqIEFueSBvdGhlciB0eXBlIG9mIFVSSSB3aWxsIGNhdXNlIDxjb2RlPm51bGw8L2NvZGU+IHRvIGJlIHJldHVybmVkLgorCSAqIEByZXR1cm4gdGhlIElGaWxlIGlmIHRoZSBVUkkgaXMgYSBwcm9qZWN0IGZvcm0sIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBhIHByb2plY3QgZm9ybSwgT1IgdGhlIHByb2plY3QgZG9lc24ndCBleGlzdC4gVGhlIElGaWxlIHJldHVybmVkIGRvZXNuJ3QgbmVjZXNzYXJpbHkgZXhpc3QuIFVzZSB7QGxpbmsgSUZpbGUjZXhpc3RzKCl9IHRvIHRlc3QgdGhhdC4KKwkgKiAKKwkgKiBAc2luY2UgMS4yLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIElGaWxlIGdldElGaWxlKFVSSSB1cmkpIHsKKwkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QodXJpKTsKKwkJaWYgKHByb2plY3QgIT0gbnVsbCkgeworCQkJSVBhdGggcGF0aDsKKwkJCWlmIChpc1BsYXRmb3JtUmVzb3VyY2VVUkkodXJpKSkgeworCQkJCS8vIE5lZWQgdG8gZ2V0IHRoZSBwYXRoIGFuZCByZW1vdmUgdGhlIGZpcnN0IHR3byBzZWdtZW50cyAoL3Jlc291cmNlL3Byb2plY3QgbmFtZS8pLgorCQkJCXBhdGggPSBuZXcgUGF0aChVUkkuZGVjb2RlKHVyaS5wYXRoKCkpKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDIpOworCQkJfSBlbHNlIHsKKwkJCQkvLyBOZWVkIHRvIGdldCB0aGUgcGF0aCBhbmQgcmVtb3ZlIHRoZSBmaXJzdCBzZWdtZW50ICgvcHJvamVjdCBuYW1lLykuCisJCQkJcGF0aCA9IG5ldyBQYXRoKFVSSS5kZWNvZGUodXJpLnBhdGgoKSkpLnJlbW92ZUZpcnN0U2VnbWVudHMoMSk7CisJCQl9CisJCQlyZXR1cm4gcHJvamVjdC5nZXRGaWxlKHBhdGgpOworCQl9IGVsc2UKKwkJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENoZWNrIGZvciBhIGNhY2hlZCBSZXNvdXJjZSBmb3IgdGhlIGdpdmVuIFVSSSwgaWYgbm9uZSBpcyBmb3VuZCwgY3JlYXRlIGEgbmV3IFJlc291cmNlIGZvciB3aXRoIHRoZSBVUkkgYWdhaW5zdCB0aGUgZ2l2ZW4gUmVzb3VyY2VTZXQuCisJICogCisJICogQHBhcmFtIHVyaSAKKwkgKiBAcGFyYW0gc2V0CisJICogQHJldHVybiByZXNvdXJjZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBzZXQgd2FzIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UgZ2V0RXhpc3RpbmdPckNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFJlc291cmNlU2V0IHNldCkgeworCQlpZiAoc2V0ICE9IG51bGwpIHsKKwkJCVJlc291cmNlIHJlcyA9IHNldC5nZXRSZXNvdXJjZSh1cmksIGZhbHNlKTsKKwkJCWlmIChyZXMgPT0gbnVsbCkKKwkJCQlyZXMgPSBzZXQuY3JlYXRlUmVzb3VyY2UodXJpKTsKKwkJCXJldHVybiByZXM7CisJCX0gZWxzZQorCQkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJuIGEgbmV3IG9yIGV4aXN0aW5nIGNvbnRleHQgYmFzZSBvbiA8Y29kZT5hUHJvamVjdDwvY29kZT4uIEFsbG93IHRoZSA8Y29kZT5jb250cmlidXRvcjwvY29kZT4gdG8gY29udHJpYnV0ZSB0byB0aGUgbmV3IG9yIGV4aXN0aW5nCisJICogbmF0dXJlIHByaW9yIHRvIHJldHVybmluZy4KKwkgKiAKKwkgKiBAcGFyYW0gYVByb2plY3QKKwkgKiBAcGFyYW0gY29udHJpYnV0b3IKKwkgKiBAcmV0dXJuIHRoZSBjb250ZXh0IGJhc2UgZm9yIHRoZSBwcm9qZWN0LgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgY3JlYXRlRU1GQ29udGV4dChJUHJvamVjdCBhUHJvamVjdCwgSUVNRkNvbnRleHRDb250cmlidXRvciBjb250cmlidXRvcikgeworCQlyZXR1cm4gRU1GV29ya2JlbmNoQ29udGV4dEZhY3RvcnkuSU5TVEFOQ0UuY3JlYXRlRU1GQ29udGV4dChhUHJvamVjdCwgY29udHJpYnV0b3IpOworCX0KKworCS8qKgorCSAqIERvZXMgdGhlIHBhc3NlZCBVUkkgaGF2ZSB0aGUgZm9ybSBwbGF0Zm9ybTovcmVzb3VyY2UvLi4uID8KKwkgKiAKKwkgKiBAcGFyYW0gdXJpCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBpdCBpcyBhIHBsYXRmb3JtIHJlc291cmNlIHByb3RvY29sLgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BsYXRmb3JtUmVzb3VyY2VVUkkoVVJJIHVyaSkgeworCQlyZXR1cm4gSkVNVXRpbFBsdWdpbi5QTEFURk9STV9QUk9UT0NPTC5lcXVhbHModXJpLnNjaGVtZSgpKSAmJiBKRU1VdGlsUGx1Z2luLlBMQVRGT1JNX1JFU09VUkNFLmVxdWFscyh1cmkuc2VnbWVudCgwKSk7CisJfQorCisJLyoqCisJICogVGhpcyBhcGkgbWF5IGJlIHVzZWQgdG8gY2FjaGUgYSBSZXNvdXJjZSBpZiBpdCBoYXMgYSBVUkkgdGhhdCBpcyBXb3Jrc3BhY2UgcmVsYXRpdmUuIFJldHVybiB0cnVlIGlmIGl0IGlzIGNhY2hlZC4KKwkgKiAKKwkgKiBAcGFyYW0gYVJlc291cmNlCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBpdCB3YXMgc3VjY2Vzc2Z1bCB0byBjYWNoZS4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FjaGVSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKKwkJaWYgKGFSZXNvdXJjZSAhPSBudWxsKSB7CisJCQlSZXNvdXJjZVNldCBzZXQgPSBnZXRSZXNvdXJjZVNldChhUmVzb3VyY2UuZ2V0VVJJKCkpOworCQkJaWYgKHNldCAhPSBudWxsKQorCQkJCXJldHVybiBzZXQuZ2V0UmVzb3VyY2VzKCkuYWRkKGFSZXNvdXJjZSk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIFRoaXMgYXBpIGlzIHVzZWQgaWYgeW91IGNyZWF0ZSBhIG5ldyBNT0YgcmVzb3VyY2UgYW5kIHlvdSB3YW50IHRvIGFkZCBpdCB0byB0aGUgY29ycmVjdCBSZXNvdXJjZVNldC4gSW4gb3JkZXIgdG8gZG8gdGhhdCwgd2UgbmVlZCB0aGUgSVByb2plY3QKKwkgKiB0aGF0IHlvdSB3YW50IGFSZXNvdXJjZSB0byBiZSBjYWNoZWQgd2l0aGluIGFzIHdlbGwgYXMgdGhlIElQYXRoIHdoaWNoIGlzIHRoZSBmdWxsIHBhdGggb2YgdGhlIGxvY2F0aW9uIG9mIHRoZSBuZXcgUmVzb3VyY2UuCisJICogCisJICogQHBhcmFtIGFQcm9qZWN0CisJICogQHBhcmFtIGFSZXNvdXJjZQorCSAqIEBwYXJhbSBmdWxsUGF0aAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcmVzb3VyY2Ugd2FzIGNhY2hlZC4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FjaGVSZXNvdXJjZShJUHJvamVjdCBhUHJvamVjdCwgUmVzb3VyY2UgYVJlc291cmNlLCBJUGF0aCBmdWxsUGF0aCkgeworCQlpZiAoYVByb2plY3QgPT0gbnVsbCB8fCBhUmVzb3VyY2UgPT0gbnVsbCB8fCAhYVByb2plY3QuaXNBY2Nlc3NpYmxlKCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCVJlc291cmNlU2V0IHNldCA9IGdldFJlc291cmNlU2V0KGFQcm9qZWN0KTsKKwkJaWYgKHNldCAhPSBudWxsKSB7CisJCQlVUkkgY29udmVydGVkID0gc2V0LmdldFVSSUNvbnZlcnRlcigpLm5vcm1hbGl6ZShhUmVzb3VyY2UuZ2V0VVJJKCkpOworCQkJaWYgKGNvbnZlcnRlZCAhPSBhUmVzb3VyY2UuZ2V0VVJJKCkpCisJCQkJYVJlc291cmNlLnNldFVSSShjb252ZXJ0ZWQpOworCQkJcmV0dXJuIHNldC5nZXRSZXNvdXJjZXMoKS5hZGQoYVJlc291cmNlKTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBwYXRoIG9mIHRoZSBwcm9qZWN0IHJlc291cmNlIHJlbGF0aXZlIHRvIHRoZSB3b3Jrc3BhY2Ugb3IgcmVsYXRpdmUgdG8gdGhlIGxpc3Qgb2YgY29udGFpbmVycyBpbiB0aGlzIHByb2plY3QuCisJICogCisJICogQHBhcmFtIGFSZXNvdXJjZQorCSAqIEByZXR1cm4gcGF0aAorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdHVhbFByb2plY3RSZWxhdGl2ZVVSSShJUmVzb3VyY2UgYVJlc291cmNlKSB7CisJCWlmIChhUmVzb3VyY2UgPT0gbnVsbCB8fCAhYVJlc291cmNlLmlzQWNjZXNzaWJsZSgpKQorCQkJcmV0dXJuIG51bGw7CisJCUlQcm9qZWN0IHByb2plY3QgPSBhUmVzb3VyY2UuZ2V0UHJvamVjdCgpOworCQlJUGF0aCBwYXRoID0gZ2V0UGF0aEluUHJvamVjdChwcm9qZWN0LCBhUmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSk7CisJCXJldHVybiBwYXRoLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogUmV0dXJuIGFuIElQYXRoIHRoYXQgY2FuIGJlIHVzZWQgdG8gbG9hZCBhIFJlc291cmNlIHVzaW5nIHRoZSA8Y29kZT5mdWxsUGF0aDwvY29kZT4uIFRoaXMgd2lsbCBiZSBhIHByb2plY3QgcmVsYXRpdmUgcGF0aC4KKwkgKiAKKwkgKiBAcGFyYW0gcHJvamVjdAorCSAqIEBwYXJhbSBmdWxsUGF0aAorCSAqIEByZXR1cm4gcGF0aAorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0UGF0aEluUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LCBJUGF0aCBmdWxsUGF0aCkgeworCQlMaXN0IGNvbnRhaW5lcnMgPSBnZXRQcm9qZWN0VVJJQ29udmVydGVyQ29udGFpbmVycyhwcm9qZWN0KTsKKwkJaWYgKCFjb250YWluZXJzLmlzRW1wdHkoKSkKKwkJCXJldHVybiBnZXRQYXRoRnJvbUNvbnRhaW5lcnMoY29udGFpbmVycywgZnVsbFBhdGgpOworCQlyZXR1cm4gZnVsbFBhdGg7CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBMaXN0IGdldFByb2plY3RVUklDb252ZXJ0ZXJDb250YWluZXJzKElQcm9qZWN0IHByb2plY3QpIHsKKwkJRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgbmF0dXJlID0gY3JlYXRlRU1GQ29udGV4dChwcm9qZWN0LCBudWxsKTsKKwkJaWYgKG5hdHVyZSAhPSBudWxsKSB7CisJCQlXb3JrYmVuY2hVUklDb252ZXJ0ZXIgY29udiA9IChXb3JrYmVuY2hVUklDb252ZXJ0ZXIpIG5hdHVyZS5nZXRSZXNvdXJjZVNldCgpLmdldFVSSUNvbnZlcnRlcigpOworCQkJaWYgKGNvbnYgIT0gbnVsbCkKKwkJCQlyZXR1cm4gY29udi5nZXRJbnB1dENvbnRhaW5lcnMoKTsKKwkJfQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKKwl9CisKKwkvKioKKwkgKiBJZiB0aGlzIHBhdGggaXMgY29udGFpbmVkIHdpdGhpbiBvbmUgb2YgdGhlIGxpc3RlZCBjb250YWluZXJzLCB0aGVuIHJldHVybiB0aGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgY29udGFpbmVyLgorCSAqIAorCSAqIEBwYXJhbSBjb250YWluZXJzCisJICogQHBhcmFtIGZ1bGxQYXRoCisJICogQHJldHVybiBwYXRoIHJlbGF0aXZlIHRvIGEgY29udGFpbmVyLCBvciB1bmNoYW5nZWQgcGF0aCBpZiBub3QgaW4gYSBjb250YWluZXIuCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIHN0YXRpYyBJUGF0aCBnZXRQYXRoRnJvbUNvbnRhaW5lcnMoTGlzdCBjb250YWluZXJzLCBJUGF0aCBmdWxsUGF0aCkgeworCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IG51bGw7CisJCUlQYXRoIHJlc3VsdDsKKwkJaW50IHNpemUgPSBjb250YWluZXJzLnNpemUoKTsKKwkJaW50IG1hdGNoaW5nID0gLTE7CisJCUlQYXRoIGNvbnRhaW5lclBhdGg7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQljb250YWluZXIgPSAoSUNvbnRhaW5lcikgY29udGFpbmVycy5nZXQoaSk7CisJCQljb250YWluZXJQYXRoID0gY29udGFpbmVyLmdldEZ1bGxQYXRoKCk7CisJCQltYXRjaGluZyA9IGZ1bGxQYXRoLm1hdGNoaW5nRmlyc3RTZWdtZW50cyhjb250YWluZXJQYXRoKTsKKwkJCWlmIChtYXRjaGluZyA+IDAgJiYgbWF0Y2hpbmcgPT0gY29udGFpbmVyUGF0aC5zZWdtZW50Q291bnQoKSkgeworCQkJCXJlc3VsdCA9IGZ1bGxQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMobWF0Y2hpbmcpOworCQkJCXJlc3VsdCA9IHJlc3VsdC5tYWtlUmVsYXRpdmUoKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBmdWxsUGF0aDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgPGNvZGU+dXJpPC9jb2RlPiBoYXMgaXRzIGNvbnRhaW5lciBzZWdtZW50cyB2aXNpYmxlIGZyb20gdGhlIGlucHV0IGNvbnRhaW5lcnMgZm9yIHRoZSA8Y29kZT5wcm9qZWN0PC9jb2RlPi4KKwkgKiAKKwkgKiBAcGFyYW0gcHJvamVjdAorCSAqIEBwYXJhbSB1cmkKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB1cmkgaXMgdmlzaWJsZSBmcm9tIHRoZSBpbnB1dCBjb250YWluZXJzLgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNDb250YWluZXJTdHJ1Y3R1cmUoSVByb2plY3QgcHJvamVjdCwgVVJJIHVyaSkgeworCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHVyaSAhPSBudWxsKSB7CisJCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgodXJpLnRvU3RyaW5nKCkpOworCQkJTGlzdCBjb250YWluZXJzID0gZ2V0UHJvamVjdFVSSUNvbnZlcnRlckNvbnRhaW5lcnMocHJvamVjdCk7CisJCQlpbnQgc2VnbWVudENvdW50ID0gcGF0aC5zZWdtZW50Q291bnQoKTsKKwkJCUlQYXRoIGNvbnRhaW5lclBhdGggPSBzZWdtZW50Q291bnQgPiAxID8gcGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSkgOiBudWxsOworCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSBudWxsOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250YWluZXJzLnNpemUoKTsgaSsrKSB7CisJCQkJY29udGFpbmVyID0gKElDb250YWluZXIpIGNvbnRhaW5lcnMuZ2V0KGkpOworCQkJCWlmICghY29udGFpbmVyLmlzQWNjZXNzaWJsZSgpKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoc2VnbWVudENvdW50ID09IDEpIHsKKwkJCQkJaWYgKGNvbnRhaW5lciA9PSBwcm9qZWN0KQorCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJfSBlbHNlIGlmIChjb250YWluZXJQYXRoICE9IG51bGwpIHsKKwkJCQkJSUZvbGRlciBmb2xkZXIgPSBjb250YWluZXIuZ2V0Rm9sZGVyKGNvbnRhaW5lclBhdGgpOworCQkJCQlpZiAoZm9sZGVyICE9IG51bGwgJiYgZm9sZGVyLmlzQWNjZXNzaWJsZSgpKQorCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIHJlc291cmNlIGZvciB0aGUgdXJpLiBUaGUgVVJJIE1VU1QgYmUgZWl0aGVyIGEgIjxiPnBsYXRmb3JtOi9yZXNvdXJjZS88L2I+cHJvamVjdC1uYW1lLy4uLi4iIHR5cGUgVVJJIG9yIGl0CisJICogbXVzdCBiZSBvZiB0eXBlICJwcm9qZWN0LW5hbWUvLi4uIi4gVGhpcyBtZXRob2Qgd2lsbCBvbmx5IHJldHVybiByZXNvdXJjZXMgdGhhdCBhcmUgd29ya2JlbmNoIHByb2plY3QgcmVzb3VyY2VzLgorCSAqIEFueSBvdGhlciB0eXBlIG9mIFVSSSB3aWxsIGNhdXNlIDxjb2RlPm51bGw8L2NvZGU+IHRvIGJlIHJldHVybmVkLiBJdCB3aWxsIGJlIGxvYWRlZCBpZiBub3QgYWxyZWFkeSBsb2FkZWQuIElmIGl0IGlzIG5vdCB0bworCSAqIGJlIGxvYWRlZCBpZiBub3QgbG9hZGVkIHVzZSB7QGxpbmsgI2dldFJlc291cmNlKFVSSSwgYm9vbGVhbil9IGluc3RlYWQuCisJICogCisJICogQHBhcmFtIHVyaSBtdXN0IGJlIGVpdGhlciBhICI8Yj5wbGF0Zm9ybTovcmVzb3VyY2UvPC9iPnByb2plY3QtbmFtZS8uLi4iIGZvcm0gb3IgaXQgbXVzdCBiZSAicHJvamVjdC1uYW1lLy4uLiIuIEFueSBvdGhlciBmb3JtIHdpbGwgYmUgaW52YWxpZC4KKwkgKiBAcmV0dXJuIHJlc291cmNlIGlmIHVyaSBpcyBmb3IgYSB2YWxpZCB3b3JrYmVuY2ggcHJvamVjdCByZXNvdXJjZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9qZWN0IG5vdCBmb3VuZCBvciBub3QgYSB2YWxpZCBwcm9qZWN0IHJlc291cmNlLgorCSAqIAorCSAqIEB0aHJvd3MgV3JhcHBlZEV4Y2VwdGlvbiBpZiB2YWxpZCBwcm9qZWN0IGZvcm1hdCBVUkkgYnV0IGZpbGUgbm90IGZvdW5kIG9yIHNvbWUgb3RoZXIgZXJyb3Igb24gbG9hZC4KKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFJlc291cmNlIGdldFJlc291cmNlKFVSSSB1cmkpIHsKKwkJcmV0dXJuIGdldFJlc291cmNlKHVyaSwgdHJ1ZSk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBSZXNvdXJjZSBmb3IgdGhlIHBhc3NlZCBJRmlsZSB3aXRob3V0IGZvcmNpbmcgYSBsb2FkLgorCSAqIAorCSAqIEBwYXJhbSBhRmlsZQorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFJlc291cmNlIGdldFJlc291cmNlKElGaWxlIGFGaWxlKSB7CisJCXJldHVybiBnZXRSZXNvdXJjZShhRmlsZSwgZmFsc2UpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgUmVzb3VyY2UgZm9yIHRoZSBwYXNzZWQgSUZpbGUsIGZvcmNpbmcgYSBsb2FkIGlmIDxjb2RlPmxvYWRPbkRlbWFuZDwvY29kZT4gc2F5cyBzby4KKwkgKiAKKwkgKiBAcGFyYW0gYUZpbGUKKwkgKiBAcGFyYW0gbG9hZE9uRGVtYW5kCisJICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiB3aWxsIGZvcmNlIGEgbG9hZCBvZiByZXNvdXJjZSBpZiBub3QgbG9hZGVkLgorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFJlc291cmNlIGdldFJlc291cmNlKElGaWxlIGFGaWxlLCBib29sZWFuIGxvYWRPbkRlbWFuZCkgeworCQlpZiAoYUZpbGUgIT0gbnVsbCkKKwkJCXJldHVybiBnZXRSZXNvdXJjZShVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShhRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpLCBsb2FkT25EZW1hbmQpOworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIFJlc291cmNlIGZvciB0aGUgcGFzc2VkIElGaWxlIHdpdGhvdXQgYSBsb2FkIGlmIG5vdCBsb2FkZWQuCisJICogCisJICogQHBhcmFtIGFGaWxlCisJICogQHJldHVybgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UgbG9hZChJRmlsZSBhRmlsZSkgeworCQlyZXR1cm4gZ2V0UmVzb3VyY2UoYUZpbGUsIHRydWUpOworCX0KKworCS8qKgorCSAqIEdldCB0aGUgcmVzb3VyY2UgZm9yIHRoZSB1cmkuIFRoZSBVUkkgTVVTVCBiZSBlaXRoZXIgYSAiPGI+cGxhdGZvcm06L3Jlc291cmNlLzwvYj5wcm9qZWN0LW5hbWUvLi4uLiIgdHlwZSBVUkkgb3IgaXQKKwkgKiBtdXN0IGJlIG9mIHR5cGUgInByb2plY3QtbmFtZS8uLi4iLiBUaGlzIG1ldGhvZCB3aWxsIG9ubHkgcmV0dXJuIHJlc291cmNlcyB0aGF0IGFyZSB3b3JrYmVuY2ggcHJvamVjdCByZXNvdXJjZXMuCisJICogQW55IG90aGVyIHR5cGUgb2YgVVJJIHdpbGwgY2F1c2UgPGNvZGU+bnVsbDwvY29kZT4gdG8gYmUgcmV0dXJuZWQuCisJICogCisJICogQHBhcmFtIHVyaSBtdXN0IGJlIGVpdGhlciBhICI8Yj5wbGF0Zm9ybTovcmVzb3VyY2UvPC9iPnByb2plY3QtbmFtZS8uLi4iIGZvcm0gb3IgaXQgbXVzdCBiZSAicHJvamVjdC1uYW1lLy4uLiIuIEFueSBvdGhlciBmb3JtIHdpbGwgYmUgaW52YWxpZC4KKwkgKiBAcGFyYW0gbG9hZE9uRGVtYW5kIDxjb2RlPnRydWU8L2NvZGU+IHdpbGwgY2F1c2UgcmVzb3VyY2UgdG8gYmUgbG9hZGVkIGlmIG5vdCBhbHJlYWR5IGxvYWRlZC4KKwkgKiBAcmV0dXJuIHJlc291cmNlIGlmIHVyaSBpcyBmb3IgYSB2YWxpZCB3b3JrYmVuY2ggcHJvamVjdCByZXNvdXJjZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvamVjdCBub3QgZm91bmQsIG9yIG5vdCBhIHZhbGlkIHByb2plY3QgcmVzb3VyY2UgdXJpLgorCSAqIAorCSAqIEB0aHJvd3MgV3JhcHBlZEV4Y2VwdGlvbiBpZiB2YWxpZCBwcm9qZWN0IGZvcm1hdCBVUkkgYnV0IGZpbGUgbm90IGZvdW5kIG9yIHNvbWUgb3RoZXIgZXJyb3Igb24gbG9hZCBpZiBsb2FkT25EZW1hbmQgaXMgdHJ1ZS4KKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFJlc291cmNlIGdldFJlc291cmNlKFVSSSB1cmksIGJvb2xlYW4gbG9hZE9uRGVtYW5kKSB7CisJCVJlc291cmNlU2V0IHNldCA9IGdldFJlc291cmNlU2V0KHVyaSk7CisJCWlmIChzZXQgIT0gbnVsbCkKKwkJCXJldHVybiBzZXQuZ2V0UmVzb3VyY2UodXJpLCBsb2FkT25EZW1hbmQpOworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gYSBSZXNvdXJjZVNldCBmb3IgdGhlIHBhc3NlZCBVUkkuIFRoZSBVUkkgc2hvdWxkIGJlIGluIHRoZSBmb3JtYXQgcGxhdGZvcm06L3Jlc291cmNlL3twcm9qZWN0IG5hbWV9Ly4uLiBvciB7cHJvamVjdCBuYW1lfS8uLi4gZm9yIHRoaXMKKwkgKiBhcGkgdG8gd29yay4KKwkgKiAKKwkgKiBAcGFyYW0gdXJpCisJICogQHJldHVybiB0aGUgcmVzb3VyY2Ugc2V0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBvZiBjb3JyZWN0IGZvcm0gb3IgcHJvamVjdCBkb2Vzbid0IGhhdmUgYSByZXNvdXJjZSBzZXQuCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIHN0YXRpYyBSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldChVUkkgdXJpKSB7CisJCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KHVyaSk7CisJCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5pc0FjY2Vzc2libGUoKSkKKwkJCXJldHVybiBnZXRSZXNvdXJjZVNldChwcm9qZWN0KTsKKwkJZWxzZQorCQkJcmV0dXJuIG51bGw7CisJfQorCQorCS8qCisJICogR2V0IHRoZSBwcm9qZWN0IGZvciB0aGUgdXJpIGlmIHRoZSB1cmkgaXMgYSB2YWxpZCB3b3JrYmVuY2ggcHJvamVjdCBmb3JtYXQgdXJpLiBudWxsIG90aGVyd2lzZS4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0KFVSSSB1cmkpIHsKKwkJU3RyaW5nIHByb2plY3ROYW1lOworCQlpZiAoaXNQbGF0Zm9ybVJlc291cmNlVVJJKHVyaSkpCisJCQlwcm9qZWN0TmFtZSA9IHVyaS5zZWdtZW50KDEpOworCQllbHNlIGlmICh1cmkuc2NoZW1lKCkgPT0gbnVsbCkgeworCQkJcHJvamVjdE5hbWUgPSBuZXcgUGF0aCh1cmkucGF0aCgpKS5zZWdtZW50KDApOyAvL2Fzc3VtZSBwcm9qZWN0IG5hbWUgaXMgZmlyc3QgaW4gdGhlIFVSSQorCQl9IGVsc2UKKwkJCXJldHVybiBudWxsOworCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoVVJJLmRlY29kZShwcm9qZWN0TmFtZSkpOworCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpCisJCQlyZXR1cm4gcHJvamVjdDsKKwkJZWxzZQorCQkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBSZXNvdXJjZVNldCBmb3IgdGhlIHBhc3NlZCBJUHJvamVjdC4KKwkgKiAKKwkgKiBAcGFyYW0gcHJvamVjdAorCSAqIEByZXR1cm4gcmVzb3VyY2Ugc2V0CisJICovCisJcHVibGljIHN0YXRpYyBSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldChJUHJvamVjdCBwcm9qZWN0KSB7CisJCUVNRldvcmtiZW5jaENvbnRleHRCYXNlIG5hdCA9IGNyZWF0ZUVNRkNvbnRleHQocHJvamVjdCwgbnVsbCk7CisJCWlmIChuYXQgIT0gbnVsbCkKKwkJCXJldHVybiBuYXQuZ2V0UmVzb3VyY2VTZXQoKTsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogR2V0IHRoZSB3b3Jrc3BhY2UuIChqdXN0IHVzZSB7QGxpbmsgUmVzb3VyY2VzUGx1Z2luI2dldFdvcmtzcGFjZSgpfSkuCisJICogCisJICogQHJldHVybgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7CisJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBwcm9qZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2Ugc2V0LgorCSAqIAorCSAqIEBwYXJhbSBzZXQKKwkgKiBAcmV0dXJuIHByb2plY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcmVzb3VyY2Ugc2V0IG5vdCBhc3NvY2lhdGVkIHdpdGggYSBwcm9qZWN0LgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0UHJvamVjdChSZXNvdXJjZVNldCBzZXQpIHsKKwkJaWYgKHNldCAhPSBudWxsKSB7CisJCQlpZiAoc2V0IGluc3RhbmNlb2YgUHJvamVjdFJlc291cmNlU2V0KSB7CisJCQkJUHJvamVjdFJlc291cmNlU2V0IHBzZXQgPSAoUHJvamVjdFJlc291cmNlU2V0KSBzZXQ7CisJCQkJcmV0dXJuIHBzZXQuZ2V0UHJvamVjdCgpOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc1JlZ2lzdGVyZWRVUklNYXBwaW5nKFN0cmluZyBocmVmKSB7CisJCWlmIChocmVmICE9IG51bGwpIHsKKwkJCVN0cmluZyBmaWxlID0gaHJlZjsKKwkJCWludCBpbmRleCA9IGhyZWYuaW5kZXhPZignIycpOworCQkJaWYgKGluZGV4ID4gLTEpCisJCQkJZmlsZSA9IGhyZWYuc3Vic3RyaW5nKDAsIGluZGV4KTsKKwkJCXJldHVybiBVUklDb252ZXJ0ZXIuVVJJX01BUC5nZXQoZmlsZSkgIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogUmVtb3ZlIGFsbCBvZiB0aGUgcmVzb3VyY2VzIGZyb20gdGhlIHJlc291cmNlIHNldCBhbmQgdGhlbiB1bmxvYWQgdGhlbS4gVW5sb2FkIGZvcmNlcyBhbGwgb2YgdGhlIG9iamVjdHMgdG8gYmVjb21lIHByb3hpZXMgc28gbmV4dCByZXNvbHZlIHdpbGwKKwkgKiByZWxvYWQgdGhlIHJlc291cmNlLgorCSAqIAorCSAqIEBwYXJhbSByZXNvdXJjZXMKKwkgKiBAcGFyYW0gYVNldAorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbmRVbmxvYWRBbGwoTGlzdCByZXNvdXJjZXMsIFJlc291cmNlU2V0IGFTZXQpIHsKKwkJaWYgKGFTZXQgPT0gbnVsbCB8fCByZXNvdXJjZXMgPT0gbnVsbCB8fCByZXNvdXJjZXMuaXNFbXB0eSgpKQorCQkJcmV0dXJuOworCQlhU2V0LmdldFJlc291cmNlcygpLnJlbW92ZUFsbChyZXNvdXJjZXMpOworCQlSZXNvdXJjZSByZXM7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7CisJCQlyZXMgPSAoUmVzb3VyY2UpIHJlc291cmNlcy5nZXQoaSk7CisJCQlyZXMudW5sb2FkKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUdXJuIG9iamVjdCBpbnRvIGEgcHJveHkuCisJICogCisJICogQHBhcmFtIGFuT2JqZWN0CisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBvYmplY3Qgd2FzIGFibGUgdG8gYmVjb21lIGEgcHJveHkuCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGJlY29tZVByb3h5KEVPYmplY3QgYW5PYmplY3QpIHsKKwkJaWYgKGFuT2JqZWN0ICE9IG51bGwpIHsKKwkJCVJlc291cmNlIHJlcyA9IGFuT2JqZWN0LmVSZXNvdXJjZSgpOworCQkJaWYgKHJlcyAhPSBudWxsKSB7CisJCQkJVVJJIHVyaSA9IHJlcy5nZXRVUkkoKTsKKwkJCQkoKEludGVybmFsRU9iamVjdCkgYW5PYmplY3QpLmVTZXRQcm94eVVSSSh1cmkuYXBwZW5kRnJhZ21lbnQocmVzLmdldFVSSUZyYWdtZW50KGFuT2JqZWN0KSkpOworCQkJCS8vYW5PYmplY3QuZUFkYXB0ZXJzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRydWUgaWYgdGhlIFdyYXBwZWRFeGNlcHRpb24gaXMgYWN0dWFsbHkgYSBSZXNvdXJjZSBOb3QgRm91bmQuCisJICogCisJICogQHBhcmFtIHdyYXBwZWRFeAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaXMgZXhjZXB0aW9uIHdyYXBwZXJzIGEgcmVzb3VyY2Ugbm90IGZvdW5kLgorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Jlc291cmNlTm90Rm91bmQoV3JhcHBlZEV4Y2VwdGlvbiB3cmFwcGVkRXgpIHsKKwkJRXhjZXB0aW9uIGV4Y2VwID0gd3JhcHBlZEV4LmV4Y2VwdGlvbigpOworCQl3aGlsZSAoZXhjZXAgaW5zdGFuY2VvZiBXcmFwcGVkRXhjZXB0aW9uKSB7CisJCQlleGNlcCA9ICgoV3JhcHBlZEV4Y2VwdGlvbikgZXhjZXApLmV4Y2VwdGlvbigpOworCQl9CisJCXJldHVybiBwcmltSXNSZXNvdXJjZU5vdEZvdW5kKGV4Y2VwKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIHByaW1Jc1Jlc291cmNlTm90Rm91bmQoVGhyb3dhYmxlIGV4Y2VwKSB7CisJCWlmIChleGNlcCBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKKwkJCUlTdGF0dXMgc3RhdHVzID0gKChDb3JlRXhjZXB0aW9uKSBleGNlcCkuZ2V0U3RhdHVzKCk7CisJCQlyZXR1cm4gc3RhdHVzLmdldENvZGUoKSA9PSBJUmVzb3VyY2VTdGF0dXMuUkVTT1VSQ0VfTk9UX0ZPVU5EICYmIFJlc291cmNlc1BsdWdpbi5QSV9SRVNPVVJDRVMuZXF1YWxzKHN0YXR1cy5nZXRQbHVnaW4oKSk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIFJldHVybiB0cnVlIGlmIHRoZSBXcmFwcGVkRXhjZXB0aW9uIGlzIGFjdHVhbGx5IGEgUmVzb3VyY2UgTm90IEZvdW5kLgorCSAqIAorCSAqIEBwYXJhbSB3cmFwcGVkRXgKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlzIGV4Y2VwdGlvbiB3cmFwcGVycyBhIHJlc291cmNlIG5vdCBmb3VuZC4KKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZXNvdXJjZU5vdEZvdW5kKFJlc291cmNlLklPV3JhcHBlZEV4Y2VwdGlvbiB3cmFwcGVkRXgpIHsKKwkJcmV0dXJuIHByaW1Jc1Jlc291cmNlTm90Rm91bmQod3JhcHBlZEV4LmdldENhdXNlKCkpOworCX0KKworCS8qKgorCSAqIFJldHVybiBhIFVSSSByZXByZXNlbmF0aW9uIG9mIHRoZSBwbGF0Zm9ybVVSSSB3aXRob3V0IHRoZSBsZWFkaW5nICJwbGF0Zm9ybTovcmVzb3VyY2UvIiBpZiBwcmVzZW50LgorCSAqIAorCSAqIEBwYXJhbSBwbGF0Zm9ybVVSSQorCSAqIEByZXR1cm4gdXJpCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIHN0YXRpYyBVUkkgZ2V0Tm9uUGxhdGZvcm1VUkkoVVJJIHBsYXRmb3JtVVJJKSB7CisJCWlmIChpc1BsYXRmb3JtUmVzb3VyY2VVUkkocGxhdGZvcm1VUkkpKSB7CisJCQlTdHJpbmcgdXJpU3RyaW5nID0gcHJpbUdldE5vblBsYXRmb3JtVVJJU3RyaW5nKHBsYXRmb3JtVVJJKTsKKwkJCXJldHVybiBVUkkuY3JlYXRlVVJJKHVyaVN0cmluZyk7CisJCX0KKwkJcmV0dXJuIHBsYXRmb3JtVVJJOworCX0KKworCS8qKgorCSAqIFJldHVybiBhIFN0cmluZyByZXByZXNlbmF0aW9uIG9mIHRoZSBwbGF0Zm9ybVVSSSB3aXRob3V0IHRoZSBsZWFkaW5nICJwbGF0Zm9ybTovcmVzb3VyY2UvIiBpZiBwcmVzZW50LgorCSAqIAorCSAqIEBwYXJhbSBwbGF0Zm9ybVVSSQorCSAqIEByZXR1cm4KKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROb25QbGF0Zm9ybVVSSVN0cmluZyhVUkkgcGxhdGZvcm1VUkkpIHsKKwkJaWYgKGlzUGxhdGZvcm1SZXNvdXJjZVVSSShwbGF0Zm9ybVVSSSkpIHsgcmV0dXJuIHByaW1HZXROb25QbGF0Zm9ybVVSSVN0cmluZyhwbGF0Zm9ybVVSSSk7IH0KKwkJcmV0dXJuIHBsYXRmb3JtVVJJLnRvU3RyaW5nKCk7CisJfQorCisJLyoKKwkgKiBSZW1vdmUgInBsYXRmb3JtOi9yZXNvdXJjZS8iIGZyb20gdGhlIGZyb250IG9mIHRoZSBwbGF0Zm9ybVVSSSBhbmQgcmV0dXJuIHRoZSByZW1haW5pbmcgU3RyaW5nLgorCSAqLworCXByaXZhdGUgc3RhdGljIFN0cmluZyBwcmltR2V0Tm9uUGxhdGZvcm1VUklTdHJpbmcoVVJJIHBsYXRmb3JtVVJJKSB7CisJCVN0cmluZyB1cmlTdHJpbmcgPSBwbGF0Zm9ybVVSSS50b1N0cmluZygpOworCQkvLyJwbGF0Zm9ybTovcmVzb3VyY2UvIiBpcyAxOSBjaGFyYWN0ZXJzLgorCQlyZXR1cm4gdXJpU3RyaW5nLnN1YnN0cmluZygxOSwgdXJpU3RyaW5nLmxlbmd0aCgpKTsKKwl9CisKKwkvKioKKwkgKiBEb2VzIHRoZSBwYXNzZWQgVVJJIGhhdmUgdGhlIGZvcm0gcGxhdGZvcm06L3BsdWdpbi8uLi4gPworCSAqIAorCSAqIEBwYXJhbSB1cmkKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHVyaSBpcyBwbGF0Zm9ybSBwbHVnaW4gcHJvdG9jb2wuCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGxhdGZvcm1QbHVnaW5SZXNvdXJjZVVSSShVUkkgdXJpKSB7CisJCWlmICh1cmkgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gSkVNVXRpbFBsdWdpbi5QTEFURk9STV9QUk9UT0NPTC5lcXVhbHModXJpLnNjaGVtZSgpKSAmJiBKRU1VdGlsUGx1Z2luLlBMQVRGT1JNX1BMVUdJTi5lcXVhbHModXJpLnNlZ21lbnQoMCkpOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1dvcmtiZW5jaFVSSUNvbnZlcnRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvV29ya2JlbmNoVVJJQ29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU1Njg1MQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1dvcmtiZW5jaFVSSUNvbnZlcnRlci5qYXZhCkBAIC0wLDAgKzEsMTU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqICAkJFJDU2ZpbGU6IFdvcmtiZW5jaFVSSUNvbnZlcnRlci5qYXZhLHYgJCQKKyAqICAkJFJldmlzaW9uOiAxLjIgJCQgICQkRGF0ZTogMjAwNS8wMi8xNSAyMzowNDoxNCAkJCAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOworCisvKioKKyAqIEltcGxlbWVudGVycyBvZiB0aGlzIGludGVyZmFjZSBhcmUgV29ya2JlbmNoVVJJIGNvbnZlcnRlcnMuIFdvcmtiZW5jaCBVUkkgY29udmVydGVycyBoYW5kbGUgcmVmZXJlbmNlcyB0byBmaWxlcyBpbiB0aGUgcHJvamVjdCdzIGNvbnRhaW5lcnMuCisgKiBUaGlzIGNvbnZlcnRlciBpcyBvbmx5IG5lY2Vzc2FyeSB0byByZXNvbHZlIG9sZCBhbWJpZ3VvdXMgd29ya2JlbmNoIFVSSXMuCisgKiBAc2luY2UgMS4wLjAKKyAqLworcHVibGljIGludGVyZmFjZSBXb3JrYmVuY2hVUklDb252ZXJ0ZXIgZXh0ZW5kcyBVUklDb252ZXJ0ZXIgeworCisJLyoqCisJICogQWRkIGlucHV0IGNvbnRhaW5lciB0byB0byB0aGUgY29udmVydGVyLgorCSAqIAorCSAqIEBwYXJhbSBhQ29udGFpbmVyCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJdm9pZCBhZGRJbnB1dENvbnRhaW5lcihJQ29udGFpbmVyIGFDb250YWluZXIpOworCisJLyoqCisJICogQWRkIGxpc3Qgb2YgY29udGFpbmVycyB0byB0aGUgY29udmVydGVyLgorCSAqIAorCSAqIEBwYXJhbSBjb250YWluZXJzCisJICogICAgICAgICAgICBsaXN0IG9mIDxjb2RlPklDb250YWluZXI8L2NvZGU+CisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJdm9pZCBhZGRJbnB1dENvbnRhaW5lcnMoTGlzdCBjb250YWluZXJzKTsKKworCS8qKgorCSAqIEdldCB0aGUgZmlsZSByZWxhdGl2ZSB0byBhIGNvbnRhaW5lci4KKwkgKiAKKwkgKiBAcGFyYW0gdXJpCisJICogQHJldHVybiBmaWxlIHJlbGF0aXZlIHRvIGEgY29udGFpbmVyIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdC4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlJRmlsZSBnZXRGaWxlKFN0cmluZyB1cmkpOworCisJLyoqCisJICogR2V0IGZpcnN0IGlucHV0IGNvbnRhaW5lcgorCSAqIAorCSAqIEByZXR1cm4gZmlyc3QgaW5wdXQgY29udGFpbmVyIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgc2V0LgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCUlDb250YWluZXIgZ2V0SW5wdXRDb250YWluZXIoKTsKKworCS8qKgorCSAqIEdldCBhbGwgaW5wdXQgY29udGFpbmVycy4KKwkgKiAKKwkgKiBAcmV0dXJuIGFsbCBpbnB1dCBjb250YWluZXJzLgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCUxpc3QgZ2V0SW5wdXRDb250YWluZXJzKCk7CisKKwkvKioKKwkgKiBHZXQgdGhlIG91dHB1dCBjb250YWluZXIgaWYgc2V0LgorCSAqIAorCSAqIEByZXR1cm4gb3V0cHV0IGNvbnRhaW5lciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Qgc2V0LgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCUlDb250YWluZXIgZ2V0T3V0cHV0Q29udGFpbmVyKCk7CisKKwkvKioKKwkgKiBTZXQgdGhlIG91dHB1dCBjb250YWluZXIuCisJICogCisJICogQHBhcmFtIGNvbnRhaW5lcgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXZvaWQgc2V0T3V0cHV0Q29udGFpbmVyKElDb250YWluZXIgY29udGFpbmVyKTsKKworCS8qKgorCSAqIFJldHVybiBhbiBJRmlsZSBmb3IKKwkgKiAKKwkgKiBAYVBhdGguIElmIHdlIGhhdmUgYSBwYXJlbnQgYW5kIHdlIGRvIG5vdCBjb250YWluIHRoZSBmaXJzdCBzZWdtZW50IG9mIHRoZSBhUGF0aCwgZm9yd2FyZCB0byB0aGUgcGFyZW50IHRvIHJldHJpZXZlIHRoZSBmaWxlLgorCSAqIEBwYXJhbSBhUGF0aAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlJRmlsZSBnZXRPdXRwdXRGaWxlKElQYXRoIGFQYXRoKTsKKworCS8qKgorCSAqIEdldCBvdXRwdXQgZmlsZSB3aXRoIG1hcHBpbmcgYXBwbGllZC4KKwkgKiAKKwkgKiBAcGFyYW0gdXJpCisJICogQHJldHVybgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCUlGaWxlIGdldE91dHB1dEZpbGVXaXRoTWFwcGluZ0FwcGxpZWQoU3RyaW5nIHVyaSk7CisKKwkvKioKKwkgKiBSZW1vdmUgaW5wdXQgY29udGFpbmVyIGZyb20gbGlzdC4KKwkgKiAKKwkgKiBAcGFyYW0gYUNvbnRhaW5lcgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcmVtb3ZlZC4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlib29sZWFuIHJlbW92ZUlucHV0Q29udGFpbmVyKElDb250YWluZXIgYUNvbnRhaW5lcik7CisKKwkvKioKKwkgKiBSZXR1cm4gdHJ1ZSBpZiB3ZSBjYW4gcmV0cmlldmUgdGhlIHJlc291cmNlIHVzZWQgdG8gb3BlbiBhbiBpbnB1dCBzdHJlYW0gb24uCisJICogCisJICogQHBhcmFtIGFGaWxlTmFtZQorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZmlsZW5hbWUgaXMgdmFsaWQgZm9yIGZpbGUgc3RyZWFtIGFjY2Vzcy4KKwkgKiBAc2luY2UgMS4wLjAKKwkgKiAgCisJICovCisJYm9vbGVhbiBjYW5HZXRVbmRlcmx5aW5nUmVzb3VyY2UoU3RyaW5nIGFGaWxlTmFtZSk7CisKKwkvKioKKwkgKiBJcyBmb3JjZSBzYXZlIHJlbGF0aXZlIGZsYWcgdHVybmVkIG9uLgorCSAqIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZm9yY2Ugc2F2ZSByZWxhdGl2ZSBpcyB0dXJuZWQgb24uCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJYm9vbGVhbiBpc0ZvcmNlU2F2ZVJlbGF0aXZlKCk7CisKKwkvKioKKwkgKiBTZXQgdG8gdHJ1ZSBpZiB5b3UgZG8gbm90IHdhbnQgYW55IHBhdGggbWFuaXB1bGF0aW9uIHdoZW4gY3JlYXRpbmcgdGhlIG91dHB1dCBzdHJlYW0uLgorCSAqIAorCSAqIEBwYXJhbSBmb3JjZVNhdmVSZWxhdGl2ZQorCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gZm9yY2Ugc2F2ZXMgYXMgcmVsYXRpdmUuCisJICovCisJdm9pZCBzZXRGb3JjZVNhdmVSZWxhdGl2ZShib29sZWFuIGZvcmNlU2F2ZVJlbGF0aXZlKTsKKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1dvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL1dvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzY1NTUxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2VtZi93b3JrYmVuY2gvV29ya2JlbmNoVVJJQ29udmVydGVySW1wbC5qYXZhCkBAIC0wLDAgKzEsNTE0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiAgJCRSQ1NmaWxlOiBXb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsLmphdmEsdiAkJAorICogICQkUmV2aXNpb246IDEuNiAkJCAgJCREYXRlOiAyMDA2LzA1LzE3IDIwOjEzOjQ1ICQkIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2g7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuVVJJQ29udmVydGVySW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbi5KRU1VdGlsUGx1Z2luOworCisKKy8qKgorICogQSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBXb3JrYmVuY2hVUklDb252ZXJ0ZXIgaW50ZXJmYWNlLgorICogCisgKiBAc2luY2UgMS4wLjAKKyAqLworcHVibGljIGNsYXNzIFdvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwgZXh0ZW5kcyBVUklDb252ZXJ0ZXJJbXBsIGltcGxlbWVudHMgV29ya2JlbmNoVVJJQ29udmVydGVyIHsKKworCXByaXZhdGUgZmluYWwgc3RhdGljIElXb3Jrc3BhY2VSb290IFdPUktTUEFDRV9ST09UID0gVVJJQ29udmVydGVySW1wbC53b3Jrc3BhY2VSb290OworCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBXT1JLU1BBQ0VfUk9PVF9MT0NBVElPTiA9IFdPUktTUEFDRV9ST09ULmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1BST1RPQ09MID0gImZpbGUiOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBJUGF0aCBJTlZBTElEX1BBVEggPSBuZXcgUGF0aCgiISEhIX4hISEhIik7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIElGaWxlIElOVkFMSURfRklMRSA9IFdPUktTUEFDRV9ST09ULmdldEZpbGUoSU5WQUxJRF9QQVRILmFwcGVuZChJTlZBTElEX1BBVEgpKTsKKworCS8vVXNlZCB0byBhdm9pZCB0cnlpbmcgdG8gZml4dXAgdGhlIFVSSSB3aGVuIGdldHRpbmcgdGhlCisJLy9PdXRwdXRTdHJlYW0KKwlwcm90ZWN0ZWQgYm9vbGVhbiBmb3JjZVNhdmVSZWxhdGl2ZSA9IGZhbHNlOworCisJcHJvdGVjdGVkIExpc3QgaW5wdXRDb250YWluZXJzOworCisJcHJvdGVjdGVkIElDb250YWluZXIgb3V0cHV0Q29udGFpbmVyOworCisJcHJvdGVjdGVkIFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyIHJlc291cmNlU2V0U3luY2hyb25pemVyOworCQorCS8qCisJICogS0xVREdFOiBXZSBuZWVkIHRvIGtub3cgdGhlIG1ldGEgZGF0YSBhcmVhLiBUaGlzIGlzIHNvIHRoYXQgYW55IHVyaSB0aGF0IHN0YXJ0cyB3aXRoIHRoZSBtZXRhZGF0YSBkaXJlY3RvcnkKKwkgKiBpcyBjb25zaWRlcmVkIGEgZmlsZSB1cmkgYW5kIE5PVCBhIHdvcmtzcGFjZSB1cmkuIFRoZSBtZXRhZGF0YSBpcyB3aGVyZSBwbHVnaW4ncyBzdG9yZSB0aGVpciB3b3JraW5nIGRhdGEuCisJICogSXQgaXMgbm90IHBhcnQgb2YgdGhlIHdvcmtzcGFjZSByb290LgorCSAqICAKKwkgKiBUaGVyZSBpcyBubyByZXF1ZXN0IGZvciBzaW1wbHkgdGhlIG1ldGFkYXRhIGFyZWEuIFRoZSBsb2cgZmlsZSBpcyBpbiB0aGUgbWV0YWRhdGEgZGlyZWN0b3J5LiBTbyB3ZSB3aWxsCisJICogZ2V0IHRoZSBsb2cgZmlsZSBsb2NhdGlvbiBhbmQganVzdCByZW1vdmUgdGhlIGxvZyBmaWxlIG5hbWUuIFRoYXQgc2hvdWxkIGxlYXZlIHVzIHdpdGggdGhlIG1ldGFkYXRhIGRpcmVjdG9yeQorCSAqIG9ubHkuIElmIEVjbGlwc2UgZXZlciBkZWNpZGVzIHRvIG1vdmUgaXQgZnJvbSBoZXJlLCB0aGlzIHdpbGwgbm8gbG9uZ2VyIHdvcmsuIEJ1dCBpdCBoYXNuJ3QgbW92ZWQgaW4gdGhyZWUgCisJICogdmVyc2lvbnMuCisJICogCisJICogQHNpbmNlIDEuMS4wCisJICovCisJc3RhdGljIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgTUVUQURBVEFfTE9DQVRJT04gPSBQbGF0Zm9ybS5nZXRMb2dGaWxlTG9jYXRpb24oKS5yZW1vdmVMYXN0U2VnbWVudHMoMSkudG9TdHJpbmcoKTsKKworCS8qKgorCSAqIERlZmF1bHQgY29udmVydGVyIGNvbnN0cnVjdG9yLCBubyBjb250YWluZXJzLgorCSAqIAorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBXb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdCB3aXRoIGFuIGlucHV0IGNvbnRhaW5lci4KKwkgKiAKKwkgKiBAcGFyYW0gYW5JbnB1dENvbnRhaW5lcgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBXb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsKElDb250YWluZXIgYW5JbnB1dENvbnRhaW5lcikgeworCQl0aGlzKGFuSW5wdXRDb250YWluZXIsIChSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplcikgbnVsbCk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0IHdpdGggYW4gaW5wdXQgY29udGFpbmVyIGFuZCBhIHN5bmNocm9uemllci4KKwkgKiAKKwkgKiBAcGFyYW0gYUNvbnRhaW5lcgorCSAqIEBwYXJhbSBhU3luY2hyb25pemVyCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIFdvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwoSUNvbnRhaW5lciBhQ29udGFpbmVyLCBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciBhU3luY2hyb25pemVyKSB7CisJCXRoaXMoYUNvbnRhaW5lciwgbnVsbCwgYVN5bmNocm9uaXplcik7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0IHdpdGggYW4gaW5wdXQgY29udGFpbmVyIGFuZCBhbiBvdXRwdXQgY29udGFpbmVyLgorCSAqIAorCSAqIEBwYXJhbSBhbklucHV0Q29udGFpbmVyCisJICogQHBhcmFtIGFuT3V0cHV0Q29udGFpbmVyCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIFdvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwoSUNvbnRhaW5lciBhbklucHV0Q29udGFpbmVyLCBJQ29udGFpbmVyIGFuT3V0cHV0Q29udGFpbmVyKSB7CisJCXRoaXMoYW5JbnB1dENvbnRhaW5lciwgYW5PdXRwdXRDb250YWluZXIsIG51bGwpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdCB3aXRoIGFuIGlucHV0IGNvbnRhaW5lciwgb3V0cHV0IGNvbnRhaW5lciwgYW5kIGEgc3luY2hyb25pemVyLgorCSAqIAorCSAqIEBwYXJhbSBhbklucHV0Q29udGFpbmVyCisJICogQHBhcmFtIGFuT3V0cHV0Q29udGFpbmVyCisJICogQHBhcmFtIGFTeW5jaHJvbml6ZXIKKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgV29ya2JlbmNoVVJJQ29udmVydGVySW1wbChJQ29udGFpbmVyIGFuSW5wdXRDb250YWluZXIsIElDb250YWluZXIgYW5PdXRwdXRDb250YWluZXIsIFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyIGFTeW5jaHJvbml6ZXIpIHsKKwkJYWRkSW5wdXRDb250YWluZXIoYW5JbnB1dENvbnRhaW5lcik7CisJCXNldE91dHB1dENvbnRhaW5lcihhbk91dHB1dENvbnRhaW5lcik7CisJCXJlc291cmNlU2V0U3luY2hyb25pemVyID0gYVN5bmNocm9uaXplcjsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoVVJJQ29udmVydGVyI2FkZElucHV0Q29udGFpbmVyKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXIpCisJICovCisJcHVibGljIHZvaWQgYWRkSW5wdXRDb250YWluZXIoSUNvbnRhaW5lciBhQ29udGFpbmVyKSB7CisJCWlmIChhQ29udGFpbmVyICE9IG51bGwgJiYgIWdldElucHV0Q29udGFpbmVycygpLmNvbnRhaW5zKGFDb250YWluZXIpKQorCQkJZ2V0SW5wdXRDb250YWluZXJzKCkuYWRkKGFDb250YWluZXIpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hVUklDb252ZXJ0ZXIjYWRkSW5wdXRDb250YWluZXJzKGphdmEudXRpbC5MaXN0KQorCSAqLworCXB1YmxpYyB2b2lkIGFkZElucHV0Q29udGFpbmVycyhMaXN0IGNvbnRhaW5lcnMpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250YWluZXJzLnNpemUoKTsgaSsrKSB7CisJCQlhZGRJbnB1dENvbnRhaW5lcigoSUNvbnRhaW5lcikgY29udGFpbmVycy5nZXQoaSkpOworCQl9CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFVSSUNvbnZlcnRlciNyZW1vdmVJbnB1dENvbnRhaW5lcihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyKQorCSAqLworCXB1YmxpYyBib29sZWFuIHJlbW92ZUlucHV0Q29udGFpbmVyKElDb250YWluZXIgYUNvbnRhaW5lcikgeworCQlyZXR1cm4gZ2V0SW5wdXRDb250YWluZXJzKCkucmVtb3ZlKGFDb250YWluZXIpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hVUklDb252ZXJ0ZXIjZ2V0SW5wdXRDb250YWluZXJzKCkKKwkgKi8KKwlwdWJsaWMgTGlzdCBnZXRJbnB1dENvbnRhaW5lcnMoKSB7CisJCWlmIChpbnB1dENvbnRhaW5lcnMgPT0gbnVsbCkKKwkJCWlucHV0Q29udGFpbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJcmV0dXJuIGlucHV0Q29udGFpbmVyczsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoVVJJQ29udmVydGVyI2dldElucHV0Q29udGFpbmVyKCkKKwkgKi8KKwlwdWJsaWMgSUNvbnRhaW5lciBnZXRJbnB1dENvbnRhaW5lcigpIHsKKwkJaWYgKCFnZXRJbnB1dENvbnRhaW5lcnMoKS5pc0VtcHR5KCkpCisJCQlyZXR1cm4gKElDb250YWluZXIpIGdldElucHV0Q29udGFpbmVycygpLmdldCgwKTsKKwkJZWxzZQorCQkJcmV0dXJuIG51bGw7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFVSSUNvbnZlcnRlciNnZXRPdXRwdXRDb250YWluZXIoKQorCSAqLworCXB1YmxpYyBJQ29udGFpbmVyIGdldE91dHB1dENvbnRhaW5lcigpIHsKKwkJaWYgKG91dHB1dENvbnRhaW5lciA9PSBudWxsKQorCQkJb3V0cHV0Q29udGFpbmVyID0gZ2V0SW5wdXRDb250YWluZXIoKTsKKwkJcmV0dXJuIG91dHB1dENvbnRhaW5lcjsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoVVJJQ29udmVydGVyI3NldE91dHB1dENvbnRhaW5lcihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyKQorCSAqLworCXB1YmxpYyB2b2lkIHNldE91dHB1dENvbnRhaW5lcihJQ29udGFpbmVyIG5ld091dHB1dENvbnRhaW5lcikgeworCQlvdXRwdXRDb250YWluZXIgPSBuZXdPdXRwdXRDb250YWluZXI7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFVSSUNvbnZlcnRlciNnZXRPdXRwdXRGaWxlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCkKKwkgKi8KKwlwdWJsaWMgSUZpbGUgZ2V0T3V0cHV0RmlsZShJUGF0aCBhUGF0aCkgeworCQlJRmlsZSBmaWxlID0gbnVsbDsKKwkJaWYgKGdldE91dHB1dENvbnRhaW5lcigpICE9IG51bGwpIHsKKwkJCWlmIChmb3JjZVNhdmVSZWxhdGl2ZSkKKwkJCQlyZXR1cm4gcHJpbUdldE91dHB1dEZpbGUoYVBhdGgpOworCQkJZmlsZSA9IGdldE91dHB1dEZpbGVGb3JQYXRoV2l0aENvbnRhaW5lclNlZ21lbnRzKGFQYXRoKTsKKwkJCWlmIChmaWxlICE9IG51bGwpCisJCQkJcmV0dXJuIGZpbGU7CisJCQllbHNlCisJCQkJcmV0dXJuIHByaW1HZXRPdXRwdXRGaWxlKGFQYXRoKTsKKwkJfQorCQlyZXR1cm4gZmlsZTsKKwl9CisKKwlwcm90ZWN0ZWQgSUZpbGUgcHJpbUdldE91dHB1dEZpbGUoSVBhdGggYVBhdGgpIHsKKwkJcmV0dXJuIHByaW1HZXRGaWxlKGdldE91dHB1dENvbnRhaW5lcigpLCBhUGF0aCk7CisJfQorCisJcHJvdGVjdGVkIElGaWxlIGdldE91dHB1dEZpbGVGb3JQYXRoV2l0aENvbnRhaW5lclNlZ21lbnRzKElQYXRoIGFQYXRoKSB7CisJCUlDb250YWluZXIgb3V0ID0gZ2V0T3V0cHV0Q29udGFpbmVyKCk7CisJCXJldHVybiBnZXRGaWxlRm9yUGF0aFdpdGhDb250YWluZXJTZWdtZW50cyhhUGF0aCwgb3V0LCBmYWxzZSk7CisJfQorCisJcHJvdGVjdGVkIElGaWxlIGdldEZpbGVGb3JQYXRoV2l0aENvbnRhaW5lclNlZ21lbnRzKElQYXRoIGFQYXRoLCBJQ29udGFpbmVyIGNvbnRhaW5lciwgYm9vbGVhbiB0ZXN0RXhpc3RzKSB7CisJCUlQYXRoIGNvbnRhaW5lclBhdGggPSBudWxsOworCQlJRmlsZSBmaWxlID0gbnVsbDsKKwkJaWYgKHRlc3RFeGlzdHMpIHsKKwkJCWNvbnRhaW5lclBhdGggPSBjb250YWluZXIuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOworCQkJaWYgKCFjb250YWluZXJQYXRoLmlzRW1wdHkoKSkgeworCQkJCWZpbGUgPSBnZXRGaWxlRm9yTWF0Y2hpbmdQYXRoKGFQYXRoLCBjb250YWluZXJQYXRoLCBjb250YWluZXIpOworCQkJCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSkKKwkJCQkJcmV0dXJuIGZpbGU7CisJCQl9CisJCX0KKwkJY29udGFpbmVyUGF0aCA9IGNvbnRhaW5lci5nZXRGdWxsUGF0aCgpOworCQlmaWxlID0gZ2V0RmlsZUZvck1hdGNoaW5nUGF0aChhUGF0aCwgY29udGFpbmVyUGF0aCwgY29udGFpbmVyKTsKKwkJcmV0dXJuIGZpbGU7CisJfQorCisJcHJvdGVjdGVkIElGaWxlIGdldEZpbGVGb3JNYXRjaGluZ1BhdGgoSVBhdGggY29udGFpbmVyUGF0aCwgSVBhdGggc291cmNlUGF0aCwgSUNvbnRhaW5lciBjb250YWluZXIpIHsKKwkJaW50IG1hdGNoZXMgPSAwOworCQltYXRjaGVzID0gY29udGFpbmVyUGF0aC5tYXRjaGluZ0ZpcnN0U2VnbWVudHMoc291cmNlUGF0aCk7CisJCWlmIChtYXRjaGVzID4gMCAmJiBtYXRjaGVzID09IHNvdXJjZVBhdGguc2VnbWVudENvdW50KCkpIHsKKwkJCUlQYXRoIGxvYWRQYXRoID0gY29udGFpbmVyUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKG1hdGNoZXMpOworCQkJcmV0dXJuIHByaW1HZXRGaWxlKGNvbnRhaW5lciwgbG9hZFBhdGgpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hVUklDb252ZXJ0ZXIjZ2V0RmlsZShqYXZhLmxhbmcuU3RyaW5nKQorCSAqLworCXB1YmxpYyBJRmlsZSBnZXRGaWxlKFN0cmluZyB1cmkpIHsKKwkJcmV0dXJuIGdldEZpbGUobmV3IFBhdGgodXJpKSk7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBmaWxlIGZyb20gdGhlIHBhdGguCisJICogCisJICogQHBhcmFtIHBhdGgKKwkgKiBAcmV0dXJuCisJICogQHNlZSBXb3JrYmVuY2hVUklDb252ZXJ0ZXIjZ2V0RmlsZShTdHJpbmcpCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIElGaWxlIGdldEZpbGUoSVBhdGggcGF0aCkgeworCQlJRmlsZSBmaWxlID0gbnVsbDsKKwkJaWYgKGdldElucHV0Q29udGFpbmVyKCkgIT0gbnVsbCkgeworCQkJcGF0aCA9IHBhdGgubWFrZVJlbGF0aXZlKCk7CisJCQlqYXZhLnV0aWwuSXRlcmF0b3IgaXQgPSBnZXRJbnB1dENvbnRhaW5lcnMoKS5pdGVyYXRvcigpOworCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCQkJCUlDb250YWluZXIgY29uID0gKElDb250YWluZXIpIGl0Lm5leHQoKTsKKwkJCQlmaWxlID0gZ2V0SW5wdXRGaWxlKGNvbiwgcGF0aCk7CisJCQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKQorCQkJCQlyZXR1cm4gZmlsZTsKKwkJCX0KKwkJfQorCQlpZiAoZmlsZSA9PSBudWxsKQorCQkJcmV0dXJuIElOVkFMSURfRklMRTsKKwkJcmV0dXJuIGZpbGU7CisJfQorCisJLyoqCisJICogR2V0IG91dHB1dCBmaWxlIGZyb20gc3RyaW5nIHBhdGguCisJICogCisJICogQHBhcmFtIHVyaQorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiBAc2VlIFdvcmtiZW5jaFVSSUNvbnZlcnRlciNnZXRPdXRwdXRGaWxlKElQYXRoKQorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBJRmlsZSBnZXRPdXRwdXRGaWxlKFN0cmluZyB1cmkpIHsKKwkJcmV0dXJuIGdldE91dHB1dEZpbGUobmV3IFBhdGgodXJpKSk7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBpbnB1dCBmaWxlIGZyb20gdGhlIGNvbnRhaW5lciBhbmQgcGF0aC4KKwkgKiAKKwkgKiBAcGFyYW0gY29uCisJICogQHBhcmFtIHBhdGgKKwkgKiBAcmV0dXJuCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIElGaWxlIGdldElucHV0RmlsZShJQ29udGFpbmVyIGNvbiwgSVBhdGggcGF0aCkgeworCQlJRmlsZSBmaWxlID0gbnVsbDsKKwkJaWYgKFdPUktTUEFDRV9ST09ULmVxdWFscyhjb24pICYmIHBhdGguc2VnbWVudENvdW50KCkgPCAyKQorCQkJcGF0aCA9IElOVkFMSURfUEFUSC5hcHBlbmQocGF0aCk7CisJCWZpbGUgPSBwcmltR2V0RmlsZShjb24sIHBhdGgpOworCQlpZiAoZmlsZSA9PSBudWxsIHx8ICFmaWxlLmV4aXN0cygpKQorCQkJZmlsZSA9IGdldEZpbGVGb3JQYXRoV2l0aENvbnRhaW5lclNlZ21lbnRzKHBhdGgsIGNvbiwgdHJ1ZSk7CisJCXJldHVybiBmaWxlOworCX0KKworCXByb3RlY3RlZCBJRmlsZSBwcmltR2V0RmlsZShJQ29udGFpbmVyIGNvbnRhaW5lciwgSVBhdGggcGF0aCkgeworCQl0cnkgeworCQkJcmV0dXJuIGNvbnRhaW5lci5nZXRGaWxlKHBhdGgpOworCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoVVJJQ29udmVydGVyI2NhbkdldFVuZGVybHlpbmdSZXNvdXJjZShqYXZhLmxhbmcuU3RyaW5nKQorCSAqLworCXB1YmxpYyBib29sZWFuIGNhbkdldFVuZGVybHlpbmdSZXNvdXJjZShTdHJpbmcgYUZpbGVOYW1lKSB7CisJCUlGaWxlIGZpbGUgPSBnZXRGaWxlKGFGaWxlTmFtZSk7CisJCXJldHVybiBmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoVVJJQ29udmVydGVyI2lzRm9yY2VTYXZlUmVsYXRpdmUoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRm9yY2VTYXZlUmVsYXRpdmUoKSB7CisJCXJldHVybiBmb3JjZVNhdmVSZWxhdGl2ZTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoVVJJQ29udmVydGVyI3NldEZvcmNlU2F2ZVJlbGF0aXZlKGJvb2xlYW4pCisJICovCisJcHVibGljIHZvaWQgc2V0Rm9yY2VTYXZlUmVsYXRpdmUoYm9vbGVhbiBmb3JjZVNhdmVSZWxhdGl2ZSkgeworCQl0aGlzLmZvcmNlU2F2ZVJlbGF0aXZlID0gZm9yY2VTYXZlUmVsYXRpdmU7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyI25vcm1hbGl6ZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQorCSAqL3B1YmxpYyBVUkkgbm9ybWFsaXplKFVSSSB1cmkpIHsKKwkJVVJJIHJlc3VsdCA9IHVyaTsKKwkJU3RyaW5nIGZyYWdtZW50ID0gbnVsbDsKKwkJaWYgKHVyaS5oYXNGcmFnbWVudCgpKSB7CisJCQlmcmFnbWVudCA9IHVyaS5mcmFnbWVudCgpOworCQkJcmVzdWx0ID0gdXJpLnRyaW1GcmFnbWVudCgpOworCQl9CisJCXJlc3VsdCA9IGdldEludGVybmFsVVJJTWFwKCkuZ2V0VVJJKHJlc3VsdCk7CisJCWlmIChXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuaXNQbGF0Zm9ybVJlc291cmNlVVJJKHJlc3VsdCkpCisJCQlyZXR1cm4gYXBwZW5kRnJhZ21lbnQocmVzdWx0LCBmcmFnbWVudCk7CisJCWlmIChXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuaXNQbGF0Zm9ybVBsdWdpblJlc291cmNlVVJJKHJlc3VsdCkpIHsKKwkJCVVSSSBub3JtYWxpemVkID0gbm9ybWFsaXplUGx1Z2luVVJJKHJlc3VsdCwgZnJhZ21lbnQpOworCQkJcmV0dXJuIChub3JtYWxpemVkICE9IG51bGwpID8gbm9ybWFsaXplZCA6IHVyaTsKKwkJfQorCQlTdHJpbmcgcHJvdG9jb2wgPSByZXN1bHQuc2NoZW1lKCk7CisJCVVSSSBmaWxlU2VhcmNoVVJJID0gbnVsbDsKKwkJaWYgKHByb3RvY29sID09IG51bGwpIHsKKwkJCWZpbGVTZWFyY2hVUkkgPSBub3JtYWxpemVFbXB0eVByb3RvY29sKHJlc3VsdCwgZnJhZ21lbnQpOworCQkJaWYgKGZpbGVTZWFyY2hVUkkgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmlsZVNlYXJjaFVSSTsKKwkJfSBlbHNlIGlmIChGSUxFX1BST1RPQ09MLmVxdWFscyhwcm90b2NvbCkpIHsKKwkJCWZpbGVTZWFyY2hVUkkgPSBub3JtYWxpemVGaWxlUHJvdG9jb2wocmVzdWx0LCBmcmFnbWVudCk7CisJCQlpZiAoZmlsZVNlYXJjaFVSSSAhPSBudWxsKQorCQkJCXJldHVybiBmaWxlU2VhcmNoVVJJOworCQl9IGVsc2UgaWYgKEpFTVV0aWxQbHVnaW4uV09SS1NQQUNFX1BST1RPQ09MLmVxdWFscyhwcm90b2NvbCkpCisJCQlyZXR1cm4gbm9ybWFsaXplV29ya3NwYWNlUHJvdG9jb2wocmVzdWx0LCBmcmFnbWVudCk7CisJCXJldHVybiBzdXBlci5ub3JtYWxpemUodXJpKTsKKwl9CisKKwkvKgorCSAqIFJlc29sdmVzIGEgcGx1Z2luIGZvcm1hdCBpbnRvIHRoZSBhY3R1YWwuCisJICovCisJcHJvdGVjdGVkIFVSSSBub3JtYWxpemVQbHVnaW5VUkkoVVJJIHVyaSwgU3RyaW5nIGZyYWdtZW50KSB7CisJCWlmICh1cmkuc2VnbWVudENvdW50KCkgPCAyKQorCQkJcmV0dXJuIHVyaTsgLy8gSW52YWxpZCwganVzdCBsZXQgaXQgZ28gb24uCisJCS8vIFNlZSBpZiBhbHJlYWR5IG5vcm1hbGl6ZWQuCisJCWludCB1X3Njb3JlTmR4ID0gdXJpLnNlZ21lbnQoMSkubGFzdEluZGV4T2YoJ18nKTsKKwkJaWYgKHVfc2NvcmVOZHggIT0gLTEpIHsKKwkJCS8vIE5vdCBub3JtYWxpemVkLiBSZW1vdmUgdGhlIHZlcnNpb24gdG8gbWFrZSBpdCBub3JtYWxpemVkLgorCQkJU3RyaW5nW10gc2VnbWVudHMgPSB1cmkuc2VnbWVudHMoKTsKKwkJCXNlZ21lbnRzWzFdID0gc2VnbWVudHNbMV0uc3Vic3RyaW5nKDAsIHVfc2NvcmVOZHgpOworCQkJcmV0dXJuIFVSSS5jcmVhdGVIaWVyYXJjaGljYWxVUkkodXJpLnNjaGVtZSgpLCB1cmkuYXV0aG9yaXR5KCksIHVyaS5kZXZpY2UoKSwgc2VnbWVudHMsIHVyaS5xdWVyeSgpLCBmcmFnbWVudCk7CisJCX0gZWxzZQorCQkJcmV0dXJuIHVyaTsKKwl9CisKKwlwcm90ZWN0ZWQgVVJJIG5vcm1hbGl6ZVdvcmtzcGFjZVByb3RvY29sKFVSSSBhV29ya3NwYWNlVVJJLCBTdHJpbmcgZnJhZ21lbnQpIHsKKwkJVVJJIHJlc3VsdDsKKwkJU3RyaW5nIHVyaVN0cmluZyA9IGFXb3Jrc3BhY2VVUkkudG9TdHJpbmcoKTsKKwkJdXJpU3RyaW5nID0gdXJpU3RyaW5nLnN1YnN0cmluZyhKRU1VdGlsUGx1Z2luLldPUktTUEFDRV9QUk9UT0NPTC5sZW5ndGgoKSArIDEpOworCQlyZXN1bHQgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSSh1cmlTdHJpbmcpOworCQlpZiAoZnJhZ21lbnQgIT0gbnVsbCkKKwkJCXJlc3VsdCA9IGFwcGVuZEZyYWdtZW50KGFXb3Jrc3BhY2VVUkksIGZyYWdtZW50KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJCisJcHJvdGVjdGVkIFVSSSBub3JtYWxpemVFbXB0eVByb3RvY29sKFVSSSBhRmlsZVVyaSwgU3RyaW5nIGZyYWdtZW50KSB7CisJCS8vTWFrZSB0aGUgcmVsYXRpdmUgcGF0aCBhYnNvbHV0ZSBhbmQgcmV0dXJuIGEgcGxhdGZvcm0gVVJJLgorCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoYUZpbGVVcmkudG9TdHJpbmcoKSk7CisJCXJldHVybiBub3JtYWxpemVUb1dvcmtzcGFjZVVSSShwYXRoLCBmcmFnbWVudCk7CisJfQorCQorCXByaXZhdGUgVVJJIG5vcm1hbGl6ZVRvV29ya3NwYWNlVVJJKElQYXRoIHBhdGgsIFN0cmluZyBmcmFnbWVudCkgeworCQlVUkkgcmVzdWx0ID0gbnVsbDsKKwkJSUZpbGUgZmlsZSA9IGdldEZpbGUocGF0aCk7CisJCWlmIChmaWxlID09IG51bGwgfHwgIWZpbGUuZXhpc3RzKCkpCisJCQlmaWxlID0gZ2V0T3V0cHV0RmlsZShwYXRoKTsKKwkJaWYgKGZpbGUgIT0gbnVsbCkgeworCQkJcmVzdWx0ID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOworCQkJcmVzdWx0ID0gYXBwZW5kRnJhZ21lbnQocmVzdWx0LCBmcmFnbWVudCk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJCisJcHJvdGVjdGVkIFVSSSBub3JtYWxpemVGaWxlUHJvdG9jb2woVVJJIGFGaWxlVXJpLCBTdHJpbmcgZnJhZ21lbnQpIHsKKwkJVVJJIHJlc3VsdCA9IG51bGw7CisJCS8vTWFrZSB0aGUgcmVsYXRpdmUgcGF0aCBhYnNvbHV0ZSBhbmQgcmV0dXJuIGEgcGxhdGZvcm0gVVJJLgorCQlTdHJpbmcgZGV2aWNlUGF0aCA9IGFGaWxlVXJpLmRldmljZVBhdGgoKTsKKwkJLy9UZXN0IGZvciB3b3Jrc3BhY2UgbG9jYXRpb24uCisJCWlmICghZGV2aWNlUGF0aC5zdGFydHNXaXRoKE1FVEFEQVRBX0xPQ0FUSU9OKSAmJgorCQkJZGV2aWNlUGF0aC5zdGFydHNXaXRoKFdPUktTUEFDRV9ST09UX0xPQ0FUSU9OKSAmJiBkZXZpY2VQYXRoLmxlbmd0aCgpID4gV09SS1NQQUNFX1JPT1RfTE9DQVRJT04ubGVuZ3RoKCkpIHsKKwkJCS8vdGVzdCBmb3Igd29ya3NwYWNlIGxvY2F0aW9uCisJCQlyZXN1bHQgPSBub3JtYWxpemVUb1dvcmtzcGFjZVVSSShuZXcgUGF0aChkZXZpY2VQYXRoLnN1YnN0cmluZyhXT1JLU1BBQ0VfUk9PVF9MT0NBVElPTi5sZW5ndGgoKSkpLCBmcmFnbWVudCk7CisJCX0gZWxzZSBpZiAoYUZpbGVVcmkuaXNSZWxhdGl2ZSgpKSB7CisJCQlyZXN1bHQgPSBub3JtYWxpemVUb1dvcmtzcGFjZVVSSShuZXcgUGF0aChhRmlsZVVyaS50b1N0cmluZygpKSwgZnJhZ21lbnQpOworCQl9IGVsc2UgeworCQkJcmVzdWx0ID0gYUZpbGVVcmk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJCisJcHJvdGVjdGVkIFVSSSBhcHBlbmRGcmFnbWVudChVUkkgcmVzdWx0LCBTdHJpbmcgZnJhZ21lbnQpIHsKKwkJaWYgKGZyYWdtZW50ICE9IG51bGwpCisJCQlyZXR1cm4gcmVzdWx0LmFwcGVuZEZyYWdtZW50KGZyYWdtZW50KTsKKwkJZWxzZQorCQkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoVVJJQ29udmVydGVyI2dldE91dHB1dEZpbGVXaXRoTWFwcGluZ0FwcGxpZWQoamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgSUZpbGUgZ2V0T3V0cHV0RmlsZVdpdGhNYXBwaW5nQXBwbGllZChTdHJpbmcgdXJpKSB7CisJCVVSSSBjb252ZXJ0ZWQgPSBnZXRJbnRlcm5hbFVSSU1hcCgpLmdldFVSSShVUkkuY3JlYXRlVVJJKHVyaSkpOworCQlyZXR1cm4gZ2V0T3V0cHV0RmlsZShuZXcgUGF0aChjb252ZXJ0ZWQudG9TdHJpbmcoKSkpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuVVJJQ29udmVydGVySW1wbCNjcmVhdGVQbGF0Zm9ybVJlc291cmNlT3V0cHV0U3RyZWFtKGphdmEubGFuZy5TdHJpbmcpCisJICovCisJcHVibGljIE91dHB1dFN0cmVhbSBjcmVhdGVQbGF0Zm9ybVJlc291cmNlT3V0cHV0U3RyZWFtKFN0cmluZyBwbGF0Zm9ybVJlc291cmNlUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJSUZpbGUgZmlsZSA9IFdPUktTUEFDRV9ST09ULmdldEZpbGUobmV3IFBhdGgocGxhdGZvcm1SZXNvdXJjZVBhdGgpKTsKKwkJUHJvamVjdFV0aWxpdGllcy5lbnN1cmVDb250YWluZXJOb3RSZWFkT25seShmaWxlKTsKKwkJcmV0dXJuIG5ldyBXb3JrYmVuY2hCeXRlQXJyYXlPdXRwdXRTdHJlYW0oZmlsZSwgcmVzb3VyY2VTZXRTeW5jaHJvbml6ZXIpOworCX0KKworCXByb3RlY3RlZCBVUkkgZ2V0Q29udGFpbmVyUmVsYXRpdmVVUkkoSUZpbGUgYUZpbGUpIHsKKwkJSVBhdGggcGF0aCA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRQYXRoRnJvbUNvbnRhaW5lcnMoaW5wdXRDb250YWluZXJzLCBhRmlsZS5nZXRGdWxsUGF0aCgpKTsKKwkJaWYgKHBhdGggIT0gbnVsbCkKKwkJCXJldHVybiBVUkkuY3JlYXRlVVJJKHBhdGgudG9TdHJpbmcoKSk7CisJCXJldHVybiBudWxsOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuVVJJQ29udmVydGVySW1wbCNjcmVhdGVQbGF0Zm9ybVJlc291cmNlSW5wdXRTdHJlYW0oamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgSW5wdXRTdHJlYW0gY3JlYXRlUGxhdGZvcm1SZXNvdXJjZUlucHV0U3RyZWFtKFN0cmluZyBwbGF0Zm9ybVJlc291cmNlUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJSUZpbGUgZmlsZSA9IFdPUktTUEFDRV9ST09ULmdldEZpbGUobmV3IFBhdGgocGxhdGZvcm1SZXNvdXJjZVBhdGgpKTsKKwkJdHJ5IHsKKwkJCWlmICghZmlsZS5pc1N5bmNocm9uaXplZChJUmVzb3VyY2UuREVQVEhfT05FKSkgeworCQkJCXRyeSB7CisJCQkJCUZpbGUgaW9maWxlID0gZmlsZS5nZXRGdWxsUGF0aCgpLnRvRmlsZSgpOworCQkJCQlpZiAoaW9maWxlLmV4aXN0cygpIHx8IGZpbGUuZXhpc3RzKCkpCisJCQkJCQlmaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBudWxsKTsKKwkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQkJCWlmIChjZS5nZXRTdGF0dXMoKS5nZXRDb2RlKCkgIT0gSVJlc291cmNlU3RhdHVzLldPUktTUEFDRV9MT0NLRUQpCisJCQkJCQl0aHJvdyBjZTsKKwkJCQl9CisJCQl9CisJCQkvLyBDSEFOR0VEIGZyb20gPG5vLWFyZ3M+IHRvIDx0cnVlPiBbOTQwMTVdCisJCQlyZXR1cm4gZmlsZS5nZXRDb250ZW50cyh0cnVlKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCXRocm93IG5ldyBSZXNvdXJjZS5JT1dyYXBwZWRFeGNlcHRpb24oZXhjZXB0aW9uKTsKKwkJfQkJCisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9uYXR1cmUvRU1GTmF0dXJlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvZW1mL3dvcmtiZW5jaC9uYXR1cmUvRU1GTmF0dXJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdmMjg4YQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9lbWYvd29ya2JlbmNoL25hdHVyZS9FTUZOYXR1cmUuamF2YQpAQCAtMCwwICsxLDU1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiAgJCRSQ1NmaWxlOiBFTUZOYXR1cmUuamF2YSx2ICQkCisgKiAgJCRSZXZpc2lvbjogMS40ICQkICAkJERhdGU6IDIwMDUvMDIvMTUgMjM6MDQ6MTQgJCQgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5uYXR1cmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFBhcnNlclBvb2w7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFBhcnNlclBvb2xJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5uYXR1cmUuRU1GTmF0dXJlUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7CisKKworLyoqCisgKiBUaGUgYmFzZSBFTUZOYXR1cmUuCisgKiA8cD4KKyAqIFRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzLCBidXQgdGhlcmUgYXJlIGRlZmF1bHQgc3ViY2xhc3NlcyBhdmFpbGFibGUuCisgKiA8L3A+CisgKiAKKyAqIEBzaW5jZSAxLjAuMAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRU1GTmF0dXJlIGltcGxlbWVudHMgSVByb2plY3ROYXR1cmUsIElFTUZDb250ZXh0Q29udHJpYnV0b3IgeworCisJcHJvdGVjdGVkIElQcm9qZWN0IHByb2plY3Q7CisKKwlwcm90ZWN0ZWQgRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgZW1mQ29udGV4dDsKKworCXByb3RlY3RlZCBib29sZWFuIGhhc0NvbmZpZ3VyZWQgPSBmYWxzZTsKKwkKKwlwdWJsaWMgc3RhdGljIFhNTFBhcnNlclBvb2wgU0hBUkVEX1BBUlNFUl9QT09MID0gbmV3IFhNTFBhcnNlclBvb2xJbXBsKCk7CQorCisJcHVibGljIEVNRk5hdHVyZSgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBBZGQgdGhlIG5hdHVyZSBpZCB0byB0aGUgcHJvamVjdC4KKwkgKiAKKwkgKiBAcGFyYW0gcHJvagorCSAqIEBwYXJhbSBuYXR1cmVJZAorCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBhZGROYXR1cmVUb1Byb2plY3QoSVByb2plY3QgcHJvaiwgU3RyaW5nIG5hdHVyZUlkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCVByb2plY3RVdGlsaXRpZXMuYWRkTmF0dXJlVG9Qcm9qZWN0KHByb2osIG5hdHVyZUlkKTsKKwl9CisKKwkvKioKKwkgKiBDb25maWd1cmVzIHRoZSBwcm9qZWN0IHdpdGggdGhpcyBuYXR1cmUuIFRoaXMgaXMgY2FsbGVkIGJ5IDxjb2RlPklQcm9qZWN0LmFkZE5hdHVyZTwvY29kZT4gYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuIFRoZQorCSAqIG5hdHVyZSBleHRlbnNpb24gaWQgaXMgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgbmF0dXJlcyBvbiB0aGUgcHJvamVjdCBieSA8Y29kZT5JUHJvamVjdC5hZGROYXR1cmU8L2NvZGU+LCBhbmQgbmVlZCBub3QgYmUgYWRkZWQgaGVyZS4KKwkgKiAKKwkgKiA8cD4KKwkgKiBBbGwgc3VidHlwZXMgbXVzdCBjYWxsIHN1cGVyLiBUaGUgYmV0dGVyIHdheSBmb3Igc3VidHlwZXMgaXMgdG8gb3ZlcnJpZGUgcHJpbUNvbmZpZ3VyZSBpbnN0ZWFkLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgdm9pZCBjb25maWd1cmUoKSB0aHJvd3Mgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb24geworCQlpZiAoIWhhc0NvbmZpZ3VyZWQpIHsKKwkJCWhhc0NvbmZpZ3VyZWQgPSB0cnVlOworCQkJcHJpbUNvbmZpZ3VyZSgpOworCQl9CisJfQorCisJLyoqCisJICogQ2FsbGVkIGZyb20gY29uZmlndXJlIHRoZSBmaXJzdCB0aW1lIGNvbmZpZ3VyZSBpcyBjYWxsZWQgb24gdGhlIG5hdHVyZS4gRGVmYXVsdCBpcyBkbyBub3RoaW5nLiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBhbmQgYWRkIGluIHRoZWlyIG93bgorCSAqIGNvbmZpZ3VyYXRpb24uCisJICogCisJICogQHRocm93cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXByb3RlY3RlZCB2b2lkIHByaW1Db25maWd1cmUoKSB0aHJvd3Mgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb24geworCisJfQorCisJLyoqCisJICogQ3JlYXRlIGFuIEVNRiBjb250ZXh0IGZvciB0aGUgcHJvamVjdC4KKwkgKiAKKwkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFbWZDb250ZXh0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuY3JlYXRlRU1GQ29udGV4dChnZXRQcm9qZWN0KCksIHRoaXMpOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhIGZvbGRlciByZWxhdGl2ZSB0byB0aGUgcHJvamVjdCBiYXNlZCBvbiBhUHJvamVjdFJlbGF0aXZlUGF0aFN0cmluZy4KKwkgKiAKKwkgKiBAcGFyYW0gYVByb2plY3RSZWxhdGl2ZVBhdGhTdHJpbmcKKwkgKiBAcmV0dXJuCisJICogQHRocm93cyBDb3JlRXhjZXB0aW9uCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIElGb2xkZXIgY3JlYXRlRm9sZGVyKFN0cmluZyBhUHJvamVjdFJlbGF0aXZlUGF0aFN0cmluZykgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlpZiAoYVByb2plY3RSZWxhdGl2ZVBhdGhTdHJpbmcgIT0gbnVsbCAmJiBhUHJvamVjdFJlbGF0aXZlUGF0aFN0cmluZy5sZW5ndGgoKSA+IDApCisJCQlyZXR1cm4gY3JlYXRlRm9sZGVyKG5ldyBQYXRoKGFQcm9qZWN0UmVsYXRpdmVQYXRoU3RyaW5nKSk7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhIGZvbGRlciByZWxhdGl2ZSB0byB0aGUgcHJvamVjdCBiYXNlZCBvbiBhUHJvamVjdFJlbGF0aXZlUGF0aFN0cmluZy4KKwkgKiAKKwkgKiBAcGFyYW0gYVByb2plY3RSZWxhdGl2ZVBhdGgKKwkgKiBAcmV0dXJuCisJICogQHRocm93cyBDb3JlRXhjZXB0aW9uCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIElGb2xkZXIgY3JlYXRlRm9sZGVyKElQYXRoIGFQcm9qZWN0UmVsYXRpdmVQYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCWlmIChhUHJvamVjdFJlbGF0aXZlUGF0aCAhPSBudWxsICYmICFhUHJvamVjdFJlbGF0aXZlUGF0aC5pc0VtcHR5KCkpIHsKKwkJCUlGb2xkZXIgZm9sZGVyID0gZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcihnZXRQcm9qZWN0UGF0aCgpLmFwcGVuZChhUHJvamVjdFJlbGF0aXZlUGF0aCkpOworCQkJaWYgKCFmb2xkZXIuZXhpc3RzKCkpIHsKKwkJCQlQcm9qZWN0VXRpbGl0aWVzLmVuc3VyZUNvbnRhaW5lck5vdFJlYWRPbmx5KGZvbGRlcik7CisJCQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKKwkJCX0KKwkJCXJldHVybiBmb2xkZXI7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmVtb3ZlcyB0aGlzIG5hdHVyZSBmcm9tIHRoZSBwcm9qZWN0LCBwZXJmb3JtaW5nIGFueSByZXF1aXJlZCBkZWNvbmZpZ3VyYXRpb24uIFRoaXMgaXMgY2FsbGVkIGJ5IDxjb2RlPklQcm9qZWN0LnJlbW92ZU5hdHVyZTwvY29kZT4gYW5kCisJICogc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4gVGhlIG5hdHVyZSBpZCBpcyByZW1vdmVkIGZyb20gdGhlIGxpc3Qgb2YgbmF0dXJlcyBvbiB0aGUgcHJvamVjdCBieQorCSAqIDxjb2RlPklQcm9qZWN0LnJlbW92ZU5hdHVyZTwvY29kZT4sIGFuZCBuZWVkIG5vdCBiZSByZW1vdmVkIGhlcmUuCisJICogCisJICogQHRocm93cyBDb3JlRXhjZXB0aW9uCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIHZvaWQgZGVjb25maWd1cmUoKSB0aHJvd3Mgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb24geworCQllbWZDb250ZXh0ID0gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgSUZpbGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBleGlzdHMgaW4gdGhpcyBwcm9qZWN0LgorCSAqIAorCSAqIEBwYXJhbSBhRmlsZU5hbWUKKwkgKiAgICAgICAgICAgIGZpbGVuYW1lIGNhbiBiZSByZWxhdGl2ZSB0byBvbmUgb2YgdGhlIGlucHV0IGZpbGUgcGF0aHMgZm9yIHRoZSBXb3JrYmVuY2hVUklDb252ZXJ0ZXIuCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBmaWxlbmFtZSBleGlzdHMgaW4gdGhpcyBwcm9qZWN0CisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIGJvb2xlYW4gZmlsZUV4aXN0cyhTdHJpbmcgYUZpbGVOYW1lKSB7CisJCWlmIChhRmlsZU5hbWUgPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKworCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoYUZpbGVOYW1lKTsKKwkJaWYgKHBhdGguaXNBYnNvbHV0ZSgpKQorCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKS5leGlzdHMoKTsKKwkJZWxzZQorCQkJcmV0dXJuIGdldFdvcmtiZW5jaFVSSUNvbnZlcnRlcigpLmNhbkdldFVuZGVybHlpbmdSZXNvdXJjZShhRmlsZU5hbWUpOworCX0KKworCS8qKgorCSAqIEdldCB0aGUgcmVzb3VyY2Ugc2V0IGZvciB0aGUgcHJvamVjdAorCSAqIAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgUmVzb3VyY2VTZXQgZ2V0UmVzb3VyY2VTZXQoKSB7CisJCXJldHVybiBnZXRFbWZDb250ZXh0QmFzZSgpLmdldFJlc291cmNlU2V0KCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgRU1GIHJvb3QgZm9sZGVyIGZvciB0aGUgcHJvamVjdC4gRGVmYXVsdHMgdG8gdGhlIHByb2plY3QuIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlLgorCSAqIAorCSAqIEByZXR1cm4gRU1GIHJvb3QgZm9sZGVyIGZvciB0aGUgcHJvamVjdC4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgSUNvbnRhaW5lciBnZXRFTUZSb290KCkgeworCQlyZXR1cm4gZ2V0UHJvamVjdCgpOworCX0KKworCS8qKgorCSAqIFVzZWQgZm9yIG9wdGltaXphdGlvbnM7IGFuc3dlcnMgd2hldGhlciBhIG1vZiBjb250ZXh0IGZvciB0aGlzIG5hdHVyZSBoYXMgZXhpc3RzIHlldAorCSAqIAorCSAqIEBkZXByZWNhdGVkIHVzZSBoYXNSZXNvdXJjZVNldCgpOworCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBib29sZWFuIGhhc0NvbnRleHQoKSB7CisJCXJldHVybiBoYXNSZXNvdXJjZVNldCgpOworCX0KKworCS8qKgorCSAqIElzIHRoZXJlIGEgcmVzb3VyY2Ugc2V0IHlldCBmb3IgdGhlIHByb2plY3QuCisJICogCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBpcyBhIHJlc291cmNlIHNldCBmb3IgdGhlIHByb2plY3QuCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIGJvb2xlYW4gaGFzUmVzb3VyY2VTZXQoKSB7CisJCXJldHVybiBlbWZDb250ZXh0ICE9IG51bGwgJiYgZW1mQ29udGV4dC5oYXNSZXNvdXJjZVNldCgpOworCX0KKworCS8qKgorCSAqIExhenkgaW5pdGlhbGl6ZXI7IGZvciBtaWdyYXRpb24gb2YgZXhpc3Rpbmcgd29ya3NwYWNlcyB3aGVyZSBjb25maWd1cmUgd2lsbCBuZXZlciBnZXQgY2FsbGVkLgorCSAqIAorCSAqIEByZXR1cm4gY29udGV4dCBiYXNlIGZvciB0aGUgcHJvamVjdC4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwcm90ZWN0ZWQgRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgZ2V0RW1mQ29udGV4dEJhc2UoKSB7CisJCWlmIChlbWZDb250ZXh0ID09IG51bGwpIHsKKwkJCXRyeSB7CisJCQkJY3JlYXRlRW1mQ29udGV4dCgpOworCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgeworCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGVtZkNvbnRleHQ7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBJRmlsZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGlmIGl0IGlzIGluIHRoaXMgcHJvamVjdC4KKwkgKiAKKwkgKiBAcGFyYW0gYUZpbGVOYW1lCisJICogICAgICAgICAgICBmaWxlbmFtZSBjYW4gYmUgcmVsYXRpdmUgdG8gb25lIG9mIHRoZSBpbnB1dCBmaWxlIHBhdGhzIGZvciB0aGUgV29ya2JlbmNoVVJJQ29udmVydGVyLgorCSAqIEByZXR1cm4gZmlsZSBpdCBpdCBpcyBpbiB0aGlzIHByb2plY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGRvZXNuJ3QuCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIElGaWxlIGdldEZpbGUoU3RyaW5nIGFGaWxlTmFtZSkgeworCQlyZXR1cm4gZ2V0V29ya2JlbmNoVVJJQ29udmVydGVyKCkuZ2V0RmlsZShhRmlsZU5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgbmF0dXJlJ3MgSUQuCisJICogCisJICogQHJldHVybiBuYXR1cmUgaWQKKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldE5hdHVyZUlEKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIElEIG9mIHRoZSBwbHVnaW4gdGhhdCB0aGlzIG5hdHVyZSBpcyBjb250YWluZWQgd2l0aGluLgorCSAqIAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFBsdWdpbklEKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwcm9qZWN0IHRvIHdoaWNoIHRoaXMgcHJvamVjdCBuYXR1cmUgYXBwbGllcy4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBwcm9qZWN0IGhhbmRsZQorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCBnZXRQcm9qZWN0KCkgeworCQlyZXR1cm4gcHJvamVjdDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGZ1bGwgcGF0aCBvZiB0aGUgcHJvamVjdC4KKwkgKiAKKwkgKiBAcmV0dXJuIGZ1bGwgcHJvamVjdCBwYXRoIChyZWxhdGl2ZSB0byB3b3Jrc3BhY2UpCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIElQYXRoIGdldFByb2plY3RQYXRoKCkgeworCQlyZXR1cm4gZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCk7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBzZXJ2ZXIgcHJvcGVydHkgb2YgdGhlIHByb2plY3QgZnJvbSB0aGUgc3VwcGxpZWQga2V5CisJICogCisJICogQHBhcmFtIGtleQorCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZworCSAqIEBkZXByZWNhdGVkIHdlIGNhbm5vbnQgdXNlIHBlcnNpc3RlbnQgcHJvcGVydGllcyBiZWNhdXNlIHRoZXkgYXJlIG5vdCBzdG9yZWQgaW4gdGhlIHJlcG9zaXRvcnkKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2plY3RTZXJ2ZXJWYWx1ZShTdHJpbmcga2V5KSB7CisJCWlmIChrZXkgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQl0cnkgeworCQkJUXVhbGlmaWVkTmFtZSB3aG9sZU5hbWUgPSBxdWFsaWZpZWRLZXkoa2V5KTsKKwkJCXJldHVybiBnZXRQcm9qZWN0KCkuZ2V0UGVyc2lzdGVudFByb3BlcnR5KHdob2xlTmFtZSk7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkvL0lmIHdlIGNhbid0IGZpbmQgaXQgYXNzdW1lIGl0IGlzIG51bGwKKwkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJLyoqCisJICogR2V0IFdvcmtiZW5jaFVSSUNvbnZlcnRlciBmb3IgdGhpcyBwcm9qZWN0LgorCSAqIDxwPgorCSAqIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhlIFVSSUNvbnZlcnRlciBvbiB0aGUgUmVzb3VyY2VTZXQgaXMgdGhlIG9uZSB0aGF0IHdhcyBjcmVhdGVkIGZvciB0aGUgUmVzb3VyY2VTZXQgb24gYmVoYWxmIG9mIHRoaXMgbmF0dXJlIHJ1bnRpbWUuCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwcm90ZWN0ZWQgV29ya2JlbmNoVVJJQ29udmVydGVyIGdldFdvcmtiZW5jaFVSSUNvbnZlcnRlcigpIHsKKwkJcmV0dXJuIChXb3JrYmVuY2hVUklDb252ZXJ0ZXIpIGdldFJlc291cmNlU2V0KCkuZ2V0VVJJQ29udmVydGVyKCk7CisJfQorCisJcHVibGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgeworCQlyZXR1cm4gZ2V0UHJvamVjdCgpLmdldFdvcmtzcGFjZSgpOworCX0KKworCS8qKgorCSAqIEBkZXByZWNhdGVkIHVzZSBnZXRSZXNvdXJjZShVUkkpCisJICovCisJcHVibGljIFJlc291cmNlIGdldFhtaVJlc291cmNlKFN0cmluZyB1cmkpIHsKKwkJcmV0dXJuIGdldFJlc291cmNlKFVSSS5jcmVhdGVVUkkodXJpKSk7CisJfQorCisJLyoqCisJICogR2V0IHRoZSByZXNvdXJjZSBmb3IgdGhpcyB1cmkuIEl0IHdpbGwgdXNlIHRoZSByZXNvdXJjZSBzZXQgb2YgdGhlIHByb2plY3QgdG8gZmluZCBpdC4gSXQgd2lsbCBsb2FkIGlmIG5vdCBhbHJlYWR5IGxvYWRlZC4KKwkgKiAKKwkgKiBAcGFyYW0gdXJpCisJICogQHJldHVybiByZXNvdXJjZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiByZXNvdXJjZSBpcyBub3QgZm91bmQuCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKFVSSSB1cmkpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBnZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKHVyaSwgdHJ1ZSk7CisJCX0gY2F0Y2ggKFdyYXBwZWRFeGNlcHRpb24gZXgpIHsKKwkJCWlmICghV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmlzUmVzb3VyY2VOb3RGb3VuZChleCkpCisJCQkJdGhyb3cgZXg7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQGRlcHJlY2F0ZWQgdXNlIGdldFJlc291cmNlU2V0KCkKKwkgKi8KKwlwdWJsaWMgUmVzb3VyY2VTZXQgZ2V0WG1pUmVzb3VyY2VTZXQoKSB7CisJCXJldHVybiBnZXRSZXNvdXJjZVNldCgpOworCX0KKworCS8qKgorCSAqIE1ha2Ugc3VyZSB0aGF0IGFsbCBkZXBlbmRlbnQgY29tcG9uZW50cyBhcmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGNyZWF0aW5nIHRoZSBSZXNvdXJjZVNldC4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVwZW5kZW50Q29tcG9uZW50cygpIHsKKwkJLy9jb20uaWJtLmV0b29scy5qYXZhLmluaXQuSmF2YUluaXQuaW5pdCgpOworCX0KKworCS8qKgorCSAqIEBkZXByZWNhdGVkIHVzZSBjcmVhdGVSZXNvdXJjZShVUkkpCisJICovCisJcHVibGljIFJlc291cmNlIG1ha2VYbWlSZXNvdXJjZShTdHJpbmcgdXJpKSB7CisJCXJldHVybiBjcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKHVyaSkpOworCX0KKworCS8qKgorCSAqIEBkZXByZWNhdGVkIHVzZSBjcmVhdGVSZXNvdXJjZShVUkkpCisJICovCisJcHVibGljIFJlc291cmNlIG1ha2VYbWlSZXNvdXJjZShTdHJpbmcgdXJpLCBFTGlzdCBhbkV4dGVudCkgeworCQlSZXNvdXJjZSByZXMgPSBtYWtlWG1pUmVzb3VyY2UodXJpKTsKKwkJaWYgKHJlcyAhPSBudWxsKQorCQkJcmVzLmdldENvbnRlbnRzKCkuYWRkQWxsKGFuRXh0ZW50KTsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgdGhlIHJlc291cmNlIGZvciB0aGlzIHVyaS4gSXQgd2lsbCB1c2UgdGhlIHJlc291cmNlIHNldCBvZiB0aGUgcHJvamVjdCB0byBjcmVhdGUgaXQuCisJICogCisJICogQHBhcmFtIHVyaQorCSAqIEByZXR1cm4gcmVzb3VyY2UKKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgeworCQlyZXR1cm4gZ2V0UmVzb3VyY2VTZXQoKS5jcmVhdGVSZXNvdXJjZSh1cmkpOworCX0KKworCS8qCisJICogUmV0dXJuIHRoZSBRdWFsaWZlZFZhbHVlIGZvciBrZXkgZm9yIHN0b3JhZ2UgaW4gdGhlIHJlcG9zaXRvcnkuIFRoZSBrZXkgaXMgcXVhbGlmZWQgd2l0aCB0aGUgcGFja2FnZSBuYW1lIHRvIGF2b2lkIGNvbGxpc2lvbi4gQHJldHVybgorCSAqIFF1YWxpZmVkTmFtZSBAcGFyYW0ga2V5IGphdmEubGFuZy5TdHJpbmcKKwkgKi8KKwlwcml2YXRlIFF1YWxpZmllZE5hbWUgcXVhbGlmaWVkS2V5KFN0cmluZyBrZXkpIHsKKwkJcmV0dXJuIG5ldyBRdWFsaWZpZWROYW1lKGdldFBsdWdpbklEKCksIGtleSk7CisJfQorCisJLyoqCisJICogUmVnaXN0ZXIgdGhlIGdpdmVuIG5hdHVyZSBpZCBhcyBhbiBFTUZOYXR1cmUuCisJICogCisJICogQHBhcmFtIG5hdHVyZUlECisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyTmF0dXJlSUQoU3RyaW5nIG5hdHVyZUlEKSB7CisJCUVNRk5hdHVyZVJlZ2lzdHJ5LnNpbmdsZXRvbigpLlJFR0lTVEVSRURfTkFUVVJFX0lEUy5hZGQobmF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHByb2plY3QgdG8gd2hpY2ggdGhpcyBuYXR1cmUgYXBwbGllcy4gVXNlZCB3aGVuIGluc3RhbnRpYXRpbmcgdGhpcyBwcm9qZWN0IG5hdHVyZSBydW50aW1lLiBUaGlzIGlzIGNhbGxlZCBieQorCSAqIDxjb2RlPklQcm9qZWN0LmFkZE5hdHVyZTwvY29kZT4gYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisJICogCisJICogQHBhcmFtIHByb2plY3QKKwkgKiAgICAgICAgICAgIHRoZSBwcm9qZWN0IHRvIHdoaWNoIHRoaXMgbmF0dXJlIGFwcGxpZXMKKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0IG5ld1Byb2plY3QpIHsKKwkJcHJvamVjdCA9IG5ld1Byb2plY3Q7CisJfQorCisJLyoqCisJICogU2V0IHRoZSBzZXJ2ZXIgcHJvcGVydHkgb2YgdGhlIHByb2plY3QgZnJvbSB0aGUgc3VwcGxpZWQgdmFsdWUKKwkgKiAKKwkgKiBAcGFyYW0ga2V5CisJICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCisJICogQHBhcmFtIHZhbHVlCisJICogICAgICAgICAgICBTdHJpbmcKKwkgKiBAZGVwcmVjYXRlZCB3ZSBjYW5ub250IHVzZSBwZXJzaXN0ZW50IHByb3BlcnRpZXMgYmVjYXVzZSB0aGV5IGFyZSBub3Qgc3RvcmVkIGluIHRoZSByZXBvc2l0b3J5CisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0UHJvamVjdFNlcnZlclZhbHVlKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgeworCQlpZiAoa2V5ICE9IG51bGwpIHsKKwkJCXRyeSB7CisJCQkJUXVhbGlmaWVkTmFtZSB3aG9sZU5hbWUgPSBxdWFsaWZpZWRLZXkoa2V5KTsKKwkJCQlnZXRQcm9qZWN0KCkuc2V0UGVyc2lzdGVudFByb3BlcnR5KHdob2xlTmFtZSwgdmFsdWUpOworCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkvL0lmIHdlIGNhbid0IGZpbmQgaXQgYXNzdW1lIGl0IGlzIG51bGwKKwkJCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogU2h1dGRvd24gdGhlIEVNRiBuYXR1cmUKKwkgKiAKKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsKKwkJaWYgKGdldFJlc291cmNlU2V0KCkgIT0gbnVsbCkKKwkJCSgoUHJvamVjdFJlc291cmNlU2V0KSBnZXRSZXNvdXJjZVNldCgpKS5yZWxlYXNlKCk7CisJfQorCisJLyoqCisJICogUmV0dXJuIGEgbGlzdCBvZiBFTUZOYXR1cmVzIGJhc2VkIG9uIHRoZSBuYXR1cmVzIHRoYXQgaGF2ZSBiZWVuIGNvbmZpZ3VyZWQgZm9yIHRoaXMgcHJvamVjdC4KKwkgKiAKKwkgKiBAcmV0dXJuIExpc3Qgb2YgRU1GTmF0dXJlcworCSAqIEBwYXJhbSBwcm9qZWN0CisJICogQHJldHVybiBsaXN0IG9mIG5hdHVyZXMgY29uZmlndXJlZCBmb3IgdGhlIHByb2plY3QuCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIHN0YXRpYyBMaXN0IGdldFJlZ2lzdGVyZWRSdW50aW1lcyhJUHJvamVjdCBwcm9qZWN0KSB7CisJCUxpc3QgcmVzdWx0ID0gbnVsbDsKKwkJRU1GTmF0dXJlIG5hdHVyZSA9IG51bGw7CisJCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5pc0FjY2Vzc2libGUoKSkgeworCQkJU3RyaW5nIG5hdHVyZUlEOworCQkJSXRlcmF0b3IgaXQgPSBFTUZOYXR1cmVSZWdpc3RyeS5zaW5nbGV0b24oKS5SRUdJU1RFUkVEX05BVFVSRV9JRFMuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKwkJCQluYXR1cmVJRCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKKwkJCQl0cnkgeworCQkJCQluYXR1cmUgPSAoRU1GTmF0dXJlKSBwcm9qZWN0LmdldE5hdHVyZShuYXR1cmVJRCk7CisJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJfQorCQkJCWlmIChuYXR1cmUgIT0gbnVsbCkgeworCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCQlyZXN1bHQgPSBuZXcgQXJyYXlMaXN0KDIpOworCQkJCQlyZXN1bHQuYWRkKG5hdHVyZSk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiByZXN1bHQgPT0gbnVsbCA/IENvbGxlY3Rpb25zLkVNUFRZX0xJU1QgOiByZXN1bHQ7CisJfQorCisJLyoqCisJICogUmV0dXJuIGEgbGlzdCBvZiBuYXR1cmUgaWRzIGJhc2VkIG9uIHRoZSBuYXR1cmVzIHRoYXQgaGF2ZSBiZWVuIGNvbmZpZ3VyZWQgZm9yIHRoaXMgcHJvamVjdC4KKwkgKiAKKwkgKiBAcmV0dXJuIGxpc3Qgb2YgY29uZmlndXJlZCBuYXR1cmUgaWRzLgorCSAqIEBwYXJhbSBwcm9qZWN0CisJICovCisJcHVibGljIHN0YXRpYyBMaXN0IGdldFJlZ2lzdGVyZWRSdW50aW1lSURzKElQcm9qZWN0IHByb2plY3QpIHsKKwkJTGlzdCByZXN1bHQgPSBudWxsOworCQlTdHJpbmcgbmF0dXJlSUQgPSBudWxsOworCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKKwkJCUl0ZXJhdG9yIGl0ID0gRU1GTmF0dXJlUmVnaXN0cnkuc2luZ2xldG9uKCkuUkVHSVNURVJFRF9OQVRVUkVfSURTLml0ZXJhdG9yKCk7CisJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisJCQkJbmF0dXJlSUQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7CisJCQkJdHJ5IHsKKwkJCQkJaWYgKHByb2plY3QuaGFzTmF0dXJlKG5hdHVyZUlEKSkgeworCQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQkJCXJlc3VsdCA9IG5ldyBBcnJheUxpc3QoMik7CisJCQkJCQlyZXN1bHQuYWRkKG5hdHVyZUlEKTsKKwkJCQkJfQorCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzdWx0ID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUIDogcmVzdWx0OworCX0KKworCS8qKgorCSAqIFJldHVybiBpZiB0aGUgcHJvamVjdCBoYXMgdGhlIGdpdmVuIG5hdHVyZS4KKwkgKiAKKwkgKiBAcGFyYW0gcHJvamVjdAorCSAqIEBwYXJhbSBuYXR1cmVJZAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcHJvamVjdCBoYXMgZ2l2ZW4gbmF0dXJlCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1J1bnRpbWUoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIG5hdHVyZUlkKSB7CisJCWlmIChwcm9qZWN0ID09IG51bGwgfHwgIXByb2plY3QuaXNBY2Nlc3NpYmxlKCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCXRyeSB7CisJCQlyZXR1cm4gcHJvamVjdC5oYXNOYXR1cmUobmF0dXJlSWQpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybiBpZiB0aGUgcHJvamVjdCBoYXMgYW55IG9uZSBvZiB0aGUgcG9zc2libGUgZ2l2ZW4gbmF0dXJlIGlkcy4KKwkgKiAKKwkgKiBAcGFyYW0gcHJvamVjdAorCSAqIEBwYXJhbSBwb3NzaWJsZU5hdHVyZUlkcworCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYXQgbGVhc3Qgb25lIG9mIHRoZSBwb3NzaWJsZSBuYXR1cmVzIGlkIGlzIGNvbmZpZ3VyZWQgZm9yIHRoZSBwcm9qZWN0LgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNSdW50aW1lKElQcm9qZWN0IHByb2plY3QsIFN0cmluZ1tdIHBvc3NpYmxlTmF0dXJlSWRzKSB7CisJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcG9zc2libGVOYXR1cmVJZHMubGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAoaGFzUnVudGltZShwcm9qZWN0LCBwb3NzaWJsZU5hdHVyZUlkc1tpXSkpCisJCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5cmVuZGVyL0Fic3RyYWN0V29ya0JlbmNoUmVuZGVyZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHlyZW5kZXIvQWJzdHJhY3RXb3JrQmVuY2hSZW5kZXJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYzE0NzMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5cmVuZGVyL0Fic3RyYWN0V29ya0JlbmNoUmVuZGVyZXIuamF2YQpAQCAtMCwwICsxLDQ3MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisKKworICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eXJlbmRlcjsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS4qOworCisKKy8qKgorICogQmFzZSBsb2cgcmVuZGVyZXIgdGhhdCBsb2dzIHRvIHRoZSB3b3JrYmVuY2guCisgKiAKKyAqIEBzaW5jZSAxLjEuMAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RXb3JrQmVuY2hSZW5kZXJlciBpbXBsZW1lbnRzIElMb2dSZW5kZXJlcjIgeworCisJcHJpdmF0ZSBib29sZWFuIGZUcmFjZU1vZGUgPSBmYWxzZTsgLy8gd2lsbCB3ZSBhY3R1YWxseSBwdW5jaCB0cmFjZSBtZXNzYWdlZCBvciBub3QKKworCXByaXZhdGUgYm9vbGVhbiBmU2V0dGluZ1RyYWNlID0gZmFsc2U7CisKKwlwcm90ZWN0ZWQgQnVuZGxlIGZNeUJ1bmRsZSA9IG51bGw7CisKKwlwcm90ZWN0ZWQgTG9nZ2VyIGZNeUxvZ2dlciA9IG51bGw7CisKKwlwcm90ZWN0ZWQgSUxvZyBmV29ya0JlbmNoTG9nZ2VyID0gbnVsbDsKKworCS8qKgorCSAqIENvbnN0cnVjdGVyIHRha2luZyBhIGxvZ2dlci4KKwkgKiAKKwkgKiBAcGFyYW0gbG9nZ2VyCisJICogCisJICogQHNpbmNlIDEuMS4wCisJICovCisJcHVibGljIEFic3RyYWN0V29ya0JlbmNoUmVuZGVyZXIoTG9nZ2VyIGxvZ2dlcikgeworCQlzdXBlcigpOworCQlmTXlMb2dnZXIgPSBsb2dnZXI7CisJCWZUcmFjZU1vZGUgPSBmTXlMb2dnZXIuZ2V0VHJhY2VNb2RlKCk7CisKKwkJU3RyaW5nIHBsdWdpbklEID0gZk15TG9nZ2VyLmdldFBsdWdpbklEKCk7CisJCWZNeUJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JRCk7CisJCWlmIChmTXlCdW5kbGUgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnZhbGlkIFBsdWdpbiBJRCIpOyAvLyROT04tTkxTLTEkCisKKwkJZldvcmtCZW5jaExvZ2dlciA9IFBsYXRmb3JtLmdldExvZyhmTXlCdW5kbGUpOworCQlzZXRUcmFjZU1vZGUoZk15TG9nZ2VyLmdldFRyYWNlTW9kZSgpIHx8IGlzRGVidWdnaW5nKGZNeUJ1bmRsZSkpOworCQlmTXlMb2dnZXIuc2V0UmVuZGVyZXIodGhpcyk7CisJfQorCisJLyoKKwkgKiBUaGlzIHVzZWQgdG8gY29tZSBmcm9tIHRoZSBQbHVnaW4gaW5zdGFuY2UuIEJ1dCBpbiBuZXcgT1NHaSwgdGhlcmUgaXMgbm90IG5lY2Vzc2FyaWx5IGEgUGx1Z2luIGluc3RhbmNlLiBTbyB1c2UgdGhlIHNhbWUgbG9naWMgdGhleSB1c2UuCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzRGVidWdnaW5nKEJ1bmRsZSBidW5kbGUpIHsKKwkJU3RyaW5nIHN5bWJvbGljTmFtZSA9IGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKTsKKwkJaWYgKHN5bWJvbGljTmFtZSAhPSBudWxsKSB7CisJCQlTdHJpbmcga2V5ID0gc3ltYm9saWNOYW1lICsgIi9kZWJ1ZyI7IC8vJE5PTi1OTFMtMSQKKwkJCVN0cmluZyB2YWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKGtleSk7CisJCQlyZXR1cm4gdmFsdWUgPT0gbnVsbCA/IGZhbHNlIDogdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIElzIHRoZSBjb25zb2xlIGxvZyBmb3IgZWNsaXBzZSB0dXJuZWQgb24gdG8gc3lzb3V0LiBJZiB0cnVlLCB0aGVuIHdlIHNob3VsZG4ndCBsb2cgdG8gY29uc29sZSBhbnl0aGluZyBhbHJlYWR5IGxvZ2dlZCBiZWNhdXNlIEVjbGlwc2Ugd291bGQgb2YKKwkgKiBsb2dnZWQgaXQgZm9yIHVzLiBUaGlzIGNvbWVzIGZyb20gdGhlIC1EZWNsaXBzZS5jb25zb2xlTG9nPSJ0cnVlIiB3aGljaCBpcyB0aGUgZGVmYXVsdCB3aGVuIHN0YXJ0aW5nIGVjbGlwc2UgZnJvbSBQREUuCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIGNvbnNvbGVMb2dPbjsKKwlzdGF0aWMgeworCQlTdHJpbmcgY29uc29sb2dQcm9wZXJ0eU5hbWUgPSBudWxsOworCQl0cnkgeworCQkJLy8gQWNjZXNzaW5nIGFuIGludGVybmFsIGZpZWxkLCBzbyB1c2luZyByZWZsZWN0aW9uLiBUaGlzIHdheSBpZiBjaGFuZ2VzIGluIGZ1dHVyZSB3ZSB3b24ndCBjcmFzaC4KKwkJCUNsYXNzIGVjbGlwc2VTdGFydGVyID0gQ2xhc3MuZm9yTmFtZSgib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0b3IuRWNsaXBzZVN0YXJ0ZXIiKTsJLy8kTk9OLU5MUy0xJAorCQkJRmllbGQgY29uc29sZWxvZyA9IGVjbGlwc2VTdGFydGVyLmdldERlY2xhcmVkRmllbGQoIlBST1BfQ09OU09MRV9MT0ciKTsJLy8kTk9OLU5MUy0xJAorCQkJY29uc29sb2dQcm9wZXJ0eU5hbWUgPSAoU3RyaW5nKSBjb25zb2xlbG9nLmdldChudWxsKTsKKwkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKwkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZSkgeworCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKwkJfQorCQljb25zb2xlTG9nT24gPSBjb25zb2xvZ1Byb3BlcnR5TmFtZSAhPSBudWxsICYmICJ0cnVlIi5lcXVhbHMoU3lzdGVtLmdldFByb3BlcnR5KGNvbnNvbG9nUHJvcGVydHlOYW1lKSkgOyAgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlciNzZXRUcmFjZU1vZGUoYm9vbGVhbikKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUcmFjZU1vZGUoYm9vbGVhbiBmbGFnKSB7CisJCWlmIChmU2V0dGluZ1RyYWNlKQorCQkJcmV0dXJuOyAvLyBEbyBub3QgYWxsb3cgY3ljbGVzCisKKwkJZlNldHRpbmdUcmFjZSA9IHRydWU7CisJCWZUcmFjZU1vZGUgPSBmbGFnOworCQlmTXlMb2dnZXIuc2V0VHJhY2VNb2RlKGZsYWcpOworCQlmU2V0dGluZ1RyYWNlID0gZmFsc2U7CisJfQorCisJLy8gVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSBmb3IgaGlzdG9yaWNhbCByZW5kZXJlcnMgaW4gY2FzZSB0aGlzIGhhcyBiZWVuIHN1YmNsYXNzZWQgb3V0c2lkZQorCS8vIG9mIHV0aWwuCisKKwkvKioKKwkgKiBMb2cgYSBzdHJpbmcgdG8gdGhlIHRyYWNlLgorCSAqIAorCSAqIEBwYXJhbSBwYXJhbQorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGxvZyhTdHJpbmcgcGFyYW0pOworCisJLyoqCisJICogRGVmYXVsdCBvbmUgdGhhdCBsb2cgYSBzdHJpbmcgdG8gdGhlIHRyYWNlIGdpdmVuIGEgbGV2ZWwuIERlZmF1bHQgc2ltcGx5IHBhc3NlcyBpdCB0byBsb2coU3RyaW5nKSBzbyB0aGF0IHdlIGRvbid0IGJyZWFrIG9sZCBzdWJjbGFzc2VzLgorCSAqIDxwPgorCSAqIElmIGxvZ2dlZFRvV29ya2JlbmNoIGlzIHRydWUsIHRoZW4gaXQgc2hvdWxkbid0IGJlIGxvZ2dlZCB0byBjb25zb2xlIGlmIGNvbnNvbGVMb2dPbiBpcyB0cnVlIGJlY2F1c2Ugd29ya2JlbmNoIGFscmVhZHkgbG9nZ2VkIHRvIGNvbnNvbGUuCisJICogCisJICogQHBhcmFtIG1zZworCSAqIEBwYXJhbSBsCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBtc2csIExldmVsIGwsIGJvb2xlYW4gbG9nZ2VkVG9Xb3JrYmVuY2gpIHsKKwkJbG9nKG1zZyk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyI2xvZyhqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCisJICovCisJcHVibGljIFN0cmluZyBsb2coU3RyaW5nIG1zZywgaW50IHR5cGUpIHsKKworCQlTdHJpbmcgdGFyZ2V0ID0gbG9nV29ya0JlbmNoKG1zZywgdHlwZSk7CisJCWlmIChmVHJhY2VNb2RlIHx8IHRhcmdldC5lcXVhbHMoTk9MT0dfREVTQ1JJUFRJT04pKQorCQkJcmV0dXJuIGxvZyhtc2cpOworCQllbHNlCisJCQlyZXR1cm4gdGFyZ2V0OworCX0KKworCS8qKgorCSAqIExvZyB0byB3b3JrYmVuY2gsIGEgc3RyaW5nIG9mIHRoZSBnaXZlbiBsZXZlbCA8Y29kZT5JTG9nUmVuZGVyZXIuTE9HXzwvY29kZT4uIGxldmVscy4KKwkgKiAKKwkgKiBAcGFyYW0gbXNnCisJICogQHBhcmFtIHR5cGUKKwkgKiBAcmV0dXJuIGRlc2NyaXB0aW9uIG9mIHRoZSBsb2cncyBkZXN0aW5hdGlvbiBlLmcuLCA8Y29kZT5DT05TT0xFX0RFU0NSSVBUSU9OPC9jb2RlPgorCSAqIAorCSAqIEBzZWUgSUxvZ1JlbmRlcmVyI0xPR19FUlJPUiBhbmQgYWxsIG9mIHRoZSBvdGhlciBsb2cgdHlwZXMuCisJICogQHNlZSBJTG9nUmVuZGVyZXIjQ09OU09MRV9ERVNDUklQVElPTgorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBTdHJpbmcgbG9nV29ya0JlbmNoKFN0cmluZyBtc2csIGludCB0eXBlKSB7CisKKwkJdHJ5IHsKKwkJCWludCBFcnJDb2RlOworCQkJaWYgKGZXb3JrQmVuY2hMb2dnZXIgIT0gbnVsbCkgeworCQkJCXN3aXRjaCAodHlwZSkgeworCQkJCQljYXNlIChJTG9nUmVuZGVyZXIuTE9HX0VSUk9SKToKKwkJCQkJCUVyckNvZGUgPSBJU3RhdHVzLkVSUk9SOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgKElMb2dSZW5kZXJlci5MT0dfV0FSTklORyk6CisJCQkJCQlFcnJDb2RlID0gSVN0YXR1cy5XQVJOSU5HOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgKElMb2dSZW5kZXJlci5MT0dfSU5GTyk6CisJCQkJCQlFcnJDb2RlID0gSVN0YXR1cy5JTkZPOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgKElMb2dSZW5kZXJlci5MT0dfVFJBQ0UpOgorCQkJCQkJRXJyQ29kZSA9IElTdGF0dXMuT0s7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnZhbGlkIExvZyBUeXBlIik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoRXJyQ29kZSwgZk15QnVuZGxlLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLk9LLCBtc2csIG51bGwpOworCQkJCWZXb3JrQmVuY2hMb2dnZXIubG9nKHN0YXR1cyk7CisJCQkJcmV0dXJuIFdPUktCRU5DSF9ERVNDUklQVElPTjsKKwkJCX0gZWxzZQorCQkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIHQpIHsKKwkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKKwkJfQorCX0KKworCS8vIERlZmF1bHQgaW1wbGVudGF0aW9uIG9mIHRoZSBJTG9nUmVuZGVyZXIyIGludGVyZmFjZS4KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0xvZ2dpbmcoTGV2ZWwgbGV2ZWwpIHsKKwkJcmV0dXJuIGZUcmFjZU1vZGUgfHwgZk15TG9nZ2VyLmlzTG9nZ2luZ0xldmVsKGxldmVsKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBTVEFUVVNfTEVWRUw7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMZXZlbFtdIFNUQVRVU19MRVZFTF9MT09LVVA7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMZXZlbFtdIExFVkVMX1NUQVRVUzsKKworCXN0YXRpYyB7CisJCS8vIFN0YXR1cyBsZXZlbHMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBsb2cgbGV2ZWxzLCBmcm9tIGZpbmVzdCB0byBub25lLCBzYW1lIGluZGV4ZXMgYXMgZnJvbSBTVEFUVVNfTEVWRUxfTE9PS1VQLgorCQlTVEFUVVNfTEVWRUxfTE9PS1VQID0gbmV3IExldmVsW10geyBMZXZlbC5JTkZPLCBMZXZlbC5XQVJOSU5HLCBMZXZlbC5TRVZFUkV9OworCQlTVEFUVVNfTEVWRUwgPSBuZXcgaW50W10geyBJU3RhdHVzLklORk8sIElTdGF0dXMuV0FSTklORywgSVN0YXR1cy5FUlJPUn07CisKKwkJLy8gTGV2ZWxzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgSVN0YXR1cyBsZXZlbHMuCisJCWludCBtYXhJRCA9IE1hdGgubWF4KElTdGF0dXMuT0ssIE1hdGgubWF4KElTdGF0dXMuSU5GTywgTWF0aC5tYXgoSVN0YXR1cy5XQVJOSU5HLCBJU3RhdHVzLkVSUk9SKSkpOworCQlMRVZFTF9TVEFUVVMgPSBuZXcgTGV2ZWxbbWF4SUQgKyAxXTsKKwkJTEVWRUxfU1RBVFVTW0lTdGF0dXMuT0tdID0gTGV2ZWwuRklORTsKKwkJTEVWRUxfU1RBVFVTW0lTdGF0dXMuSU5GT10gPSBMZXZlbC5JTkZPOworCQlMRVZFTF9TVEFUVVNbSVN0YXR1cy5XQVJOSU5HXSA9IExldmVsLldBUk5JTkc7CisJCUxFVkVMX1NUQVRVU1tJU3RhdHVzLkVSUk9SXSA9IExldmVsLlNFVkVSRTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIEphdmEgTGV2ZWwgZm9yIHRoZSBzdGF0dXMgY29kZSBmcm9tIHRoZSBnaXZlbiBJU3RhdHVzLgorCSAqIAorCSAqIEBwYXJhbSBzdGF0dXMKKwkgKiBAcmV0dXJuIHRoZSBKYXZhIExldmVsCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHJvdGVjdGVkIExldmVsIGdldExvZ0xldmVsKElTdGF0dXMgc3RhdHVzKSB7CisJCXJldHVybiBMRVZFTF9TVEFUVVNbc3RhdHVzLmdldFNldmVyaXR5KCldOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgSVN0YXR1cyBzdGF0dXMgY29kZSBmb3IgdGhlIGdpdmVuIEphdmEgTGV2ZWwuCisJICogCisJICogQHBhcmFtIGxvZ0xldmVsCisJICogQHJldHVybiB0aGUgSVN0YXR1cyBzdGF0dXMgY29kZS4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwcm90ZWN0ZWQgaW50IGdldFN0YXR1c1NldmVyaXR5KExldmVsIGxvZ0xldmVsKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgU1RBVFVTX0xFVkVMX0xPT0tVUC5sZW5ndGg7IGkrKykgeworCQkJaWYgKFNUQVRVU19MRVZFTF9MT09LVVBbaV0gPT0gbG9nTGV2ZWwpCisJCQkJcmV0dXJuIFNUQVRVU19MRVZFTFtpXTsKKwkJfQorCQlyZXR1cm4gSVN0YXR1cy5PSzsgLy8gRGVmYXVsdCB0byBvay4KKwl9CisKKwkvKioKKwkgKiBMb2cgdGhlIHN0cmluZyB0byB0aGUgd29ya2JlbmNoIGZvciB0aGUgZ2l2ZW4gbGV2ZWwKKwkgKiAKKwkgKiBAcGFyYW0gbXNnCisJICogQHBhcmFtIGxldmVsCisJICogQHJldHVybiBkZXNjcmlwdGlvbiBvZiB0aGUgbG9nJ3MgZGVzdGluYXRpb24gZS5nLiwgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTjwvY29kZT4KKwkgKiAKKwkgKiBAc2luY2UgMS4xLjAKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGxvZ1dvcmtiZW5jaChTdHJpbmcgbXNnLCBMZXZlbCBsZXZlbCkgeworCQlTdHJpbmcgcmVzdWx0ID0gTk9MT0dfREVTQ1JJUFRJT047CisJCS8vIFRlc3QgYWdhaW4gYmVjYXVzZSB3ZSBjb3VsZCBiZSBoZXJlIHNpbXBseSBkdWUgdG8gdHJhY2UgbW9kZSwgaW4gd2hpY2ggY2FzZSB3ZQorCQkvLyBkb24ndCB3YW50IHRvIHdvcmtiZW5jaCBsb2cgaXQuCisJCWlmIChmTXlMb2dnZXIuaXNMb2dnaW5nTGV2ZWwobGV2ZWwpKSB7CisJCQlQbGF0Zm9ybS5nZXRMb2coZk15QnVuZGxlKS5sb2cobmV3IFN0YXR1cyhnZXRTdGF0dXNTZXZlcml0eShsZXZlbCksIGZNeUJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgbXNnLCBudWxsKSk7CisJCQlyZXN1bHQgPSBXT1JLQkVOQ0hfREVTQ1JJUFRJT047CisJCQlpZiAoZlRyYWNlTW9kZSkKKwkJCQlsb2cobXNnLCBsZXZlbCwgdHJ1ZSk7CisJCX0gZWxzZSBpZiAoZlRyYWNlTW9kZSkKKwkJCWxvZyhtc2csIGxldmVsLCBmYWxzZSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0U3RhdHVzTXNnKElTdGF0dXMgcywgTGV2ZWwgbCkgeworCQlpZiAocy5nZXRFeGNlcHRpb24oKSAhPSBudWxsKQorCQkJcmV0dXJuIGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKHMudG9TdHJpbmcoKSArIGZNeUxvZ2dlci5mTGluZVNlcGVyYXRvciArIGZNeUxvZ2dlci5leGNlcHRpb25Ub1N0cmluZyhzLmdldEV4Y2VwdGlvbigpKSwgbCk7CisJCWVsc2UKKwkJCXJldHVybiBmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhzLnRvU3RyaW5nKCksIGwpOworCX0KKworCS8qKgorCSAqIExvZyB0aGUgSVN0YXR1cyB0byB0aGUgd29ya2JlbmNoIGF0IHRoZSBnaXZlbiBsZXZlbC4KKwkgKiAKKwkgKiBAcGFyYW0gcworCSAqIEBwYXJhbSBsZXZlbAorCSAqIEByZXR1cm4gZGVzY3JpcHRpb24gb2YgdGhlIGxvZydzIGRlc3RpbmF0aW9uIGUuZy4sIDxjb2RlPkNPTlNPTEVfREVTQ1JJUFRJT048L2NvZGU+CisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBsb2dXb3JrYmVuY2goSVN0YXR1cyBzLCBMZXZlbCBsZXZlbCkgeworCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKKwkJCWxldmVsID0gZ2V0TG9nTGV2ZWwocyk7CisJCVN0cmluZyByZXN1bHQgPSBOT0xPR19ERVNDUklQVElPTjsKKwkJLy8gVGVzdCBhZ2FpbiBiZWNhdXNlIHdlIGNvdWxkIGJlIGhlcmUgc2ltcGx5IGR1ZSB0byB0cmFjZSBtb2RlLCBpbiB3aGljaCBjYXNlIHdlCisJCS8vIGRvbid0IHdhbnQgdG8gd29ya2JlbmNoIGxvZyBpdC4KKwkJaWYgKGZNeUxvZ2dlci5pc0xvZ2dpbmdMZXZlbChsZXZlbCkpIHsKKwkJCVBsYXRmb3JtLmdldExvZyhmTXlCdW5kbGUpLmxvZyhzKTsKKwkJCXJlc3VsdCA9IFdPUktCRU5DSF9ERVNDUklQVElPTjsKKwkJCWlmIChmVHJhY2VNb2RlKQorCQkJCWxvZyhnZXRTdGF0dXNNc2cocywgbGV2ZWwpLCBsZXZlbCwgdHJ1ZSk7CisJCX0gZWxzZSBpZiAoZlRyYWNlTW9kZSkKKwkJCWxvZyhnZXRTdGF0dXNNc2cocywgbGV2ZWwpLCBsZXZlbCwgZmFsc2UpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIExvZyB0byB0aGUgd29ya2JlbmNoIHRoZSBUaHJvd2FibGUgYXQgdGhlIGdpdmVuIGxldmVsLgorCSAqIAorCSAqIEBwYXJhbSB0CisJICogQHBhcmFtIGxldmVsCisJICogQHJldHVybiBkZXNjcmlwdGlvbiBvZiB0aGUgbG9nJ3MgZGVzdGluYXRpb24gZS5nLiwgPGNvZGU+Q09OU09MRV9ERVNDUklQVElPTjwvY29kZT4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGxvZ1dvcmtiZW5jaChUaHJvd2FibGUgdCwgTGV2ZWwgbGV2ZWwpIHsKKwkJU3RyaW5nIHJlc3VsdCA9IE5PTE9HX0RFU0NSSVBUSU9OOworCQkvLyBUZXN0IGFnYWluIGJlY2F1c2Ugd2UgY291bGQgYmUgaGVyZSBzaW1wbHkgZHVlIHRvIHRyYWNlIG1vZGUsIGluIHdoaWNoIGNhc2Ugd2UKKwkJLy8gZG9uJ3Qgd2FudCB0byB3b3JrYmVuY2ggbG9nIGl0LgorCQlpZiAoZk15TG9nZ2VyLmlzTG9nZ2luZ0xldmVsKGxldmVsKSkgeworCQkJUGxhdGZvcm0uZ2V0TG9nKGZNeUJ1bmRsZSkubG9nKG5ldyBTdGF0dXMoZ2V0U3RhdHVzU2V2ZXJpdHkobGV2ZWwpLCBmTXlCdW5kbGUuZ2V0U3ltYm9saWNOYW1lKCksIDAsICJFeGNlcHRpb24gdGhyb3duLiIsIHQpKTsgLy8kTk9OLU5MUy0xJAorCQkJcmVzdWx0ID0gV09SS0JFTkNIX0RFU0NSSVBUSU9OOworCQkJaWYgKGZUcmFjZU1vZGUpCisJCQkJbG9nKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKGZNeUxvZ2dlci5leGNlcHRpb25Ub1N0cmluZyh0KSwgbGV2ZWwpLCBsZXZlbCwgdHJ1ZSk7CisJCX0gZWxzZSBpZiAoZlRyYWNlTW9kZSkKKwkJCWxvZyhmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhmTXlMb2dnZXIuZXhjZXB0aW9uVG9TdHJpbmcodCksIGxldmVsKSwgbGV2ZWwsIGZhbHNlKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIyI2xvZyhieXRlLCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGxvZyhib29sZWFuIGIsIExldmVsIGxldmVsKSB7CisJCWlmIChsZXZlbCA9PSBERUZBVUxUKQorCQkJbGV2ZWwgPSBMZXZlbC5GSU5FU1Q7CisJCWlmIChpc0xvZ2dpbmcobGV2ZWwpKQorCQkJcmV0dXJuIGxvZ1dvcmtiZW5jaChmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhTdHJpbmcudmFsdWVPZihiKSwgbGV2ZWwpLCBsZXZlbCk7CisJCWVsc2UKKwkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIyI2xvZyhieXRlLCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGxvZyhieXRlIGIsIExldmVsIGxldmVsKSB7CisJCWlmIChsZXZlbCA9PSBERUZBVUxUKQorCQkJbGV2ZWwgPSBMZXZlbC5GSU5FU1Q7CisJCWlmIChpc0xvZ2dpbmcobGV2ZWwpKQorCQkJcmV0dXJuIGxvZ1dvcmtiZW5jaChmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhTdHJpbmcudmFsdWVPZihiKSwgbGV2ZWwpLCBsZXZlbCk7CisJCWVsc2UKKwkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIyI2xvZyhjaGFyLCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGxvZyhjaGFyIGMsIExldmVsIGxldmVsKSB7CisJCWlmIChsZXZlbCA9PSBERUZBVUxUKQorCQkJbGV2ZWwgPSBMZXZlbC5GSU5FU1Q7CisJCWlmIChpc0xvZ2dpbmcobGV2ZWwpKQorCQkJcmV0dXJuIGxvZ1dvcmtiZW5jaChmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhTdHJpbmcudmFsdWVPZihjKSwgbGV2ZWwpLCBsZXZlbCk7CisJCWVsc2UKKwkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIyI2xvZyhkb3VibGUsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsKQorCSAqLworCXB1YmxpYyBTdHJpbmcgbG9nKGRvdWJsZSBkLCBMZXZlbCBsZXZlbCkgeworCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKKwkJCWxldmVsID0gTGV2ZWwuRklORVNUOworCQlpZiAoaXNMb2dnaW5nKGxldmVsKSkKKwkJCXJldHVybiBsb2dXb3JrYmVuY2goZk15TG9nZ2VyLmdldEdlbmVyaWNNc2coU3RyaW5nLnZhbHVlT2YoZCksIGxldmVsKSwgbGV2ZWwpOworCQllbHNlCisJCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyMiNsb2coZmxvYXQsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsKQorCSAqLworCXB1YmxpYyBTdHJpbmcgbG9nKGZsb2F0IGYsIExldmVsIGxldmVsKSB7CisJCWlmIChsZXZlbCA9PSBERUZBVUxUKQorCQkJbGV2ZWwgPSBMZXZlbC5GSU5FU1Q7CisJCWlmIChpc0xvZ2dpbmcobGV2ZWwpKQorCQkJcmV0dXJuIGxvZ1dvcmtiZW5jaChmTXlMb2dnZXIuZ2V0R2VuZXJpY01zZyhTdHJpbmcudmFsdWVPZihmKSwgbGV2ZWwpLCBsZXZlbCk7CisJCWVsc2UKKwkJCXJldHVybiBOT0xPR19ERVNDUklQVElPTjsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXIyI2xvZyhpbnQsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsKQorCSAqLworCXB1YmxpYyBTdHJpbmcgbG9nKGludCBpLCBMZXZlbCBsZXZlbCkgeworCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKKwkJCWxldmVsID0gTGV2ZWwuRklORVNUOworCQlpZiAoaXNMb2dnaW5nKGxldmVsKSkKKwkJCXJldHVybiBsb2dXb3JrYmVuY2goZk15TG9nZ2VyLmdldEdlbmVyaWNNc2coU3RyaW5nLnZhbHVlT2YoaSksIGxldmVsKSwgbGV2ZWwpOworCQllbHNlCisJCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyMiNsb2cobG9uZywgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCisJICovCisJcHVibGljIFN0cmluZyBsb2cobG9uZyBsLCBMZXZlbCBsZXZlbCkgeworCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKKwkJCWxldmVsID0gTGV2ZWwuRklORVNUOworCQlpZiAoaXNMb2dnaW5nKGxldmVsKSkKKwkJCXJldHVybiBsb2dXb3JrYmVuY2goZk15TG9nZ2VyLmdldEdlbmVyaWNNc2coU3RyaW5nLnZhbHVlT2YobCksIGxldmVsKSwgbGV2ZWwpOworCQllbHNlCisJCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyMiNsb2coamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCisJICovCisJcHVibGljIFN0cmluZyBsb2coT2JqZWN0IG8sIExldmVsIGxldmVsKSB7CisJCWlmIChvIGluc3RhbmNlb2YgSVN0YXR1cykKKwkJCXJldHVybiBsb2dXb3JrYmVuY2goKElTdGF0dXMpIG8sIGxldmVsKTsKKwkJaWYgKGxldmVsID09IERFRkFVTFQpCisJCQlsZXZlbCA9IExldmVsLkZJTkVTVDsKKwkJaWYgKGlzTG9nZ2luZyhsZXZlbCkpCisJCQlyZXR1cm4gbG9nV29ya2JlbmNoKGZNeUxvZ2dlci5nZXRHZW5lcmljTXNnKFN0cmluZy52YWx1ZU9mKG8pLCBsZXZlbCksIGxldmVsKTsKKwkJZWxzZQorCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LklMb2dSZW5kZXJlcjIjbG9nKHNob3J0LCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGxvZyhzaG9ydCBzLCBMZXZlbCBsZXZlbCkgeworCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKKwkJCWxldmVsID0gTGV2ZWwuRklORVNUOworCQlpZiAoaXNMb2dnaW5nKGxldmVsKSkKKwkJCXJldHVybiBsb2dXb3JrYmVuY2goZk15TG9nZ2VyLmdldEdlbmVyaWNNc2coU3RyaW5nLnZhbHVlT2YocyksIGxldmVsKSwgbGV2ZWwpOworCQllbHNlCisJCQlyZXR1cm4gTk9MT0dfREVTQ1JJUFRJT047CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuSUxvZ1JlbmRlcmVyMiNsb2coamF2YS5sYW5nLlRocm93YWJsZSwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwpCisJICovCisJcHVibGljIFN0cmluZyBsb2coVGhyb3dhYmxlIHQsIExldmVsIGxldmVsKSB7CisJCWlmICh0IGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikKKwkJCXJldHVybiBsb2dXb3JrYmVuY2goKChDb3JlRXhjZXB0aW9uKSB0KS5nZXRTdGF0dXMoKSwgbGV2ZWwpOworCQlpZiAobGV2ZWwgPT0gREVGQVVMVCkKKwkJCWxldmVsID0gTGV2ZWwuU0VWRVJFOworCQlpZiAoaXNMb2dnaW5nKGxldmVsKSkgeworCQkJcmV0dXJuIGxvZ1dvcmtiZW5jaCh0LCBsZXZlbCk7CisJCX0gZWxzZQorCQkJcmV0dXJuIE5PTE9HX0RFU0NSSVBUSU9OOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvamVtdXRpbC9vcmcvZWNsaXBzZS9qZW0vdXRpbC9sb2dnZXIvcHJveHlyZW5kZXIvQ29uc29sZUxvZ1JlbmRlcmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5cmVuZGVyL0NvbnNvbGVMb2dSZW5kZXJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MTBlMmQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5cmVuZGVyL0NvbnNvbGVMb2dSZW5kZXJlci5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorCisKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHlyZW5kZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5JTG9nUmVuZGVyZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKKworCisvKioKKyAqIExvZyByZW5kZXJlciB0byB0aGUgY29uc29sZS4KKyAqIAorICogQHNpbmNlIDEuMC4wCisgKi8KK3B1YmxpYyBjbGFzcyBDb25zb2xlTG9nUmVuZGVyZXIgZXh0ZW5kcyBBYnN0cmFjdFdvcmtCZW5jaFJlbmRlcmVyIHsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yIHRha2luZyBhIGxvZ2dlci4KKwkgKiAKKwkgKiBAcGFyYW0gbG9nZ2VyCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIENvbnNvbGVMb2dSZW5kZXJlcihMb2dnZXIgbG9nZ2VyKSB7CisJCXN1cGVyKGxvZ2dlcik7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHlyZW5kZXIuQWJzdHJhY3RXb3JrQmVuY2hSZW5kZXJlciNsb2coamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGxvZyhTdHJpbmcgbXNnKSB7CisKKwkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7CisJCXJldHVybiBJTG9nUmVuZGVyZXIuQ09OU09MRV9ERVNDUklQVElPTjsKKworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5cmVuZGVyLkFic3RyYWN0V29ya0JlbmNoUmVuZGVyZXIjbG9nKGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5sb2dnaW5nLkxldmVsLCBib29sZWFuKQorCSAqLworCXByb3RlY3RlZCB2b2lkIGxvZyhTdHJpbmcgbXNnLCBMZXZlbCBsLCBib29sZWFuIGxvZ2dlZFRvV29ya2JlbmNoKSB7CisJCWlmICghbG9nZ2VkVG9Xb3JrYmVuY2ggfHwgIWNvbnNvbGVMb2dPbikgeworCQkJaWYgKGwgPT0gTGV2ZWwuU0VWRVJFKQorCQkJCVN5c3RlbS5lcnIucHJpbnRsbihtc2cpOworCQkJZWxzZQorCQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOworCQl9CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eXJlbmRlci9EZWZhdWx0UGx1Z2luVHJhY2VSZW5kZXJlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eXJlbmRlci9EZWZhdWx0UGx1Z2luVHJhY2VSZW5kZXJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NzMzMTgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5cmVuZGVyL0RlZmF1bHRQbHVnaW5UcmFjZVJlbmRlcmVyLmphdmEKQEAgLTAsMCArMSwxMTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorCisKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHlyZW5kZXI7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOworCisKKy8qKgorICogTG9nZ2VyIHRoYXQgYWxzbyBsb2dzIHRvIGEgdHJhY2UgZmlsZSBpbiB0aGUgcGx1Z2luJ3MgbWV0YWRhdGEgYXJlYS4KKyAqIAorICogQHNpbmNlIDEuMC4wCisgKi8KK3B1YmxpYyBjbGFzcyBEZWZhdWx0UGx1Z2luVHJhY2VSZW5kZXJlciBleHRlbmRzIEFic3RyYWN0V29ya0JlbmNoUmVuZGVyZXIgeworCisJLyoqCisJICogTmFtZSBvZiB0aGUgdHJhY2UgZmlsZSBpbiB0aGUgbWV0YWRhdGEgYXJlYS4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQbHVnaW5UcmFjZUZpbGVOYW1lID0gIi8ubG9nIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBTdHJpbmcgZlRyYWNlRmlsZSA9IG51bGw7CisKKwlwcml2YXRlIFByaW50V3JpdGVyIHRyYWNlRmlsZSA9IG51bGw7CisKKwkvKioKKwkgKiBEZWZhdWx0VUlMb2dSZW5kZXJlciBjb25zdHJ1Y3Rvci4KKwkgKiAKKwkgKiBAcGFyYW0gbG9nZ2VyCisJICovCisJcHVibGljIERlZmF1bHRQbHVnaW5UcmFjZVJlbmRlcmVyKExvZ2dlciBsb2dnZXIpIHsKKwkJc3VwZXIobG9nZ2VyKTsKKworCQlmVHJhY2VGaWxlID0gUGxhdGZvcm0uZ2V0U3RhdGVMb2NhdGlvbihmTXlCdW5kbGUpLnRvU3RyaW5nKCkgKyBQbHVnaW5UcmFjZUZpbGVOYW1lOworCQkobmV3IEZpbGUoZlRyYWNlRmlsZSkpLmRlbGV0ZSgpOyAvLyBTdGFydCBmcm9tIGZyZXNoIC4uLiBkbyBub3Qgd2FudCB0byBsZWFrIG9uIGRpc2sgc3BhY2UKKworCX0KKworCXByaXZhdGUgdm9pZCBjbG9zZVRyYWNlRmlsZSgpIHsKKwkJaWYgKHRyYWNlRmlsZSA9PSBudWxsKQorCQkJcmV0dXJuOworCQl0cnkgeworCQkJdHJhY2VGaWxlLmZsdXNoKCk7CisJCQl0cmFjZUZpbGUuY2xvc2UoKTsKKwkJfSBmaW5hbGx5IHsKKwkJCXRyYWNlRmlsZSA9IG51bGw7CisJCX0KKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eXJlbmRlci5BYnN0cmFjdFdvcmtCZW5jaFJlbmRlcmVyI2xvZyhqYXZhLmxhbmcuU3RyaW5nKQorCSAqLworCXB1YmxpYyBTdHJpbmcgbG9nKFN0cmluZyBtc2cpIHsKKworCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKKworCQlvcGVuVHJhY2VGaWxlKCk7CisJCWlmICh0cmFjZUZpbGUgIT0gbnVsbCkgeworCQkJdHJhY2VGaWxlLnByaW50bG4obXNnKTsKKwkJCWNsb3NlVHJhY2VGaWxlKCk7CisJCX0KKwkJcmV0dXJuIGZUcmFjZUZpbGU7CisKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eXJlbmRlci5BYnN0cmFjdFdvcmtCZW5jaFJlbmRlcmVyI2xvZyhqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbCwgYm9vbGVhbikKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBsb2coU3RyaW5nIG1zZywgTGV2ZWwgbCwgYm9vbGVhbiBsb2dnZWRUb1dvcmtiZW5jaCkgeworCQlpZiAoIWxvZ2dlZFRvV29ya2JlbmNoIHx8ICFjb25zb2xlTG9nT24pIHsKKwkJCWlmIChsID09IExldmVsLlNFVkVSRSkKKwkJCQlTeXN0ZW0uZXJyLnByaW50bG4obXNnKTsKKwkJCWVsc2UKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKKwkJfQorCisJCW9wZW5UcmFjZUZpbGUoKTsKKwkJaWYgKHRyYWNlRmlsZSAhPSBudWxsKSB7CisJCQl0cmFjZUZpbGUucHJpbnRsbihtc2cpOworCQkJY2xvc2VUcmFjZUZpbGUoKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBvcGVuVHJhY2VGaWxlKCkgeworCQl0cnkgeworCQkJdHJhY2VGaWxlID0gbmV3IFByaW50V3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZUcmFjZUZpbGUsIHRydWUpKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJLy8gdGhlcmUgd2FzIGEgcHJvYmxlbSBvcGVuaW5nIHRoZSBsb2cgZmlsZSBzbyBsb2cgdG8gdGhlIGNvbnNvbGUKKwkJCXRyYWNlRmlsZSA9IG51bGw7CisJCX0KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eXJlbmRlci9FY2xpcHNlTG9nZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5cmVuZGVyL0VjbGlwc2VMb2dnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTkxMjY3Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eXJlbmRlci9FY2xpcHNlTG9nZ2VyLmphdmEKQEAgLTAsMCArMSwxMjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisKKworICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eXJlbmRlcjsKKworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW47CisKKyAKKy8qKgorICogR2V0IGFuIEVjbGlwc2UgbG9nZ2VyLiBUaGlzIGdldHMgYSBsb2dnZXIgdGhhdCBrbm93cyBpdCBpcyBmb3IgYSBwbHVnaW4uIAorICogCisgKiBGb3IgZWFjaCBwbHVnaW4sIHRoZSBmb2xsb3dpbmcgY2FuIGJlIHNwZWNpZmllZCBpbiB0aGUgLm9wdGlvbiBmaWxlOgorICogCQl7cGx1Z2luLWlkfS9kZWJ1Zy9sb2dUcmFjZQorICogCQkJVGhlIHZhbHVlcyB2YWxpZCBmb3IgdGhpcyBhcmUgInRydWUiLCAiZmFsc2UiLCBvciAiZGVmYXVsdCIuIElmIHRydWUgdGhlbiBsb2dnZXJzIHdpbGwgYmUgc2V0IGludG8KKyAqIAkJCXRyYWNlIG1vZGUuIFRoaXMgbWVhbnMgZXZlcnl0aGluZyBsb2dnZWQgKGV2ZW4gdGhvc2UgdGhhdCBhcmUgZmlsdGVyZWQgb3V0IGR1ZSB0byBub3QgbWVldGluZyBsb2cgbGV2ZWwpCisgKiAJCQl3aWxsIGJlIHRyYWNlZCBvdXQuIElmIHRoZSB2YWx1ZSBpcyAidHJ1ZSIgdGhleSB3aWxsIGJlIHRyYWNlZCB0byB0aGUgc3lzdGVtIGNvbnNvbGUuICAKKyAqIAkJCUlmIGl0IGlzICJkZWZhdWx0IiBvciBub3Qgc2V0IGF0IGFsbCwgdGhlbiBpdCB3aWxsIGJlIHRoZSB2YWx1ZSBpbiB0aGUgIm9yZy5lY2xpcHNlLmplbS51dGlsL2RlYnVnL2xvZ1RyYWNlIiAub3B0aW9ucyBzZXR0aW5nLgorICogCQkJSWYgbm90IHNldCB0aGVyZSwgdGhlbiBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgZmFsc2UuCisgKiAKKyAqIAkJe3BsdWdpbi1pZH0vZGVidWcvbG9nVHJhY2VGaWxlCisgKiAJCQlUaGUgdmFsdWVzIHZhbGlkIGZvciB0aGlzIGFyZSAidHJ1ZSIsICJmYWxzZSIsIG9yICJkZWZhdWx0Ii4gSWYgdHJ1ZSB0aGVuIGxvZ2dlcnMgd2lsbCB0cmFjZSB0byAKKyAqIAkJCXRoZSBzeXN0ZW0gY29uc29sZSBBTkQgdG8gdGhlICIubG9nIiBmaWxlIGluIHRoZSBwbHVnaW5zIHdvcmsgYXJlYSBpbiB0aGUgbWV0YWRhdGEgc2VjdGlvbiBvZiB0aGUgd29ya3NwYWNlLgorICogCQkJSWYgImZhbHNlIiB0aGVuIG5vdCB0cmFjZWQgdG8gYSB0cmFjZSBmaWxlLiAKKyAqIAkJCUlmIGl0IGlzICJkZWZhdWx0IiBvciBub3Qgc2V0IGF0IGFsbCwgdGhlbiBpdCB3aWxsIGJlIHRoZSB2YWx1ZSBpbiB0aGUgIm9yZy5lY2xpcHNlLmplbS51dGlsL2RlYnVnL2xvZ1RyYWNlRmlsZSIgLm9wdGlvbnMgc2V0dGluZy4KKyAqIAkJCUlmIG5vdCBzZXQgdGhlcmUsIHRoZW4gZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIGZhbHNlLgorICogCisgKiAJCXtwbHVnaW4taWR9LmRlYnVnL2xvZ0xldmVsCisgKiAJCQlUaGUgdmFsdWVzIHZhbGlkIGZvciB0aGlzIGFyZSB0aGUgbmFtZXMgZnJvbSA8Y29kZT5qYXZhLnV0aWwubG9nZ2luZy5MZXZlbDwvY29kZT4sIGFuZCAiZGVmYXVsdCIuIFRoZXNlCisgKiAJCQlhcmUgdGhlIHRyYWNlIGN1dG9mZiBsZXZlbHMgdG8gdXNlLiBGb3IgaW5zdGFuY2UsIGlmIHRoZSBsZXZlbCB3YXMgU0VWRVJFLCB0aGVuIG9ubHkgbGV2ZWwgU0VWRVJFIG1zZ3MKKyAqIAkJCWFyZSBsb2dnZWQuIFRoZSByZXN0IGFyZSBza2lwcGVkLiBPciBpZiB0aGUgbGV2ZWwgd2FzIFdBUk5JTkcsIHRoZW4gb25seSBsZXZlbCBTRVZFUkUgYW5kIFdBUk5JTkcgYXJlCisgKiAJCQlsb2dnZWQuCisgKiAJCQlJZiBpdCBpcyAiZGVmYXVsdCIgb3Igbm90IHNldCBhdCBhbGwsIHRoZW4gaXQgd2lsbCBiZSB0aGUgdmFsdWUgaW4gdGhlICJvcmcuZWNsaXBzZS5qZW0udXRpbC9kZWJ1Zy9sb2dMZXZlbCIgLm9wdGlvbnMgc2V0dGluZy4KKyAqIAkJCUlmIG5vdCBzZXQgdGhlcmUsIHRoZW4gZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIFdBUk5JTkcuCisgKiAKKyAqIAorICogQHNpbmNlIDEuMC4wCisgKi8KK3B1YmxpYyBjbGFzcyBFY2xpcHNlTG9nZ2VyIGV4dGVuZHMgTG9nZ2VyIHsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFQlVHX1RSQUNFX09QVElPTiA9ICIvZGVidWcvbG9ndHJhY2UiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVCVUdfVFJBQ0VfRklMRV9PUFRJT04gPSAiL2RlYnVnL2xvZ3RyYWNlZmlsZSI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUJVR19MT0dfTEVWRUxfT1BUSU9OID0gIi9kZWJ1Zy9sb2dsZXZlbCI7IC8vIFRoZSBsb2dnaW5nIGxldmVsIHRvIHVzZSB3aGVuIG5vIEh5YWVkZXMuICh3aGljaCB3ZSBkb24ndCBzdXBwb3J0IGF0IHRoaXMgdGltZSkuIC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX09QVElPTiA9ICJkZWZhdWx0IjsJLy8gSWYgb3B0aW9uIHZhbHVlIGlzIHRoaXMsIHRoZW4gdGhlIHZhbHVlIGZyb20gV1RQIENvbW1vbiBwbHVnaW4gb3B0aW9ucyB3aWxsIGJlIHVzZWQgZm9yIGJvdGggbG9nVHJhY2UgYW5kIGxvZ0xldmVsLgkgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIFJldHVybiBhIGxvZ2dlciBiYXNlZCB1cG9uIHRoZSBQbHVnaW4uIAorCSAqIEBwYXJhbSBwbHVnaW4KKwkgKiBAcmV0dXJuCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIHN0YXRpYyBMb2dnZXIgZ2V0RWNsaXBzZUxvZ2dlcihQbHVnaW4gcGx1Z2luKSB7CisJCXJldHVybiBnZXRFY2xpcHNlTG9nZ2VyKHBsdWdpbi5nZXRCdW5kbGUoKSk7CisJfQorCQorCS8qKgorCSAqIFJldHVybiBhIGxvZ2dlciBiYXNlZCB1cG9uIHRoZSBidW5kbGUuCisJICogCisJICogQHBhcmFtIGJ1bmRsZQorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIExvZ2dlciBnZXRFY2xpcHNlTG9nZ2VyKEJ1bmRsZSBidW5kbGUpIHsKKwkJU3RyaW5nIGlkID0gYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpOworCQlMb2dnZXIgbG9nZ2VyID0gZ2V0TG9nZ2VySWZFeGlzdHMoaWQpOworCQlpZiAobG9nZ2VyICE9IG51bGwpCisJCQlyZXR1cm4gbG9nZ2VyOworCQkKKwkJbG9nZ2VyID0gZ2V0TG9nZ2VyKGlkKTsJLy8gQ3JlYXRlIG9uZSwgd2Ugd2lsbCBub3cgY3VzdG9taXplIGl0LgorCQkKKwkJU3RyaW5nIHBsdWdpbk9wdGlvbiA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKGlkICsgREVCVUdfVFJBQ0VfT1BUSU9OKTsKKwkJaWYgKHBsdWdpbk9wdGlvbiA9PSBudWxsIHx8ICJkZWZhdWx0Ii5lcXVhbHNJZ25vcmVDYXNlKHBsdWdpbk9wdGlvbikpIC8vJE5PTi1OTFMtMSQKKwkJCXBsdWdpbk9wdGlvbiA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKEpFTVV0aWxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpICsgREVCVUdfVFJBQ0VfT1BUSU9OKTsKKwkJYm9vbGVhbiBsb2dUcmFjZSA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKHBsdWdpbk9wdGlvbik7IC8vJE5PTi1OTFMtMSQKKworCQlwbHVnaW5PcHRpb24gPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihpZCArIERFQlVHX1RSQUNFX0ZJTEVfT1BUSU9OKTsKKwkJaWYgKHBsdWdpbk9wdGlvbiA9PSBudWxsIHx8ICJkZWZhdWx0Ii5lcXVhbHNJZ25vcmVDYXNlKHBsdWdpbk9wdGlvbikpIC8vJE5PTi1OTFMtMSQKKwkJCXBsdWdpbk9wdGlvbiA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKEpFTVV0aWxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpICsgREVCVUdfVFJBQ0VfRklMRV9PUFRJT04pOworCQlib29sZWFuIGxvZ1RyYWNlRmlsZSA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKHBsdWdpbk9wdGlvbik7IC8vJE5PTi1OTFMtMSQKKwkJCisJCXBsdWdpbk9wdGlvbiA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKGlkICsgREVCVUdfTE9HX0xFVkVMX09QVElPTik7CisJCWlmIChwbHVnaW5PcHRpb24gPT0gbnVsbCB8fCAiZGVmYXVsdCIuZXF1YWxzSWdub3JlQ2FzZShwbHVnaW5PcHRpb24pKSAvLyROT04tTkxTLTEkCisJCQlwbHVnaW5PcHRpb24gPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihKRU1VdGlsUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSArIERFQlVHX0xPR19MRVZFTF9PUFRJT04pOworCQkKKwkJTGV2ZWwgbG9nTGV2ZWwgPSBMZXZlbC5XQVJOSU5HOworCQlpZiAocGx1Z2luT3B0aW9uICE9IG51bGwpIHsKKwkJCXRyeSB7CisJCQkJbG9nTGV2ZWwgPSBMZXZlbC5wYXJzZShwbHVnaW5PcHRpb24pOworCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKwkJCX0KKwkJfQorCQkKKwkJaWYgKGxvZ1RyYWNlKQorCQkJbG9nZ2VyLnNldFRyYWNlTW9kZSh0cnVlKTsKKwkJbG9nZ2VyLnNldExldmVsKGxvZ0xldmVsKTsKKwkJaWYgKCFsb2dUcmFjZUZpbGUpCisJCQlsb2dnZXIuc2V0UmVuZGVyZXIobmV3IENvbnNvbGVMb2dSZW5kZXJlcihsb2dnZXIpKTsKKwkJZWxzZQorCQkJbG9nZ2VyLnNldFJlbmRlcmVyKG5ldyBEZWZhdWx0UGx1Z2luVHJhY2VSZW5kZXJlcihsb2dnZXIpKTsKKwkJCisJCXJldHVybiBsb2dnZXI7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eXJlbmRlci9JTXNnTG9nZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvbG9nZ2VyL3Byb3h5cmVuZGVyL0lNc2dMb2dnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGY0NWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL2xvZ2dlci9wcm94eXJlbmRlci9JTXNnTG9nZ2VyLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisKKworICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eXJlbmRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7CisKKy8qKgorICogSW50ZXJmYWNlIGZvciBhIG1lc3NhZ2UgbG9nZ2VyLgorICogCisgKiBAc2luY2UgMS4wLjAKKyAqLworcHVibGljIGludGVyZmFjZSBJTXNnTG9nZ2VyIHsKKwlwdWJsaWMgTG9nZ2VyIGdldE1zZ0xvZ2dlcigpOworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL3BsdWdpbi9KRU1VdGlsUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL2plbXV0aWwvb3JnL2VjbGlwc2UvamVtL3V0aWwvcGx1Z2luL0pFTVV0aWxQbHVnaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2I5YjhmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9qZW11dGlsL29yZy9lY2xpcHNlL2plbS91dGlsL3BsdWdpbi9KRU1VdGlsUGx1Z2luLmphdmEKQEAgLTAsMCArMSwzOTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqICAkJFJDU2ZpbGU6IEpFTVV0aWxQbHVnaW4uamF2YSx2ICQkCisgKiAgJCRSZXZpc2lvbjogMS41ICQkICAkJERhdGU6IDIwMDYvMDUvMTcgMjA6MTM6NDUgJCQgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXRJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2guV29ya3NwYWNlUmVzb3VyY2VOb3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLm5scy5FTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5SZXNvdXJjZUhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKKworCisvKioKKyAqIFBsdWdpbiBmb3IgRU1GV29ya2JlbmNoIHV0aWxzLgorICogCisgKiBAc2luY2UgMS4wLjAKKyAqLworcHVibGljIGNsYXNzIEpFTVV0aWxQbHVnaW4gZXh0ZW5kcyBQbHVnaW4geworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuamVtLnV0aWwiOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogUGx1Z2luIGlkIG9mIHRoaXMgcGx1Z2luLgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9IElEOwkKKworCS8qKgorCSAqIFVJIENvbnRleHQgZXh0ZW5zaW9uIHBvaW50LgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX0NPTlRFWFRfRVhURU5TSU9OX1BPSU5UID0gInVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVUlUZXN0ZXIgZWxlbWVudCBuYW1lLgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX1RFU1RFUl9FWFRFTlNJT05fUE9JTlQgPSAidWlUZXN0ZXIiOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogUHJvdG9jb2wgZm9yIHdvcmtzcGFjZQorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktTUEFDRV9QUk9UT0NPTCA9ICJ3b3Jrc3BhY2UiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBQcm90b2NvbCBmb3IgcGxhdGZvcm0gdXJpJ3MuIGkuZS4gInBsYXRmb3JtOi8uLi4iCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICogIAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNX1BST1RPQ09MID0gInBsYXRmb3JtIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogUmVzb3VyY2UgaW5kaWNhdGlvbiBpbiBwbGF0Zm9ybSBwcm90b2NvbC4gSW5kaWNhdGVzIHVybCBpcyBmb3IgYSByZXNvdXJjZSBpbiB0aGUgd29ya3NwYWNlLiBpLmUuICJwbGF0Zm9ybTovcmVzb3VyY2UvcHJvamVjdG5hbWUvLi4uIgorCSAqIAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNX1JFU09VUkNFID0gInJlc291cmNlIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogUGx1Z2luIGluZGljYXRpb24gaW4gcGxhdGZvcm0gcHJvdG9jb2wuIEluZGljYXRlcyB1cmwgaXMgZm9yIGEgZmlsZS9kaXJlY3RvcnkgaW4gdGhlIHBsdWdpbnMgYXJlYS4gaS5lLiAicGxhdGZvcm06L3BsdWdpbi9wbHVnaW5pZC8uLi4iCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk1fUExVR0lOID0gInBsdWdpbiI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgc3RhdGljIFdvcmtzcGFjZVJlc291cmNlTm90aWZpZXIgc2hhcmVkQ2FjaGU7CisKKwlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZVNldCBwbHVnaW5SZXNvdXJjZVNldDsKKworCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIEdMT0JBTF9MT0FESU5HX1BMVUdJTl9OQU1FUzsKKworCXByaXZhdGUgc3RhdGljIEpFTVV0aWxQbHVnaW4gREVGQVVMVDsKKworCXB1YmxpYyBKRU1VdGlsUGx1Z2luKCkgeworCQlzdXBlcigpOworCQlERUZBVUxUID0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIHdvcmtzcGFjZS4gSnVzdCB1c2UgUmVzb3VyY2VQbHVnaW4uZ2V0V29ya3NwYWNlKCkgaW5zdGVhZC4KKwkgKiAKKwkgKiBAcmV0dXJuCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIHN0YXRpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKKwkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIHBsdWdpbiBpbnN0YW5jZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHBsdWdpbiBpbnN0YW5jZS4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEpFTVV0aWxQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKKwkJcmV0dXJuIERFRkFVTFQ7CisJfQorCisJLyoqCisJICogR2V0cyB0aGUgc2hhcmVkQ2FjaGUuCisJICogPHA+CisJICogVGhpcyBpcyBub3QgbWVhbnQgdG8gYmUgY2FsbGVkIGJ5IGNsaWVudHMuCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4gYSBXb3Jrc3BhY2VSZXNvdXJjZU5vdGlmaWVyCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIHN0YXRpYyBXb3Jrc3BhY2VSZXNvdXJjZU5vdGlmaWVyIGdldFNoYXJlZENhY2hlKCkgeworCQlpZiAoc2hhcmVkQ2FjaGUgPT0gbnVsbCkKKwkJCXNoYXJlZENhY2hlID0gbmV3IFdvcmtzcGFjZVJlc291cmNlTm90aWZpZXIoKTsKKwkJcmV0dXJuIHNoYXJlZENhY2hlOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHNoYXJlZENhY2hlLgorCSAqIDxwPgorCSAqIFRoaXMgaXMgbm90IG1lYW50IHRvIGJlIGNhbGxlZCBieSBjbGllbnRzLgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gc2hhcmVkQ2FjaGUKKwkgKiAgICAgICAgICAgIFRoZSBzaGFyZWRDYWNoZSB0byBzZXQKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2hhcmVkQ2FjaGUoV29ya3NwYWNlUmVzb3VyY2VOb3RpZmllciBhU2hhcmVkQ2FjaGUpIHsKKwkJc2hhcmVkQ2FjaGUgPSBhU2hhcmVkQ2FjaGU7CisJfQorCisJLyoqCisJICogQGRlcHJlY2F0ZWQgdXNlIGNyZWF0ZUlzb2xhdGVkUmVzb3VyY2VTZXQoSVByb2plY3QpCisJICovCisJcHVibGljIHN0YXRpYyBSZXNvdXJjZVNldCBjcmVhdGVJc29sYXRlZFJlc291cmNlU2V0KCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBBZGQgYW4gQWRhcHRlci4gWW91IGNhbiB1c2UgdGhpcyBhcGkgdG8gbGlzdGVuIGZvciBhbnkgc2hhcmVkIHJlc291cmNlIGJlaW5nIGxvYWRlZCBvciByZW1vdmVkIGZyb20gYW55IFByb2plY3RSZXNvdXJjZVNldCBpbiB0aGUgV29ya2JlbmNoCisJICogaW5zdGVhZCBvZiB0cnlpbmcgdG8gbGlzdGVuIHRvIGVhY2ggaW5kaXZpZHVhbCBQcm9qZWN0UmVzb3VyY2VTZXQuCisJICogCisJICogQHBhcmFtIGFkYXB0ZXIKKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgYWRkV29ya3NwYWNlRU1GUmVzb3VyY2VMaXN0ZW5lcihBZGFwdGVyIGFkYXB0ZXIpIHsKKwkJaWYgKGFkYXB0ZXIgIT0gbnVsbCAmJiAhZ2V0U2hhcmVkQ2FjaGUoKS5lQWRhcHRlcnMoKS5jb250YWlucyhhZGFwdGVyKSkKKwkJCWdldFNoYXJlZENhY2hlKCkuZUFkYXB0ZXJzKCkuYWRkKGFkYXB0ZXIpOworCX0KKworCS8qKgorCSAqIFJlbW92ZXMgdGhlIGFkYXB0ZXIuCisJICogCisJICogQHBhcmFtIGFkYXB0ZXIKKwkgKiAKKwkgKiBAc2VlICNhZGRXb3Jrc3BhY2VFTUZSZXNvdXJjZUxpc3RlbmVyKEFkYXB0ZXIpCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVdvcmtzcGFjZUVNRlJlc291cmNlTGlzdGVuZXIoQWRhcHRlciBhZGFwdGVyKSB7CisJCWlmIChhZGFwdGVyICE9IG51bGwpCisJCQlnZXRTaGFyZWRDYWNoZSgpLmVBZGFwdGVycygpLnJlbW92ZShhZGFwdGVyKTsKKwl9CisKKwkvKioKKwkgKiBJcyB0aGlzIHBsdWdpbiBhY3RpdmUuCisJICogCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhY3RpdmUKKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBY3RpdmF0ZWQoKSB7CisJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoSUQpOworCQlpZiAoYnVuZGxlICE9IG51bGwpCisJCQlyZXR1cm4gYnVuZGxlLmdldFN0YXRlKCkgPT0gQnVuZGxlLkFDVElWRTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gYSBXb3JrYmVuY2hDb250ZXh0IGlzIGluc3RhbnRpYXRlZCBvbiBhbiBFTUZOYXR1cmUuCisJICogPHA+CisJICogVGhpcyBub3QgbWVhbnQgdG8gYmUgY2FsbGVkIGJ5IGNsaWVudHMuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBhUmVzb3VyY2VTZXQKKwkgKiAKKwkgKiBAc2VlIHBsdWdpbi54bWwjUmVzb3VyY2VIYW5kbGVyRXh0ZW5zaW9uIGV4dGVuc2lvbiBwb2ludC4KKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRFeHRlbmRlZFJlc291cmNlSGFuZGxlcnMoUHJvamVjdFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCkgeworCQlpZiAoYVJlc291cmNlU2V0ID09IG51bGwpCisJCQlyZXR1cm47CisJCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7CisJCUlFeHRlbnNpb25Qb2ludCBwY3QgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChnZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgIlJlc291cmNlSGFuZGxlckV4dGVuc2lvbiIpOyAvLyROT04tTkxTLTEkCisJCUlFeHRlbnNpb25bXSBleHRlbnNpb24gPSBwY3QuZ2V0RXh0ZW5zaW9ucygpOworCQlJRXh0ZW5zaW9uIGNvbmZpZzsKKwkJZm9yIChpbnQgbCA9IDA7IGwgPCBleHRlbnNpb24ubGVuZ3RoOyArK2wpIHsKKwkJCWNvbmZpZyA9IGV4dGVuc2lvbltsXTsKKwkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNFbGVtcyA9IGNvbmZpZy5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKKwkJCVJlc291cmNlSGFuZGxlciBoYW5kbGVyID0gbnVsbDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgY0VsZW1zLmxlbmd0aDsgaSsrKSB7CisJCQkJdHJ5IHsKKwkJCQkJaGFuZGxlciA9IChSZXNvdXJjZUhhbmRsZXIpIGNFbGVtc1tpXS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJydW4iKTsgLy8kTk9OLU5MUy0xJAorCisJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisJCQkJCWhhbmRsZXIgPSBudWxsOworCQkJCX0KKwkJCQlpZiAoaGFuZGxlciAhPSBudWxsKQorCQkJCQlhUmVzb3VyY2VTZXQuYWRkKGhhbmRsZXIpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogRGVsZXRlIHRoZSBjb250ZW50cyBvZiB0aGUgZGlyZWN0b3J5IChhbmQgdGhlIGRpcmVjdG9yeSBpZiBkZWxldGVSb290IGlzIHRydWUpLgorCSAqIEBwYXJhbSByb290CisJICogQHBhcmFtIGRlbGV0ZVJvb3QgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gZGVsZXRlIHRoZSByb290IGRpcmVjdG9yeSB0b28uCisJICogQHBhcmFtIG1vbml0b3IgCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgZGVsZXRpbmcgYW55dGhpbmcuCisJICogCisJICogQHNpbmNlIDEuMS4wCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGRlbGV0ZURpcmVjdG9yeUNvbnRlbnQoRmlsZSByb290LCBib29sZWFuIGRlbGV0ZVJvb3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQlib29sZWFuIGVycm9yID0gZmFsc2U7CisJCWlmIChyb290LmNhblJlYWQoKSkgeworCQkJaWYgKHJvb3QuaXNEaXJlY3RvcnkoKSkgeworCQkJCUZpbGVbXSBmaWxlcyA9IHJvb3QubGlzdEZpbGVzKCk7CisJCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZUZvcm1hdC5mb3JtYXQoRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiUHJvamVjdFV0aWxfRGVsZXRlXzEiKSwgbmV3IE9iamVjdFtdIHtyb290LmdldE5hbWUoKX0pLCBmaWxlcy5sZW5ndGgrKGRlbGV0ZVJvb3QgPyAxIDogMCkpOyAvLyROT04tTkxTLTEkCisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeworCQkJCQlpZiAoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkKKwkJCQkJCWVycm9yIHw9IGRlbGV0ZURpcmVjdG9yeUNvbnRlbnQoZmlsZXNbaV0sIHRydWUsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOworCQkJCQllbHNlIHsKKwkJCQkJCWVycm9yIHw9ICFmaWxlc1tpXS5kZWxldGUoKTsKKwkJCQkJfQorCQkJCQltb25pdG9yLndvcmtlZCgxKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlByb2plY3RVdGlsX0RlbGV0ZV8xIiksIG5ldyBPYmplY3RbXSB7cm9vdC5nZXROYW1lKCl9KSwgMSk7CQkJCSAvLyROT04tTkxTLTEkCisJCQl9CisJCQlpZiAoZGVsZXRlUm9vdCkgeworCQkJCWVycm9yIHw9ICFyb290LmRlbGV0ZSgpOworCQkJCW1vbml0b3Iud29ya2VkKDEpOworCQkJfQorCQkJbW9uaXRvci5kb25lKCk7CisJCX0gZWxzZSB7CisJCQllcnJvciA9IHRydWU7CisJCX0KKwkJcmV0dXJuIGVycm9yOworCX0KKwkKKwkvKioKKwkgKiBBZGQgYSBjbGVhbiByZXNvdXJjZSBjaGFuZ2VsaXN0ZW5lci4KKwkgKiBAcGFyYW0gbGlzdGVuZXIKKwkgKiBAcGFyYW0gZXZlbnRNYXNrIG1hc2sgb2YgZXZlbnQgdHlwZXMgdG8gbGlzdGVuIGZvciBpbiBhZGRpdGlvbiB0byBvbmVzIHRoYXQgYXJlIG5lY2Vzc2FyeSBmb3IgY2xlYW4uIFVzZSAwIGlmIG5vIGFkZGl0aW9uYWwgb25lcy4KKwkgKiAKKwkgKiBAc2luY2UgMS4xLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgYWRkQ2xlYW5SZXNvdXJjZUNoYW5nZUxpc3RlbmVyKENsZWFuUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciwgaW50IGV2ZW50TWFzaykgeworCQkvLyBQUkVfQlVJTEQ6IEhhbmRsZSBDbGVhbi4KKwkJLy8gVE9ETyBVbnRpbCBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAxOTQyIGlzIGZpeGVkLCB3ZSBtdXN0IGRvIFBPU1RfQlVJTEQsIHRoYXQgd2lsbCBwcm9iYWJseSBiZSBzZW50IGJlY2F1c2UgYSBjbGVhbiB3aWxsIGNhdXNlIGEgYnVpbGQgdG8gb2NjdXIgd2hpY2ggc2hvdWxkIGNhdXNlIGEgZGVsdGEuCisJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyLCBldmVudE1hc2sgfCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0JVSUxEKTsJCQorCX0KKwkKKwkvKioKKwkgKiBBIHJlc291cmNlIGxpc3RlbmVyIHRoYXQgY2FuIGJlIHVzZWQgaW4gYWRkaXRpb24gdG8gbGlzdGVuIGZvciBDbGVhbiByZXF1ZXN0cyBhbmQgcHJvY2VzcyB0aGVtLgorCSAqIDxwPgorCSAqIFVzZSA8Y29kZT57QGxpbmsgSVJlc291cmNlQ2hhbmdlRXZlbnQjUFJFX0JVSUxEfTwvY29kZT4gd2hlbiBhZGRpbmcgYXMgbGlzdGVuZXIgdG8gZ2V0IHRoZQorCSAqIGNsZWFuIGV2ZW50cy4KKwkgKiA8cD4KKwkgKiA8Yj5Ob3RlPC9iPiA6IFRPRE8gVW50aWwgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMTk0MiBpcyBmaXhlZCwgeW91IG11c3QgZG8gUE9TVF9CVUlMRCwgdGhhdCB3aWxsIHByb2JhYmx5IGJlIHNlbnQgYmVjYXVzZSBhIGNsZWFuIHdpbGwgY2F1c2UgYSBidWlsZCB0byBvY2N1ciB3aGljaCBzaG91bGQgY2F1c2UgYSBkZWx0YS4KKwkgKiBAc2luY2UgMS4xLjAKKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIENsZWFuUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKKwkJCisJCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgeworCQkJLy8gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyB0byBoYW5kbGUgbW9yZSBldmVudHMgdGhhbiBqdXN0IGNsZWFuLgorCQkJaWYgKGV2ZW50LmdldEJ1aWxkS2luZCgpID09IEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQ0xFQU5fQlVJTEQpIHsKKwkJCQlpZiAoZXZlbnQuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBJUHJvamVjdCkKKwkJCQkJY2xlYW5Qcm9qZWN0KChJUHJvamVjdCkgZXZlbnQuZ2V0U291cmNlKCkpOworCQkJCWVsc2UgaWYgKGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2YgSVdvcmtzcGFjZSkKKwkJCQkJY2xlYW5BbGwoKTsJCQkJCisJCQl9CisJCX0KKworCQkvKioKKwkJICogQ2xlYXIgb3V0IHRoZSBwcm9qZWN0LgorCQkgKiBAcGFyYW0gcHJvamVjdAorCQkgKiAKKwkJICogQHNpbmNlIDEuMS4wCisJCSAqLworCQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjbGVhblByb2plY3QoSVByb2plY3QgcHJvamVjdCk7CisKKwkJLyoqCisJCSAqIENsZWFuIGFsbC4KKwkJICogPHA+CisJCSAqIEJ5IGRlZmF1bHQgdGhpcyB3aWxsIHNpbXBseSBjYWxsIGEgY2xlYW4gcHJvamVjdCBvbiBlYWNoIG9wZW4gcHJvamVjdC4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYW5kIGVpdGhlcgorCQkgKiBhZGQgbW9yZSBmdW5jdGlvbiB0byBjbGVhciBvdXQgbm9uLXByb2plY3QgZGF0YSBhbmQgdGhlbiBjYWxsIHN1cGVyLiBPciBpZiB0aGV5IGNhbiBoYW5kbGUgYWxsIG9mIHRoZSBwcm9qZWN0cworCQkgKiBpbiBhIGZhc3RlciB3YXksIHRoZW4gY2FuIGNvbXBsZXRlbHkgaGFuZGxlIHRoaXMuCisJCSAqIAorCQkgKiBAc2luY2UgMS4xLjAKKwkJICovCisJCXByb3RlY3RlZCB2b2lkIGNsZWFuQWxsKCkgeworCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKKwkJCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07CisJCQkJaWYgKHByb2plY3QuaXNPcGVuKCkpIHsKKwkJCQkJY2xlYW5Qcm9qZWN0KHByb2plY3QpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIEdldCB0aGUgcHJvamVjdCByZXNvdXJjZSBzZXQgZm9yIHRoZSBwbHVnaW4gKHRoZXJlIGlzIG9uZSBmb3IgdGhlIHdob2xlIHN5c3RlbSkuCisJICogCisJICogQHJldHVybiBzeXN0ZW0td2lkZSByZXNvdXJjZSBzZXQuCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIHN0YXRpYyBSZXNvdXJjZVNldCBnZXRQbHVnaW5SZXNvdXJjZVNldCgpIHsKKwkJaWYgKHBsdWdpblJlc291cmNlU2V0ID09IG51bGwpCisJCQlwbHVnaW5SZXNvdXJjZVNldCA9IG5ldyBQcm9qZWN0UmVzb3VyY2VTZXRJbXBsKG51bGwpOworCQlyZXR1cm4gcGx1Z2luUmVzb3VyY2VTZXQ7CisJfQorCisJLyoqCisJICogU2V0IHRoZSBzeXN0ZW0td2lkZSByZXNvdXJjZSBzZXQuCisJICogCisJICogQHBhcmFtIHNldAorCSAqIEBzaW5jZSAxLjAuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQbHVnaW5SZXNvdXJjZVNldChSZXNvdXJjZVNldCBzZXQpIHsKKwkJcGx1Z2luUmVzb3VyY2VTZXQgPSBzZXQ7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBnbG9iYWwgbG9hZGluZyBwbHVnaW4gbmFtZXMuCisJICogPHA+CisJICogVGhpcyBpcyBub3QgbWVhbnQgdG8gYmUgY2FsbGVkIGJ5IGNsaWVudHMuCisJICogPC9wPgorCSAqIAorCSAqIEByZXR1cm4KKwkgKiAKKwkgKiBAc2luY2UgMS4wLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEdsb2JhbExvYWRpbmdQbHVnaW5OYW1lcygpIHsKKwkJaWYgKEdMT0JBTF9MT0FESU5HX1BMVUdJTl9OQU1FUyA9PSBudWxsKQorCQkJR0xPQkFMX0xPQURJTkdfUExVR0lOX05BTUVTID0gcmVhZEdsb2JhbExvYWRpbmdQbHVnaW5OYW1lcygpOworCQlyZXR1cm4gR0xPQkFMX0xPQURJTkdfUExVR0lOX05BTUVTOworCX0KKworCS8qKgorCSAqIEdldCB0aGUgTG9nZ2VyIGZvciB0aGlzIHBsdWdpbi4KKwkgKiAKKwkgKiBAcmV0dXJuIGxvZ2dlciBmb3IgdGhpcyBwbHVnaW4uCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICovCisJcHVibGljIHN0YXRpYyBMb2dnZXIgZ2V0TG9nZ2VyKCkgeworCQlyZXR1cm4gTG9nZ2VyLmdldExvZ2dlcihJRCk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gcmVhZEdsb2JhbExvYWRpbmdQbHVnaW5OYW1lcygpIHsKKwkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7CisJCUlFeHRlbnNpb25Qb2ludCBleFBvaW50ID0gcmVnLmdldEV4dGVuc2lvblBvaW50KElELCAiZ2xvYmFsUGx1Z2luUmVzb3VyY2VMb2FkIik7IC8vJE5PTi1OTFMtMSQKKwkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleFBvaW50LmdldEV4dGVuc2lvbnMoKTsKKwkJU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW2V4dGVuc2lvbnMubGVuZ3RoXTsKKwkJaWYgKGV4dGVuc2lvbnMubGVuZ3RoID4gMCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKQorCQkJCW5hbWVzW2ldID0gZXh0ZW5zaW9uc1tpXS5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKTsKKwkJfQorCQlyZXR1cm4gbmFtZXM7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY1YWMwNgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvLmNsYXNzcGF0aApAQCAtMCwwICsxLDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Y2xhc3NwYXRoPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgorPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViLy5jdnNpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVlODJkNwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvLmN2c2lnbm9yZQpAQCAtMCwwICsxIEBACitiaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTI5YzgyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi8ucHJvamVjdApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmU8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9QRVJGTVNSLlJFQURNRS50eHQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL1BFUkZNU1IuUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTg2YTM2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9QRVJGTVNSLlJFQURNRS50eHQKQEAgLTAsMCArMSwxNCBAQAorVGhpcyBpcyBhIHN0dWIgcGx1Z2luIGZvciBwZXJmbXNyLiBJdCBpcyBoZXJlIGp1c3Qgc28gdGhhdCBvcmcuZWNsaXBzZS5qZW0udXRpbCBjYW4gY29tcGlsZS4KKworSXQgc2hvdWxkIG5vdCBiZSBhbiBvcGVuIHByb2plY3QgZHVyaW5nIG5vcm1hbCB1c2FnZS4gV2hlbmV2ZXIgYW55IG9mIHRoZSBmaWxlcyBpbiB0aGlzIHByb2plY3QKK2FyZSBjaGFuZ2VkLCAicGVyZm1zci5qYXJkZXNjIiBzaG91bGQgYmUgdXNlZCB0byBjcmVhdGUgdGhlIG5ldyBjaGFuZ2VkIGFwcHJvcHJpYXRlIGphci4gRG8gdGhpcyBieToKKworMSkgU2VsZWN0IHBlcmZtc3IuamFyZGVzYworMikgT24gcG9wdXAgbWVudSBzZWxlY3QgIkNyZWF0ZSBKQVIiCiszKSBIaXQgIkZpbmlzaCIKKzQpIENvbW1pdCBhbGwgY2hhbmdlcyB0byBDVlMuCis1KSBHbyB0byBvcmcuZWNsaXBzZS5qZW0udXRpbCBwcm9qZWN0LCBzZWxlY3QgdGhlIG9yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViIGZvbGRlcgorICAgYW5kIHNlbGVjdCBSZXBsYWNlLT5MYXRlc3QgZnJvbSBIRUFELiBUaGlzIHdpbGwgY2F1c2UgeW91ciBqdXN0IGNvbW1pdHRlZCBjaGFuZ2VzCisgICBmcm9tIHN0ZXAgNCB0byBiZSBwdXQgaW50byBvcmcuZWNsaXBzZS5qZW0udXRpbCBhbmQgd2lsbCBiZSBwaWNrZWQgdXAgZm9yIHRoYXQKKyAgIHBsdWdpbiB0byBjb21waWxlIGFnYWluc3QuCis2KSBFaXRoZXIgY2xvc2Ugb3IgZGVsZXRlIHRoZSBvcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1ZiBwcm9qZWN0IGZyb20gdGhlIHdvcmtzcGFjZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL2Fib3V0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlmMjM4ZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvYWJvdXQuaHRtbApAQCAtMCwwICsxLDMyIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Cis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPkFib3V0PC90aXRsZT4KKzxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKzwvaGVhZD4KKzxib2R5IGxhbmc9IkVOLVVTIj4KKzxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgorIAorPHA+MzB0aCBNYXJjaCwgMjAwNDwvcD4JCis8aDM+TGljZW5zZTwvaDM+Cis8cD5FY2xpcHNlLm9yZyBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKworPGgzPkNvbnRyaWJ1dGlvbnM8L2gzPgorCis8cD5JZiB0aGlzIENvbnRlbnQgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMLCBhbnkgQ29udHJpYnV0aW9ucywgYXMgZGVmaW5lZCBpbiB0aGUgRVBMLCB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UKK21hZGUgYXZhaWxhYmxlIHRvIEVjbGlwc2Uub3JnLCBtZW1iZXJzIG9mIEVjbGlwc2Uub3JnIGFuZC9vciB0aGUgaG9zdCBvZiBFY2xpcHNlLm9yZyB3ZWIgc2l0ZSwgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2gKK0NvbnRlbnQgYXJlIHByb3ZpZGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIGFuZCBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRVBMLjwvcD4KKworPHA+SWYgdGhpcyBDb250ZW50IGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zIG90aGVyIHRoYW4gdGhlIEVQTCAoJnF1b3Q7T3RoZXIgTGljZW5zZSZxdW90OyksIGFueSBtb2RpZmljYXRpb25zLCBlbmhhbmNlbWVudHMgYW5kL29yCitvdGhlciBjb2RlIGFuZC9vciBkb2N1bWVudGF0aW9uICgmcXVvdDtNb2RpZmljYXRpb25zJnF1b3Q7KSB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UgbWFkZSBhdmFpbGFibGUgdG8gRWNsaXBzZS5vcmcsIG1lbWJlcnMgb2YgRWNsaXBzZS5vcmcgYW5kL29yIHRoZQoraG9zdCBvZiBFY2xpcHNlLm9yZywgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2ggQ29udGVudCBhcmUgcHJvdmlkZWQgdW5kZXIgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIE90aGVyIExpY2Vuc2UgYW5kIGNhbiBiZSBtYWRlIGF2YWlsYWJsZQordG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3RoZXIgTGljZW5zZS4gIEluIGFkZGl0aW9uLCB3aXRoIHJlZ2FyZCB0byBNb2RpZmljYXRpb25zIGZvciB3aGljaCB5b3UgYXJlIHRoZSBjb3B5cmlnaHQgaG9sZGVyLCB5b3UgYXJlIGFsc28KK3Byb3ZpZGluZyB0aGUgTW9kaWZpY2F0aW9ucyB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBhbmQgc3VjaCBNb2RpZmljYXRpb25zIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSB0byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mCit0aGUgRVBMLjwvcD4KKworPHA+PGI+VmVyc2lvbjo8L2I+IHYyMDA0MDYyNGEKKworPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTRkYjU3Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTQgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIyAKKyMgQ29udHJpYnV0b3JzOgorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitiaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKKyAgICAgICAgICAgICAgICouamFyCitzb3VyY2UucGVyZm1zci5qYXIgPSBzcmMvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3BlcmZtc3IuamFyIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9wZXJmbXNyLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWJiYThmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9wZXJmbXNyLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3BlcmZtc3IuamFyZGVzYyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvcGVyZm1zci5qYXJkZXNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0OGUyMjMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3BlcmZtc3IuamFyZGVzYwpAQCAtMCwwICsxLDE0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGphcmRlc2M+CisgICAgPGphciBwYXRoPSJvcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9wZXJmbXNyLmphciIvPgorICAgIDxvcHRpb25zIGJ1aWxkSWZOZWVkZWQ9InRydWUiIGNvbXByZXNzPSJ0cnVlIiBkZXNjcmlwdGlvbkxvY2F0aW9uPSIvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvcGVyZm1zci5qYXJkZXNjIiBleHBvcnRFcnJvcnM9InRydWUiIGV4cG9ydFdhcm5pbmdzPSJ0cnVlIiBvdmVyd3JpdGU9ImZhbHNlIiBzYXZlRGVzY3JpcHRpb249InRydWUiIHVzZVNvdXJjZUZvbGRlcnM9ImZhbHNlIi8+CisgICAgPG1hbmlmZXN0IGdlbmVyYXRlTWFuaWZlc3Q9InRydWUiIG1hbmlmZXN0TG9jYXRpb249Ii9WRVNjcmFwUHJvamVjdC9NQU5JRkVTVC5tZiIgbWFuaWZlc3RWZXJzaW9uPSIxLjAiIHJldXNlTWFuaWZlc3Q9ImZhbHNlIiBzYXZlTWFuaWZlc3Q9ImZhbHNlIiB1c2VzTWFuaWZlc3Q9InRydWUiPgorICAgICAgICA8c2VhbGluZyBzZWFsSmFyPSJmYWxzZSI+CisgICAgICAgICAgICA8cGFja2FnZXNUb1NlYWwvPgorICAgICAgICAgICAgPHBhY2thZ2VzVG9VblNlYWwvPgorICAgICAgICA8L3NlYWxpbmc+CisgICAgPC9tYW5pZmVzdD4KKyAgICA8c2VsZWN0ZWRFbGVtZW50cyBleHBvcnRDbGFzc0ZpbGVzPSJ0cnVlIiBleHBvcnRKYXZhRmlsZXM9InRydWUiIGV4cG9ydE91dHB1dEZvbGRlcj0iZmFsc2UiPgorICAgICAgICA8amF2YUVsZW1lbnQgaGFuZGxlSWRlbnRpZmllcj0iPW9yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3NyYyIvPgorICAgIDwvc2VsZWN0ZWRFbGVtZW50cz4KKzwvamFyZGVzYz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3BsdWdpbi5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MjBlZWIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3BsdWdpbi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTIgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIyAKKyMgQ29udHJpYnV0b3JzOgorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitQbHVnaW4ubmFtZT1QZXJmb3JtYW5jZSBNb25pdG9yCisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvcGx1Z2luLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTY5MjZkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9vcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuc3R1Yi9wbHVnaW4ueG1sCkBAIC0wLDAgKzEsMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Cis8cGx1Z2luCisgICBpZD0ib3JnLmVjbGlwc2UucGVyZm1zci5jb3JlIgorICAgbmFtZT0iJVBsdWdpbi5uYW1lIgorICAgdmVyc2lvbj0iMy4wLjAiCisgICBwcm92aWRlci1uYW1lPSJFY2xpcHNlLm9yZyIKKyAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wZXJmbXNyLmNvcmUuUGVyZk1zckNvcmVQbHVnaW4iPgorCisgICA8cnVudGltZT4KKyAgICAgIDxsaWJyYXJ5IG5hbWU9InBlcmZtc3IuamFyIj48ZXhwb3J0IG5hbWU9IioiLz48L2xpYnJhcnk+CisgICA8L3J1bnRpbWU+CisgICAKKyAgIDxyZXF1aXJlcz4KKyAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KKyAgIDwvcmVxdWlyZXM+Cis8L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvc3JjL29yZy9lY2xpcHNlL3BlcmZtc3IvY29yZS9JUGVyZm9ybWFuY2VNb25pdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3NyYy9vcmcvZWNsaXBzZS9wZXJmbXNyL2NvcmUvSVBlcmZvcm1hbmNlTW9uaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkOTkyYzcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3NyYy9vcmcvZWNsaXBzZS9wZXJmbXNyL2NvcmUvSVBlcmZvcm1hbmNlTW9uaXRvci5qYXZhCkBAIC0wLDAgKzEsMTk1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnBlcmZtc3IuY29yZTsKKworLyoqCisgKiBUYWtlIHNuYXBzaG90cyBvZiB0aGUgdmFyaW91cyBwZXJmb3JtYW5jZSBjb3VudGVycy4KKyAqICoqKioqKioqKioqKiogVGhpcyBpcyBqdXN0IGEgc3R1YiBvZiB0aGUgcmVhbCBpbnRlcmZhY2UgdG8gZ2V0IG9yZy5lY2xpcHNlLmplbS51dGlsIAorICogICAgICAgICAgICAgICB0byBjb21waWxlLiBJdCBpcyBub3QgdXNhYmxlIGJ5IGl0c2VsZi4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitwdWJsaWMgaW50ZXJmYWNlIElQZXJmb3JtYW5jZU1vbml0b3IKK3sKKwkvKioKKwkgKiBUaGVzZSBjb25zdGFudHMgY29udHJvbCBob3cgbXVjaCBpbmZvcm1hdGlvbiBpcyBnYXRoZXJlZCBmb3IgYSBwYXJ0aWN1bGFyIHNuYXBzaG90LgorCSAqIFRoZXkgYXJlIG9yJ2VkIHRvZ2V0aGVyIGFuZCBwYXNzZWQgaW50byB0aGUgc25hcHNob3QgbWV0aG9kLiAgCisJICovCisJaW50ZXJmYWNlIFR5cGVzCisJeworCQkvKiogCisJCSAqIDEgLSBXcml0ZSBvdXQgdGhlIHBlcmZvcm1hbmNlIGNvdW50ZXJzIGZyb20gdGhlIG9wZXJhdGluZyBzeXN0ZW0uIFRoZXNlCisJCSAqIGluY2x1ZGUgd29ya2luZyBzZXQsIHBlYWsgd29ya2luZyBzZXQsIGVsYXBzZWQgdGltZSwgdXNlciB0aW1lLCBhbmQgCisJCSAqIGtlcm5lbCB0aW1lLgorCQkgKi8KKwkJaW50IE9wZXJhdGluZ1N5c3RlbUNvdW50ZXJzCQk9IDE7CisJCQorCQkvKioKKwkJICogMiAtIFdyaXRlIG91dCB0aGUgZ2xvYmFsIHBlcmZvcm1hbmNlIGluZm8uIFRoaXMgaW5jbHVkZXMgdGhpbmdzIGxpa2UgdGhlIHRvdGFsCisJCSAqIGNvbW1pdHRlZCBtZW1vcnkgZm9yIHRoZSBlbnRpcmUgc3lzdGVtLgorCQkgKiAKKwkJICogVGhpcyBmdW5jdGlvbiBkZXBlbmRzIG9uIHRoZSBHZXRQZXJmb3JtYW5jZUluZm8oKSBmdW5jdGlvbiBiZWluZyBhdmFpbGFibGUgaW4KKwkJICogdGhlIFdpbmRvd3MgcHNhcGkuZGxsLiBUaGlzIGlzIGF2YWlsYWJsZSBpbiBYUCBidXQgaXMgdXN1YWxseSBub3QgYXZhaWxhYmxlCisJCSAqIGluIFdpbi8yMDAwLiBJZiBpdCBpcyBub3QgYXZhaWxhYmxlIHRoZW4gdGhpcyBmdW5jdGlvbiB0aHJvd3MgYW4gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uCisJCSAqLworCQlpbnQgR2xvYmFsU3lzdGVtQ291bnRlcnMJCT0gMjsKKwkJCisJCS8qKgorCQkgKiA0IC0gV3JpdGUgb3V0IHRoZSBzaXplIG9mIHRoZSBKYXZhIEhlYXAuCisJCSAqLworCQlpbnQgSmF2YUhlYXBTaXplCQkJCT0gNDsKKworCQkvKioKKwkJICogOCAtIFdyaXRlIG91dCBob3cgbXVjaCBvZiB0aGUgSmF2YSBoZWFwIGlzIGJlaW5nIHVzZWQuIFRoaXMgY2FsbHMgdGhlIAorCQkgKiBnYXJiYWdlIGNvbGxlY3RvciBzbyBpdCBtYXkgc2tldyB0aW1pbmcgcmVzdWx0cy4KKwkJICovCisJCWludCBKYXZhSGVhcFVzZWQJCQkJPSA4OworCQkKKwkJLyoqCisJCSAqIDE2IC0gVGhlIHBsdWdpbiBzdGFydHVwIGFuZCBzaXplIGluZm9ybWF0aW9uLgorCQkgKi8KKwkJaW50IFBsdWdpbkluZm8JCQkJCT0gMTY7CisJCQorCQkvKiogMHhmZmZmIC0gRXZlcnl0aGluZy4gKi8KKwkJaW50IEFsbAkJCQkJCQk9IDB4ZmZmZjsJCisJfQorCQorCS8qKgorCSAqIEFkZCBzb21lIG1vcmUgImV4dHJhIiB2YXJpYXRpb25zLiAKKwkgKiAKKwkgKiBUaGUgdmFyaWF0aW9ucyB0aGF0IGFyZSBpbiBlZmZlY3QgYXJlIG1hZGUgdXAgb2YgdGhlc2UgZXh0cmEgdmFyaWF0aW9ucyBwbHVzIGFueSB2YXJpYXRpb25zCisJICogdGhhdCBtYXkgaGF2ZSBiZWVuIHNldCB3aXRoIHRoZSBzZXRWYXIoKSBtZXRob2QuCisJICogCisJICogQHBhcmFtIHZhckxpc3QgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiB2YXJpYXRpb25zCisJICovCisJcHVibGljIHZvaWQgYWRkVmFyQXBwZW5kKFN0cmluZyB2YXJMaXN0KTsKKwkKKwkvKioKKwkgKiBTZXQgdGhlIGRyaXZlciBuYW1lLiAKKwkgKiAKKwkgKiBAcGFyYW0gZHJpdmVyIGEgbGFiZWwgdGhhdCBpZGVudGlmaWVzIHRoZSBkcml2ZXIgdGhhdCBpcyBiZWluZyB0ZXN0ZWQuIElmIGl0IGlzIGEgV1NBRAorCSAqIGRyaXZlciwgdGhpcyB3aWxsIHVzdWFsbHkgYmUgc2V0IGJ5IHRoZSBleHRlbnNpb24uCisJICovCisJcHVibGljIHZvaWQgc2V0RHJpdmVyKFN0cmluZyBkcml2ZXIpOworCQorCS8qKgorCSAqIFNldCB0aGUgbG9jYXRpb24gb2YgdGhlIHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50IGZpbGUsIHRoYXQgaXMgdGhlIHBsYWNlIHdoZXJlCisJICogdGhlIG1lYXN1cmVtZW50cyBhcmUgc3RvcmVkLgorCSAqIAorCSAqIEBwYXJhbSBsb2dGaWxlIHRoZSBmaWxlIG5hbWUgb2Ygd2hlcmUgdGhlIGxvZyBzaG91bGQgYmUgd3JpdHRlbi4gVXN1YWxseSB0aGlzIGlzIGZ1bGx5IHF1YWxpZmllZAorCSAqIHBhdGggbmFtZS4gRm9yIGV4YW1wbGUgIng6XGxvZ3NcdGltZXIueG1sIi4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRMb2dGaWxlKFN0cmluZyBsb2dGaWxlKTsKKwkKKwkvKioKKwkgKiBTZXQgdGhlIHBlcmZvcm1hbmNlIG1vbml0b3IgdG8gYmUgb24gb3Igb2ZmLiBJZiBpdCBpcyBvZmYgdGhlbiBtb3N0IG9mIHRoZSBvdGhlciAKKwkgKiBvcGVyYXRpb25zIHdpbGwgbm8tb3AuCisJICogCisJICogVGhlIGRlZmF1bHQgaXMgZm9yIHRoZSBwZXJmb3JtYW5jZSBtb25pdG9yIHRvIGJlIG9mZiB1bmxlc3MgaXQncyBzcGVjaWFsIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldC4gCisJICogV2hlbiBjYWxsZWQgZnJvbSB0aGUgVUksIHRoZSBVSSBzaG91bGQgY2FsbCB0aGlzIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIG9uLgorCSAqLworCXB1YmxpYyB2b2lkIHNldElzT24oYm9vbGVhbiBpc09uKTsKKwkKKwkvKioKKwkgKiBTZXRzIHRoZSB0ZXN0IGNhc2UgbnVtYmVyIGZvciB0aGlzIG1lYXN1cmVtZW50IHJ1bi4KKwkgKiAgCisJICogQHBhcmFtIHRlc3RkIHRlc3QgY2FzZSBpZGVudGlmaWVyCisJICovCisJcHVibGljIHZvaWQgc2V0VGVzdGQoaW50IHRlc3RkKTsKKwkKKwkvKioKKwkgKiBTZXRzIHRoZSB0ZXN0IGNhc2UgbmFtZS4gSWYgd2lsbCBjYXVzZSBhIG5ldyB0ZXN0IGNhc2UgdG8gYmUgY3JlYXRlZCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgorCSAqIAorCSAqIEBwYXJhbSB0ZXN0TmFtZSBhIHNpbXBsZSAoc2hvcnQpIHRlc3QgY2FzZSBuYW1lLiBJbiB0aGUgY2FzZSBvZiBKVW5pdCB0ZXN0IGNhc2VzLCBpdCB3b3VsZCB1c3VhbGx5IAorCSAqIGJlIHRoZSBKVW5pdCBuYW1lLgorCSAqLworCXB1YmxpYyB2b2lkIHNldFRlc3ROYW1lKFN0cmluZyB0ZXN0TmFtZSk7CisJCisJLyoqCisJICogU2V0IHRoZSB2YXJpYXRpb25zIHRoYXQgYXJlIGluIGVmZmVjdC4KKwkgKiAKKwkgKiBAcGFyYW0gdmFyIGEgY29tbWEgZGVsaW1pdGVkIHN0cmluZyBvZiB2YXJpYXRpb24gbnVtYmVycworCSAqLworCXB1YmxpYyB2b2lkIHNldFZhcihTdHJpbmcgdmFyKTsKKwkKKwkvKioKKwkgKiBTZXQgdGhlIHVwbG9hZCBob3N0CisJICogCisJICogQHBhcmFtIGhvc3QgRE5TIG5hbWUgb2YgdGhlIHVwbG9hZCBob3N0CisJICovCisJcHVibGljIHZvaWQgc2V0VXBsb2FkSG9zdChTdHJpbmcgaG9zdCk7CisJCisJLyoqCisJICogU2V0IHRoZSB1cGxvYWQgcG9ydAorCSAqIAorCSAqIEBwYXJhbSBwb3J0IHVwbG9hZCBwb3J0CisJICovCisJcHVibGljIHZvaWQgc2V0VXBsb2FkUG9ydChpbnQgcG9ydCk7CisJCisJLyoqCisJICogU2V0IHRoZSB1cGxvYWQgdXNlcmlkCisJICogCisJICogQHBhcmFtIHVzZXJpZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFVwbG9hZFVzZXJpZChTdHJpbmcgdXNlcmlkKTsKKwkKKwkvKioKKwkgKiBUYWtlIGEgc25hcHNob3Qgb2Ygc29tZSBkZWZhdWx0IHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50cy4KKwkgKiAKKwkgKiBAcGFyYW0gc3RlcCB0aGlzIGlkZW50aWZpZXMgdGhlIHN0ZXAgdGhhdCB0aGUgc25hcHNob3QgaXMgZm9yCisJICovCisJdm9pZCBzbmFwc2hvdChpbnQgc3RlcCk7CisJCisJLyoqCisJICogVGFrZSBhIHNuYXBzaG90IG9mIHRoZSBzZWxlY3RlZCBwZXJmb3JtYW5jZSBtZWFzdXJlbWVudHMuCisJICogCisJICogQHBhcmFtIHN0ZXAgdGhpcyBpZGVudGlmaWVzIHRoZSBzdGVwIHRoYXQgdGhlIHNuYXBzaG90IGlzIGZvcgorCSAqIAorCSAqIEBwYXJhbSB0eXBlcyBUaGlzIGNvbnRyb2xzIHdoaWNoIG1lYXN1cmVtZW50cyBhcmUgc2VsZWN0ZWQuIEl0IGlzIGFuIG9yJ2QgdG9nZXRoZXIKKwkgKiBsaXN0IG9mIHRoZSBJUGVyZm9ybWFuY2VNb25pdG9yLlR5cGVzIGNvbnN0YW50cy4KKwkgKiAKKwkgKiBAc2VlIElQZXJmb3JtYW5jZU1vbml0b3IuVHlwZXMgCisJICovCisJdm9pZCBzbmFwc2hvdChpbnQgc3RlcCwgaW50IHR5cGVzKTsKKwkKKwkvKioKKwkgKiBXcml0ZSB0aGUgY29tbWVudCB0byB0aGUgcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnQgZmlsZS4KKwkgKiAKKwkgKiBAcGFyYW0gY29tbWVudAorCSAqLworCXZvaWQgd3JpdGVDb21tZW50KFN0cmluZyBjb21tZW50KTsKKwkKKwkvKioKKwkgKiBVcGxvYWQgdGhlIHJlc3VsdHMgdG8gdGhlIHNlcnZlci4gVGhpcyBjYXVzZXMgdGhlIGZpbGUgdG8gYmUKKwkgKiBjbG9zZWQsIGFuZCB0aGUgbW9uaXRvciB0byBiZSBwbGFjZWQgaW50byB0aGUgZmluaXNoZWQgc3RhdGUuCisJICogCisJICogVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgY2FsbGVkIGlmIHRoZSB1cGxvYWRob3N0LCB1cGxvYWRwb3J0IGFuZCB1cGxvYWR1c2VyaWQKKwkgKiBoYXZlIGJlZW4gY29uZmlndXJlZCBiZWZvcmUgaGFuZC4KKwkgKiAKKwkgKiBAcGFyYW0gZGVzY3JpcHRpb24gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gKGl0IGNhbiBiZSBudWxsKQorCSAqIAorCSAqIEByZXR1cm4gc29tZSBzdGF0dXMgaW5mb3JtYXRpb24KKwkgKi8KKwlwdWJsaWMgVXBsb2FkLlN0YXR1cyB1cGxvYWQoU3RyaW5nIGRlc2NyaXB0aW9uKTsKKy8vCQorLy8JLyoqCisvLwkgKiBVcGxvYWQgdGhlIHJlc3VsdHMgdG8gdGhlIHNlcnZlci4gVGhpcyBjYXVzZXMgdGhlIGZpbGUgdG8gYmUKKy8vCSAqIGNsb3NlZCwgYW5kIHRoZSBtb25pdG9yIHRvIGJlIHBsYWNlZCBpbnRvIHRoZSBmaW5pc2hlZCBzdGF0ZS4KKy8vCSAqIAorLy8JICogQHBhcmFtIGhvc3QgdGhlIGhvc3QgbmFtZSB0aGF0IHRoZSBmaWxlIGlzIGJlaW5nIHNlbnQgdG8KKy8vCSAqIEBwYXJhbSBwb3J0IHRoZSBwb3J0IG9uIHRoZSBob3N0CisvLwkgKiBAcGFyYW0gdXNlcmlkIHRoZSB1c2VyaWQgdGhhdCBpcyBkb2luZyB0aGUgdXBsb2FkCisvLwkgKiBAcGFyYW0gZGVzY3JpcHRpb24gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gKGl0IGNhbiBiZSBudWxsKQorLy8JICogCisvLwkgKiBAcmV0dXJuIHNvbWUgc3RhdHVzIGluZm9ybWF0aW9uCisvLwkgKi8KKy8vCVVwbG9hZC5TdGF0dXMgdXBsb2FkKFN0cmluZyBob3N0LCBpbnQgcG9ydCwgU3RyaW5nIHVzZXJpZCwgU3RyaW5nIGRlc2NyaXB0aW9uKTsKKworCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3NyYy9vcmcvZWNsaXBzZS9wZXJmbXNyL2NvcmUvUGVyZk1zckNvcmVQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvc3JjL29yZy9lY2xpcHNlL3BlcmZtc3IvY29yZS9QZXJmTXNyQ29yZVBsdWdpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NWJhMmEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3NyYy9vcmcvZWNsaXBzZS9wZXJmbXNyL2NvcmUvUGVyZk1zckNvcmVQbHVnaW4uamF2YQpAQCAtMCwwICsxLDMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKworCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKKyAKKworLyoqCisgKiAqKioqKioqKioqKioqIFRoaXMgaXMganVzdCBhIHN0dWIgb2YgdGhlIHJlYWwgY2xhc3MgdG8gZ2V0IG9yZy5lY2xpcHNlLmplbS51dGlsIAorICogICAgICAgICAgICAgICB0byBjb21waWxlLiBJdCBpcyBub3QgdXNhYmxlIGJ5IGl0c2VsZi4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQHNpbmNlIDEuMC4wCisgKi8KK3B1YmxpYyBjbGFzcyBQZXJmTXNyQ29yZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7CisJCisJcHVibGljIHN0YXRpYyBJUGVyZm9ybWFuY2VNb25pdG9yIGdldFBlcmZvcm1hbmNlTW9uaXRvcihib29sZWFuIGJvb2wpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3NyYy9vcmcvZWNsaXBzZS9wZXJmbXNyL2NvcmUvVXBsb2FkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL29yZy5lY2xpcHNlLnBlcmZtc3IuY29yZS5zdHViL3NyYy9vcmcvZWNsaXBzZS9wZXJmbXNyL2NvcmUvVXBsb2FkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVmYTY3NwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlLnN0dWIvc3JjL29yZy9lY2xpcHNlL3BlcmZtc3IvY29yZS9VcGxvYWQuamF2YQpAQCAtMCwwICsxLDI3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKworCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UucGVyZm1zci5jb3JlOworIAorCisvKioKKyAqIFVwbG9hZC4KKyAqICoqKioqKioqKioqKiogVGhpcyBpcyBqdXN0IGEgc3R1YiBvZiB0aGUgcmVhbCBpbnRlcmZhY2UgdG8gZ2V0IG9yZy5lY2xpcHNlLmplbS51dGlsIAorICogICAgICAgICAgICAgICB0byBjb21waWxlLiBJdCBpcyBub3QgdXNhYmxlIGJ5IGl0c2VsZi4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitwdWJsaWMgaW50ZXJmYWNlIFVwbG9hZCB7CisJcHVibGljIHN0YXRpYyBjbGFzcyBTdGF0dXMgeworCQlwdWJsaWMgYm9vbGVhbiBzdWNjZXNzOworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLnV0aWwvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL3BsdWdpbi5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1M2RiNmEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL3BsdWdpbi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTggQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIyAKKyMgQ29udHJpYnV0b3JzOgorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICRTb3VyY2U6IC9jdnNyb290L3dlYnRvb2xzL2NvbW1vbi5tb3ZlL3dlYnRvb2xzLmNvbW1vbi5naXQvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9wbHVnaW4ucHJvcGVydGllcyx2ICQKKyMgJFJldmlzaW9uOiAxLjIgJCAgJERhdGU6IDIwMDUvMDIvMTUgMjM6MDc6NDUgJAorIworCisKK3BsdWdpbk5hbWU9SmF2YSBFTUYgTW9kZWwgVXRpbGl0aWVzCitwcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9wbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MWJlNDIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL3BsdWdpbi54bWwKQEAgLTAsMCArMSwxNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KKzxwbHVnaW4+CisKKyAgICAKKzwhLS0gRXh0ZW5zaW9uIHBvaW50IHRvIHJlZ2lzdGVyIFJlc291cmNlSGFuZGxlcnMgdGhhdCB3aWxsIGFsd2F5cyBiZSBhZGRlZCB0byAKKwluZXcgV29ya2JlbmNoQ29udGV4dHMgLS0+CisgICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJSZXNvdXJjZUhhbmRsZXJFeHRlbnNpb24iIG5hbWU9IlJlc291cmNlSGFuZGxlckV4dGVuc2lvbiIvPgorICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZ2xvYmFsUGx1Z2luUmVzb3VyY2VMb2FkIiBuYW1lPSJHbG9iYWwgUGx1Z2luIFJlc291cmNlIExvYWQiLz4KKyAgIDxleHRlbnNpb24tcG9pbnQgaWQ9Im5hdHVyZV9yZWdpc3RyYXRpb24iIG5hbWU9IkVNRiBOYXR1cmUgcmVnaXN0cmF0aW9uIi8+CisgICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJpbnRlcm5hbFdvcmtiZW5jaENvbnRleHRGYWN0b3J5IiBuYW1lPSJJbnRlcm5hbCBXb3JrYmVuY2ggQ29udGV4dCBGYWN0b3J5Ii8+CisgICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ1aUNvbnRleHRTZW5zaXRpdmVDbGFzcyIgbmFtZT0iVUkgQ29udGV4dCBTZW5zaXRpdmUgQ2xhc3MiIHNjaGVtYT0ic2NoZW1hL3VpQ29udGV4dFNlbnNpdGl2ZUNsYXNzLmV4c2QiLz4KKyAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InVpVGVzdGVyIiBuYW1lPSJVSSBUZXN0ZXIiIHNjaGVtYT0ic2NoZW1hL3VpVGVzdGVyLmV4c2QiLz4gICAKKyAgIAorPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL3Byb3BlcnR5X2ZpbGVzL2VtZndvcmtiZW5jaC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9wcm9wZXJ0eV9maWxlcy9lbWZ3b3JrYmVuY2gucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWQ5NDgzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9wcm9wZXJ0eV9maWxlcy9lbWZ3b3JrYmVuY2gucHJvcGVydGllcwpAQCAtMCwwICsxLDE4IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMgCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworRU1GV29ya2JlbmNoQ29udGV4dEJhc2VfRVJST1JfMD1JV0FFMDAwM0UgTWV0aG9kIG5vdCB5ZXQgaW1wbGVtZW50ZWQuCitFTUZXb3JrYmVuY2hDb250ZXh0QmFzZV9FUlJPUl8xPUlXQUUwMDA1RSBQcm9qZWN0IGNhbiBub3QgYmUgbnVsbC4KK0VNRldvcmtiZW5jaENvbnRleHRCYXNlX0VSUk9SXzI9SVdBRTAwMDZFIEF0dGVtcHQgdG8gY3JlYXRlIHJlc291cmNlIHNldCB3aXRoIG51bGwgcHJvamVjdAorRU1GTmF0dXJlUmVnaXN0cnlfRVJST1JfMD1JV0FFMDAwN0UgRHVwbGljYXRlIEVNRiBuYXR1cmUgcmVnaXN0cmF0aW9uIGZvciBpZDogezB9CitFTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeV9VSV8wPVRoZSBwcm9qZWN0IHNob3VsZCBub3QgYmUgbnVsbC4KK0VNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5X1VJXzE9VGhlIHByb2plY3QgXCJ7MH1cIiBpcyBub3QgYWNjZXNzaWJsZS4KKworUHJvamVjdFV0aWxfRGVsZXRlXzE9RGVsZXRpbmcgXCJ7MH1cIi4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL3NjaGVtYS91aUNvbnRleHRTZW5zaXRpdmVDbGFzcy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9zY2hlbWEvdWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MuZXhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjcwZTk4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9zY2hlbWEvdWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MuZXhzZApAQCAtMCwwICsxLDE2OSBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KKzwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Cis8c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuamVtLnV0aWwiPgorPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmplbS51dGlsIiBpZD0idWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MiIG5hbWU9IlVJIENvbnRleHQgU2Vuc2l0aXZlIENsYXNzIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIENvbXBvbmVudHMgYXJlIG9mdGVuIGRlc2lnbmVkIGluIHN1Y2ggYSB3YXkgdGhhdCB0aGUgJnF1b3Q7SGVhZGxlc3MmcXVvdDsgb3Igbm9uLWdyYXBoaWNhbCBwb3J0aW9ucyBhcmUgc2VwYXJhdGUgZnJvbSB0aGUgR3JhcGhpY2FsIFVzZXIgSW50ZXJmYWNlIChHVUkpIHBvcnRpb25zLiBTb21ldGltZXMgdGhpcyBpcyBkb25lIHRvIGZvbGxvdyBnb29kIGRlc2lnbiBwcmluY2lwbGVzLCBvdGhlciB0aW1lcyB0aGVyZSBpcyBhIHNwZWNpZmljIHVzZSBjYXNlIGZvciBkb2luZyBzby4gV2hlbiBwbHVnaW5zIGZvbGxvdyB0aGlzIHByYWN0aWNlIGJlY2F1c2UgdGhleSBtdXN0IHZhcnkgdGhlaXIgYmVoYXZpb3IgYmFzZWQgb24gd2hldGhlciB0aGV5IGFyZSBydW5uaW5nIGluIGEgaGVhZGxlc3MgZW52aXJvbm1lbnQgb3IgYSBncmFwaGljYWwgZW52aXJvbm1lbnQsIHRoZXkgb2Z0ZW4gbmVlZCB0byBjaG9vc2UgdGhlIGNvcnJlY3QgaW1wbGVtZW50YXRpb24gb2YgYSBwYXJ0aWN1bGFyIHR5cGUuIFRoZSBvcmcuZWNsaXBzZS5qZW0udXRpbC51aUNvbnRleHRTZW5zaXRpdmVDbGFzcyBleHRlbnNpb24gcG9pbnQgcHJvdmlkZWQgYnkgdGhlIEpFTSBjb21wb25lbnQgc29sdmVzIGV4YWN0bHkgdGhpcyBwcm9ibGVtLgorJmx0O3AmZ3Q7ICAgIAorVG8gdXNlIHRoZSBleHRlbnNpb24gcG9pbnQsIHlvdSBtdXN0IHByb3ZpZGUgdHdvIGV4dGVuc2lvbnMgdGhhdCBhcmUgbGlua2VkIGJ5IGEga2V5LiBUaGUga2V5IGlzIGEgdW5pcXVlIFN0cmluZy1iYXNlZCB2YWx1ZSB0aGF0IHlvdSB3aWxsIGxhdGVyIHVzZSB0byBpbnN0YW5pdGF0ZSB5b3VyIGNsYXNzLgorJmx0O3AmZ3Q7CitUaGUgZmlyc3QgdXNhZ2Ugb2YgdGhlIGV4dGVuc2lvbiBzcGVjaWZpZXMgeW91ciBrZXksIGFuZCB0aGUgSGVhZGxlc3MgY29udGV4dCwgYW5kIHRoZSBjbGFzcyB0aGF0IHNob3VsZCBiZSBpbnN0YW50aWF0ZWQgZm9yIHRoaXMgKGtleSwgY29udGV4dCkgcGFpci4gVGhpcyBtZWFucyBpbiB0aGUgaGVhZGxlc3MgZW52aXJvbm1lbnQgdGhpcyBjbGFzcyB3aWxsIGJlIGluc3RhbnRpYXRlZCB3aGVuIHJlcXVlc3RlZC4KKyZsdDtwJmd0OworVGhlIHNlY29uZCBleHRlbnNpb24gc3BlY2lmaWVzIHRoZSBVSSBjb250ZXh0IGFuZCB0aGUgc2FtZSBrZXksIGJ1dCBhIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbiBkZXNpZ25lZCBmb3IgZ3JhcGhpY2FsIGVudmlyb25tZW50cy4gVGhpcyBtZWFucyBpbiB0aGUgVUkgZW52aXJvbm1lbnQgdGhpcyBvdGhlciBjbGFzcyB3aWxsIGJlIGluc3RhbnRpYXRlZCB3aGVuIHJlcXVlc3RlZC4KKyZsdDtwJmd0OworVGhlIGFjdHVhbCByZXF1ZXN0IGlzIGRvbmUgaW4geW91ciBjb2RlIHZpYToKKyZsdDtwcmUmZ3Q7CitJTXlJbnRlcmZhY2UgaW5zdGFuY2UgPSAoSU15SW50ZXJmYWNlKSBVSUNvbnRleHREZXRlcm1pbmF0aW9uLmNyZWF0ZUluc3RhbmNlKCZxdW90O215S2V5JnF1b3Q7KTsKKyZsdDsvcHJlJmd0Oword2hlcmUgJmx0O2NvZGUmZ3Q7JnF1b3Q7bXlLZXkmcXVvdDsmbHQ7L2NvZGUmZ3Q7IGlzIHRoZSBrZXkgdXNlZCBvbiBib3RoIGV4dGVuc2lvbnMuIEl0IHdpbGwgdGhlbiBjaG9vc2UgZWl0aGVyIHRoZSBVSSBvciB0aGUgSGVhZGxlc3MgZXh0ZW5zaW9uIGRlcGVuZGluZyB1cG9uIHRoZSBjb250ZXh0LgorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgorICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ1aUNvbnRleHRTZW5zaXRpdmVDbGFzcyIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICAgPC9zZXF1ZW5jZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPC9jb21wbGV4VHlwZT4KKyAgIDwvZWxlbWVudD4KKworICAgPGVsZW1lbnQgbmFtZT0idWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MiPgorICAgICAgPGFubm90YXRpb24+CisgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIEFuIGV4dGVuc2lvbiBwb2ludCB0aGF0IGRlZmluZXMgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyBhbmQgaXRzIGFwcHJvcHJpYXRlIGNvbnRleHQgKFVJIG9yIEhlYWRsZXNzKQorICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJrZXkiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgVGhlIGtleSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgQ29udGV4dCBTZW5zaXRpdmUgc3VwZXIgY2xhc3MvaW50ZXJmYWNlLgorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBBIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIGZvciBlaXRoZXIgYSBVSSBvciBIZWFkbGVzcyBjb250ZXh0LgorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbnRleHQiIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIE9uZSBvZiAmcXVvdDtVSSZxdW90OyBvciAmcXVvdDtIZWFkbGVzcyZxdW90OyBUaGlzIGlzIGNhc2Utc2Vuc2l0aXZlLiBJdCBtdXN0IG1hdGNoIGV4YWN0bHkgYXMgc2hvd24gaGVyZS4KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgICAgIDxzaW1wbGVUeXBlPgorICAgICAgICAgICAgICAgPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+CisgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlVJIj4KKyAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+CisgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkhlYWRsZXNzIj4KKyAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+CisgICAgICAgICAgICAgICA8L3Jlc3RyaWN0aW9uPgorICAgICAgICAgICAgPC9zaW1wbGVUeXBlPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8L2NvbXBsZXhUeXBlPgorICAgPC9lbGVtZW50PgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICA2LjAKKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgVXNhZ2UgZm9yIHRoZSBVSSBjb250ZXh0OgorJmx0O3ByZSZndDsKKyAgICZsdDtleHRlbnNpb24KKyAgICAgICBpZD0mcXVvdDtjb250ZXh0LlNlbnNpdGl2ZS5DbGFzcy53b3JraW5nQ29weU1hbmFnZXImcXVvdDsKKyAgICAgICBuYW1lPSZxdW90O1dvcmtpbmcgQ29weSBNYW5hZ2VyIC0gVUkgQ29udGV4dCBDbGFzcyZxdW90OworICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmplbS51dGlsLkNvbnRleHRTZW5zaXRpdmVDbGFzcyZxdW90OyZndDsKKyAgICAgJmx0O3VpQ29udGV4dFNlbnNpdGl2ZUNsYXNzCisgICAgICAgY29udGV4dD0mcXVvdDtVSSZxdW90OworICAgICAgIGtleT0mcXVvdDt3b3JraW5nQ29weU1hbmFnZXImcXVvdDsKKyAgICAgICBjbGFzc05hbWU9JnF1b3Q7Y29tLmlibS53dHAuY29tbW9uLnVpLldUUFVJV29ya2luZ0NvcHlNYW5hZ2VyJnF1b3Q7LyZndDsKKyAgICZsdDsvZXh0ZW5zaW9uJmd0OworJmx0Oy9wcmUmZ3Q7CismbHQ7YnImZ3Q7CitVc2FnZSBmb3IgdGhlIEhlYWRsZXNzIGNvbnRleHQ6CismbHQ7cHJlJmd0OworICAgJmx0O2V4dGVuc2lvbgorICAgICAgIGlkPSZxdW90O2NvbnRleHQuU2Vuc2l0aXZlLkNsYXNzLndvcmtpbmdDb3B5TWFuYWdlciZxdW90OworICAgICAgIG5hbWU9JnF1b3Q7V29ya2luZyBDb3B5IE1hbmFnZXIgLSBIZWFkbGVzcyBDb250ZXh0IENsYXNzJnF1b3Q7CisgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuamVtLnV0aWwuQ29udGV4dFNlbnNpdGl2ZUNsYXNzJnF1b3Q7Jmd0OworICAgICAmbHQ7dWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MKKyAgICAgICAgIGNvbnRleHQ9JnF1b3Q7SGVhZGxlc3MmcXVvdDsKKyAgICAgICAgIGtleT0mcXVvdDt3b3JraW5nQ29weU1hbmFnZXImcXVvdDsKKyAgICAgICAgIGNsYXNzTmFtZT0mcXVvdDtjb20uaWJtLnd0cC5jb21tb24udWkuV1RQSGVhZGxlc3NXb3JraW5nQ29weU1hbmFnZXImcXVvdDsvJmd0OworICAgJmx0Oy9leHRlbnNpb24mZ3Q7CismbHQ7L3ByZSZndDsKKyZsdDticiZndDsKK0FuZCBmaW5hbGx5IHRoZSByZXRyaWV2YWwgb2YgdGhlIGNsYXNzIGZvciB0aGUgY3VycmVudCBjb250ZXh0OgorCismbHQ7cHJlJmd0OworSVdvcmtpbmdDb3B5TWFuYWdlciBtYW5hZ2VyID0gKElXb3JraW5nQ29weU1hbmFnZXIpIFVJQ29udGV4dERldGVybWluYXRpb24uY3JlYXRlSW5zdGFuY2UoJnF1b3Q7d29ya2luZ0NvcHlNYW5hZ2VyJnF1b3Q7KTsKKyZsdDsvcHJlJmd0OworCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgU2VlICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmplbS51dGlsLlVJQ29udGV4dERldGVybWluYXRpb24mbHQ7L2NvZGUmZ3Q7CisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIAorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgQ29weXJpZ2h0IChjKSBJQk0gMjAwMy4KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS51dGlsL3NjaGVtYS91aVRlc3Rlci5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9zY2hlbWEvdWlUZXN0ZXIuZXhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjlhYjMyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0udXRpbC9zY2hlbWEvdWlUZXN0ZXIuZXhzZApAQCAtMCwwICsxLDEyOCBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KKzwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Cis8c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuamVtLnV0aWwiPgorPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmplbS51dGlsIiBpZD0idWlUZXN0ZXIiIG5hbWU9IlVJIFRlc3RlciIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBUaGlzIGlzIHVzZWQgdG8gdGVsbCBKRU0gdGhhdCBpdCBpcyBydW5uaW5nIGluIGEgbm9uLUhFQURMRVNTIGVudmlyb25tZW50LiBUeXBpY2FsbHkgVUkgZW52aXJvbm1lbnQgaXMgbm9uLUhFQURMRVNTLiBUaGUgZGVmYXVsdCBpZiB0aGVyZSBhcmUgbm8gaW1wbGVtZW50ZXJzIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50IHRoYXQgcmV0dXJuIHRydWUgaXMgSEVBRExFU1MuCismbHQ7cCZndDsKK0EgSEVBRExFU1MgZW52aXJvbm1lbnQgaXMgdHlwaWNhbGx5IGEgYmF0Y2ggc2l0dWF0aW9uIHdoZXJlIHRoZXJlIGlzIG5vIFVJIGFuZCB0aGUgd29ya3NwYWNlIGlzIHVzZWQgZm9yIG9uZSBvcGVyYXRpb24gYW5kIHRoZW4gdGVybWluYXRlZC4gTW9zdCBoZWFkbGVzcyB0YXNrcyBhcmUgZG9uZSB1bmRlciBvbmUgb3BlcmF0aW9uIGFuZCB0aGUgSmF2YVJlZmxlY3Rpb25TeW5jaHJvbml6ZXIgbWF5IG5vdCBoYXZlIGEgY2hhbmNlIHRvIGZsdXNoIGEgYmFkIHJlZmxlY3Rpb24gYmVmb3JlIHRoZSByZWFsIHR5cGUgbmVlZHMgdG8gYmUgZm91bmQgYW5kIGNhbiBiZSBmb3VuZC4gU28gd2hhdCB3b3VsZCBoYXBwZW4gaXMgaWYgYSBjbGFzcyB3YXMgY3JlYXRlZCBkdXJpbmcgdGhpcyBvbmUgb3BlcmF0aW9uIGl0IHdvdWxkIG5vdCBiZSBmb3VuZCBiZWNhdXNlIHRoZSBub3RpZmljYXRpb25zIGhhZCBub3QgeWV0IGdvbmUgb3V0LiAKKyZsdDtwJmd0OworSW4gYSBVSSBlbnZpcm9ubWVudCB0aGUgb3BlcmF0aW9ucyBhcmUgdHlwaWNhbGx5IHNob3J0IGFuZCBkbyBvbmx5IGEgZmV3IHRoaW5ncyBhbmQgdGhlIHJlc3VsdHMgYXJlbiZhcG9zO3QgbmVlZGVkIHVudGlsIGFmdGVyIHRoZSBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZC4gSW4gdGhhdCBjYXNlIGl0IGlzIG1vcmUgZWZmaWNpZW50IHRvIG5vdCBrZWVwIGNoZWNraW5nIGlmIGEgY2xhc3MgaGFzIGFwcGVhcmVkIGV2ZXJ5dGltZSBhIHJlcXVlc3QgaXMgbWFkZSwgaW5zdGVhZCBpdCB3aWxsIHdhaXQgZm9yIHRoZSBub3RpZmljYXRpb24gb2YgdGhlIGFkZGVkIGNsYXNzIHRvIGFwcGVhciBiZWZvcmUgcmVzZXR0aW5nIHRoZSBkZWZpbml0aW9uIHRvIGFsbG93IGNoZWNraW5nIGFnYWluIGxhdGVyLgorJmx0O3AmZ3Q7CitJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGltcGxlbWVudGVyIG9mIHRoaXMgaW50ZXJmYWNlIGluIHRoZSBhcHBsaWNhdGlvbiwgdGhlbiBpdCB3aWxsIGdvIHRocm91Z2ggZWFjaCBvZiB0aGVtIG9uY2UgdW50aWwgb25lIHJldHVybnMgdHJ1ZS4gQXMgc29vbiBhcyBvbmUgcmV0dXJucyB0cnVlIGl0IHdpbGwgc3RvcCBhbmQgbWFyayB0aGUgYXBwbGljYXRpb24gYXMgYmVpbmcgbm9uLUhFQURMRVNTLiBUaGlzIHdpbGwgYmUgZG9uZSBvbmx5IG9uY2UgZm9yIHRoZSBhcHBsaWNhdGlvbi4gSXQgd2lsbCBub3QgYmUgYWdhaW4gdW50aWwgdGhlIG5leHQgc2Vzc2lvbiBvZiB0aGUgYXBwbGljYXRpb24uCismbHQ7cCZndDsKK1RoaXMgaXMgdHlwaWNhbGx5IGFuIGludGVybmFsIGV4dGVuc2lvbiBwb2ludCBvbmx5LiBUaGUgSkVNIFVJIHBsdWdpbiB3aWxsIHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gdGhhdCB3aWxsIHJldHVybiB0cnVlIGlmIHRoZSBQbGF0Zm9ybSBVSSBpcyBhY3RpdmUuIFNvIHRoaXMgd2lsbCBub3JtYWxseSBub3QgYmUgbmVlZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IG1vc3QgY3VzdG9tZXJzLgorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgorICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ1aVRlc3RlciIvPgorICAgICAgICAgPC9zZXF1ZW5jZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPC9jb21wbGV4VHlwZT4KKyAgIDwvZWxlbWVudD4KKworICAgPGVsZW1lbnQgbmFtZT0idWlUZXN0ZXIiPgorICAgICAgPGFubm90YXRpb24+CisgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIFRoZSB1aVRlc3RlciBkZWZpbml0aW9uIGVsZW1lbnQuCisgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICA8L2Fubm90YXRpb24+CisgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBUaGUgY2xhc3MgbmFtZSBvZiB0aGUgVUlUZXN0ZXIgZm9yIHRoaXMgZXh0ZW5zaW9uLiBJdCBtdXN0IGltcGxlbWVudCAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5qZW0udXRpbC5VSVRlc3RlciZsdDsvc2FtcCZndDsuCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICA8YXBwSW5mbz4KKyAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5qZW0udXRpbC5VSVRlc3RlciIvPgorICAgICAgICAgICAgICAgPC9hcHBJbmZvPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8L2NvbXBsZXhUeXBlPgorICAgPC9lbGVtZW50PgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAxLjAuMAorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gaW1wbGVtZW50ZXI6IAorCismbHQ7cCZndDsKKyZsdDtwcmUmZ3Q7CisgJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5qZW0udXRpbC51aVRlc3RlciZxdW90OyZndDsKKyAgJmx0O3VpVGVzdGVyCisgICBjbGFzc05hbWU9JnF1b3Q7Y29tLmV4YW1wbGUuVUlUZXN0ZXJJbXBsZW1lbnRhdGlvbiZxdW90Oy8mZ3Q7CisgJmx0Oy9leHRlbnNpb24mZ3Q7CismbHQ7L3ByZSZndDsKKyZsdDsvcCZndDsKKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBUaGUgJmx0O3NhbXAmZ3Q7Y2xhc3NOYW1lJmx0Oy9zYW1wJmd0OyBhdHRyaWJ1dGUgbXVzdCBiZSBhIGZ1bGx5LXF1YWxpZmllZCBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLmplbS51dGlsLlVJVGVzdGVyJmx0Oy9zYW1wJmd0OyBpbnRlcmZhY2UgZm9yIHRoZSB0ZXN0ZXIuCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIFRoZXJlIGlzIG5vIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgY2xhc3MuCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OworQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKK2F2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKK3RoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYyMDJkOAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvLmNsYXNzcGF0aApAQCAtMCwwICsxLDEyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGNsYXNzcGF0aD4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ3dHBlbWYvIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0id29ya2JlbmNoLyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgorCQk8YWNjZXNzcnVsZXM+CisJCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uLyoqIi8+CisJCTwvYWNjZXNzcnVsZXM+CisJPC9jbGFzc3BhdGhlbnRyeT4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KKzwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi8uY3ZzaWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NDU4YjQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mLy5jdnNpZ25vcmUKQEAgLTAsMCArMSw4IEBACitiaW4KK3J1bnRpbWUKK3RlbXAuZm9sZGVyCitidWlsZC54bWwKK29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mXzEuMC4wLnppcAorc3JjLnppcAorQGRvdAoramF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI1ZjBmZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvLnByb2plY3QKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0RGVzY3JpcHRpb24+CisJPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWY8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yzc0MThmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTAsMCArMSw2MyBAQAorI1NhdCBNYXIgMjQgMDI6MDY6MDIgRURUIDIwMDcKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzI4MDAwCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDE5IEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWY7IHNpbmdsZXRvbjo9dHJ1ZQorQnVuZGxlLVZlcnNpb246IDEuMS4yMDQucXVhbGlmaWVyCitCdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5wbHVnaW4uRWNvcmVVdGlsaXRpZXNQbHVnaW4KK0J1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgorQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucGx1Z2luO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlIiwKKyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7eC1pbnRlcm5hbDo9dHJ1ZQorUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7YnVuZGxlLXZlcnNpb249IlsyLjQuMCwzLjAuMCkiLAorIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMi4wLjApIiwKKyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAorIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKKyBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4xMDAsMy4wLjApIgorRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKK0J1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNAorQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvYWJvdXQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTk5ZGYzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9hYm91dC5odG1sCkBAIC0wLDAgKzEsMzQgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KKzxIVE1MPgorCis8aGVhZD4KKzx0aXRsZT5BYm91dDwvdGl0bGU+Cis8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8L2hlYWQ+CisKKzxCT0RZIGxhbmc9IkVOLVVTIj4KKworPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+CisKKzxQPkp1bmUsIDIwMDg8L1A+CisKKzxIMz5MaWNlbnNlPC9IMz4KKworPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAorKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCit1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCisoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKKzxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCitGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+CisKKzxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAorQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKK3Rlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAorQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCitsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKK3Rlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAorYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Cis8QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KKworPC9CT0RZPgorPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMzdjZmYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyMiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjCisjIENvbnRyaWJ1dG9yczoKKyMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitiaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKKyAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCisgICAgICAgICAgICAgICBhYm91dC5odG1sLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKKyAgICAgICAgICAgICAgIC4sXAorICAgICAgICAgICAgICAgc2NoZW1hLworamFycy5jb21waWxlLm9yZGVyID0gLgorc3JjLmluY2x1ZGVzID0gY29tcG9uZW50LnhtbCxcCisgICAgICAgICAgICAgICBzY2hlbWEvCitvdXRwdXQuLiA9IGJpbi8KK3NvdXJjZS4uID0gd3RwZW1mLyxcCisgICAgICAgICAgIHdvcmtiZW5jaC8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvY29tcG9uZW50LnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvY29tcG9uZW50LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTMwZDMzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9jb21wb25lbnQueG1sCkBAIC0wLDAgKzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYiPjxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYiIGZyYWdtZW50PSJmYWxzZSIvPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uIiBmcmFnbWVudD0iZmFsc2UiLz48L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzgzZDA0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9wbHVnaW4ucHJvcGVydGllcwpAQCAtMCwwICsxLDEzIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMKKyMgQ29udHJpYnV0b3JzOgorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitQYWNrYWdlVVJJTWFwPVBhY2thZ2VVUklNYXAKK3BsdWdpbk5hbWU9RU1GIFV0aWxpdGllcworcGx1Z2luUHJvdmlkZXI9RWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3BsdWdpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRlNmFkOAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvcGx1Z2luLnhtbApAQCAtMCwwICsxLDM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgorPHBsdWdpbj4KKworICAgICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJwYWNrYWdlVVJJTWFwIiBuYW1lPSIlUGFja2FnZVVSSU1hcCIgc2NoZW1hPSJzY2hlbWEvcGFja2FnZVVSSU1hcC5leHNkIi8+CisgICAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InRyYW5zbGF0b3JFeHRlbnNpb24iIG5hbWU9InRyYW5zbGF0b3JFeHRlbnNpb24iIHNjaGVtYT0ic2NoZW1hL3RyYW5zbGF0b3JFeHRlbnNpb24uZXhzZCIvPgorCis8IS0tIE5lZWQgdG8gcmVnaXN0ZXIgdGhlIEVjb3JlIHNwZWNpZmljIHBhY2thZ2UgbWFwcGluZ3MgLS0+CisgICA8ZXh0ZW5zaW9uCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYucGFja2FnZVVSSU1hcCI+CisgICAgICA8bWFwCisgICAgICAgICAgICB1cmk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCisgICAgICAgICAgICBwcmVmaXg9ImVjb3JlIj4KKyAgICAgIDwvbWFwPgorICAgICAgPG1hcAorICAgICAgICAgICAgdXJpPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL01hcHBpbmciCisgICAgICAgICAgICBwcmVmaXg9Im1hcHBpbmciPgorICAgICAgPC9tYXA+Cis8IS0tIFRyaWNrIHRvIGdldCBNYXBwaW5nLnhtaSBmb3IgTU9GNSBzZXJpYWxpemF0aW9uIC0tPgorICAgICAgPG1hcAorICAgICAgICAgICAgdXJpPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL01hcHBpbmciCisgICAgICAgICAgICBwcmVmaXg9Ik1hcHBpbmciPgorICAgICAgPC9tYXA+CisgICA8L2V4dGVuc2lvbj4KKyAgIAorICAgICAgPGV4dGVuc2lvbgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmplbS51dGlsLnVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzIj4KKyAgICAgIDx1aUNvbnRleHRTZW5zaXRpdmVDbGFzcworICAgICAgICAgICAgY29udGV4dD0iSGVhZGxlc3MiCisgICAgICAgICAgICBrZXk9InJlbmRlcmVyRmFjdG9yeSIKKyAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRU1GMkRPTVJlbmRlcmVyRmFjdG9yeSI+CisgICAgICA8L3VpQ29udGV4dFNlbnNpdGl2ZUNsYXNzPgorICAgPC9leHRlbnNpb24+CisKKzwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9wcmVwYXJlZm9ycGlpLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvcHJlcGFyZWZvcnBpaS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAwNzYwNAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvcHJlcGFyZWZvcnBpaS54bWwKQEAgLTAsMCArMSwzNyBAQAorPHByb2plY3QgbmFtZT0iUHJlcGFyZUZvclBJSSIgZGVmYXVsdD0ibWFpbiIgYmFzZWRpcj0iLiI+CisJCQorCTwhLS0gU2V0dXAgdGVtcCB2YXJpYWJsZXMgLS0+CisJPHRhcmdldCBuYW1lPSJpbml0Ij4KKwkJPHByb3BlcnR5IG5hbWU9Im5sc0RpciIgdmFsdWU9ImQ6L05MUy9Db3JvbmEvMDUyNiIvPgorCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luIiB2YWx1ZT0iY29tLmlibS53dHAuZW1mIi8+CisJCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW5kaXIiIHZhbHVlPSJkOi93b3Jrc3BhY2VDb3JvbmEvJHtwbHVnaW59Ii8+CisJCTxwcm9wZXJ0eSBuYW1lPSJvdXRwdXREaXIiIHZhbHVlPSIke25sc0Rpcn0vJHtwbHVnaW59Ii8+CisJCQorCQorCTwvdGFyZ2V0PgorCisJPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KKwk8dGFyZ2V0IG5hbWU9Im5sc0RpciIgZGVwZW5kcz0iaW5pdCI+CisJCTxta2RpciBkaXI9IiR7bmxzRGlyfSIvPgorCTwvdGFyZ2V0PgorCQorCTwhLS0gQ3JlYXRlIHRoZSBkZXN0aW5hdGlvbiBkaXIgLS0+CisJPHRhcmdldCBuYW1lPSJwbHVnaW5kaXIiIGRlcGVuZHM9Im5sc0RpciI+CisJCTxkZWxldGUgZGlyPSIke291dHB1dERpcn0iLz4KKwkJPG1rZGlyIGRpcj0iJHtvdXRwdXREaXJ9Ii8+CisJPC90YXJnZXQ+CisKKwk8IS0tIE1vdmUgdGhlIGZpbGVzIHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9ucyBpbiB0aGUgd29ya3NwYWNlLiAtLT4KKwk8dGFyZ2V0IG5hbWU9Im1haW4iIGRlcGVuZHM9InBsdWdpbmRpciI+CisJCisJCTxtZXNzYWdlSWRHZW4gZm9sZGVyUGF0aCA9ICIke3BsdWdpbmRpcn0iIGNvbXBvbmVudElkID0gIkUiIC8+CisJCQorCQk8Y29weSB0b2RpciA9ICIke291dHB1dERpcn0vd3RwZW1mIiA+CisJCQkgPGZpbGVzZXQgZGlyPSIke3BsdWdpbmRpcn0vd3RwZW1mIj4KKyAgICAgICAgICAgCSAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIi8+CisgIAkJCSA8L2ZpbGVzZXQ+CisgIAkJPC9jb3B5PgorICAJCQorICAJCQorCTwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9zY2hlbWEvcGFja2FnZVVSSU1hcC5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9zY2hlbWEvcGFja2FnZVVSSU1hcC5leHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmOWQ5NTUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3NjaGVtYS9wYWNrYWdlVVJJTWFwLmV4c2QKQEAgLTAsMCArMSwxMTMgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgorPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mIj4KKzxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZiIgaWQ9InBhY2thZ2VVUklNYXAiIG5hbWU9IiVQYWNrYWdlVVJJTWFwIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gcmVnaXN0ZXIgcGFja2FnZSBtYXBwaW5ncy4KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KKyAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgIDxzZXF1ZW5jZT4KKyAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibWFwIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgICA8L3NlcXVlbmNlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgPGFwcEluZm8+CisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+CisgICAgICAgICAgICAgICA8L2FwcEluZm8+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDwvY29tcGxleFR5cGU+CisgICA8L2VsZW1lbnQ+CisKKyAgIDxlbGVtZW50IG5hbWU9Im1hcCI+CisgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InVyaSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcmVmaXgiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDwvY29tcGxleFR5cGU+CisgICA8L2VsZW1lbnQ+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0OworICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7CitBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAorYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAordGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKK2hyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7CisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKzwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9zY2hlbWEvdHJhbnNsYXRvckV4dGVuc2lvbi5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi9zY2hlbWEvdHJhbnNsYXRvckV4dGVuc2lvbi5leHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYTk2NjkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3NjaGVtYS90cmFuc2xhdG9yRXh0ZW5zaW9uLmV4c2QKQEAgLTAsMCArMSwxMDMgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgorPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mIj4KKzxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZiIgaWQ9InRyYW5zbGF0b3JFeHRlbnNpb24iIG5hbWU9InRyYW5zbGF0b3JFeHRlbnNpb24iLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgVGhpcyBpcyB1c2VkIHRvIGNvbnRyaWJ1dGUgY2hpbGQgdHJhbnNsYXRvcnMgdG8gdGhlIGRlZmF1bHQgdHJhbnNsYXRvcnMgaW4gRU1GMkRPTUFkYXB0ZXJJbXBsLgorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgorICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ0cmFuc2xhdG9yIi8+CisgICAgICAgICA8L3NlcXVlbmNlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgPGFwcEluZm8+CisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+CisgICAgICAgICAgICAgICA8L2FwcEluZm8+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDwvY29tcGxleFR5cGU+CisgICA8L2VsZW1lbnQ+CisKKyAgIDxlbGVtZW50IG5hbWU9InRyYW5zbGF0b3IiPgorICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc05hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUgY2hpbGQgdHJhbnNsYXRvci4KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPC9jb21wbGV4VHlwZT4KKyAgIDwvZWxlbWVudD4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCitBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCis8L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL1Jlc291cmNlU3luY2hyb25pemVkSXNMb2FkaW5nQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvUmVzb3VyY2VTeW5jaHJvbml6ZWRJc0xvYWRpbmdBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAzNGM3YQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL1Jlc291cmNlU3luY2hyb25pemVkSXNMb2FkaW5nQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsMTI3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBDcmVhdGVkIG9uIE9jdCAyNiwgMjAwNAorICoKKyAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bworICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWY7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUxvY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyOworCisKKworLyoqCisgKiBUaGUgUmVzb3VyY2VTeW5jaHJvbml6ZWRJc0xvYWRpbmdBZGFwdGVyIGlzIHVzZWQgdG8gc3luY2hyb25pemUgdGhlIGxvYWRpbmcKKyAqIG9mIEVNRiByZXNvdXJjZXMuIFRoaXMgaXMgdGhlIEVjbGlwc2UgdmVyc2lvbiBvZiBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIsCisgKiBhbmQgdXNlcyB0aGUgRWNsaXBzZSBJTG9jayB0ZWNobm9sb2d5IHRvIGFjcXVpcmUgYSBzZW1hcGhvcmUgdW50aWwgdGhlCisgKiBSZXNvdXJjZSBpcyBsb2FkZWQuIHRoZSB3YWl0Rm9yUmVzb3VyY2VUb0xvYWQoKSBtZXRob2Qgd2lsbCBwYXVzZSB1bnRpbAorICogZWl0aGVyIChhKSB0aGUgUmVzb3VyY2UgaGFzIGxvYWRlZCwgdGhlIEFkYXB0ZXIgaXMgbm90aWZpZWQsIGFuZCB0aGUKKyAqIHNlbWFwaG9yZSBpcyByZWxlYXNlZCBvciAoYikgdGhlIERFTEFZIHRpbWVvdXQgaXMgZXhjZWVkZWQsIHdoaWNoIHByZXZlbnRzCisgKiBmdWxsIGRlYWRsb2NrLgorICogCisgKiBAYXV0aG9yIG1kZWxkZXIKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlU3luY2hyb25pemVkSXNMb2FkaW5nQWRhcHRlciBleHRlbmRzIFJlc291cmNlSXNMb2FkaW5nQWRhcHRlciB7CisKKwlwcml2YXRlIGZpbmFsIElMb2NrIGxvYWRpbmdMb2NrOworCisJLyoqCisJICogVGhlIGRlbGF5IGlzIGRlZmF1bHQgdG8gNSBtaW51dGVzLiBUaGlzIGlzIHRoZSB1cHdhcmQgdGhyZXNoaG9sZC4gVGhlCisJICogbG9jayB3aWxsIHdhaXQgdXAgdG8gREVMQVkgbWlsbGlzZWNvbmRzIHRvIGFjcXVpcmUgdGhlIGxvY2ssIGFuZCBiYWlsCisJICogaWYgbm90LiBJdCBkb2VzIG5vdCBtZWFuIHRoYXQgaXQgd2lsbCB3YWl0IERFTEFZIG1pbGxpc2Vjb25kcyBhbHdheXMuCisJICogSW4gZ2VuZXJhbCwgdGhlIHdhaXQgc2hvdWxkIGJlIGFsbW9zdCBpbnN0YW50ZW91cyAtLSBqdXN0IGFzIGxvbmcgYXMKKwkgKiBkb2N1bWVudCBsb2FkaW5nIHJlbWFpbnMgc3BlZWR5LgorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgREVMQVkgPSAzMDAwMDA7CisKKwlwdWJsaWMgUmVzb3VyY2VTeW5jaHJvbml6ZWRJc0xvYWRpbmdBZGFwdGVyKCkgeworCQlsb2FkaW5nTG9jayA9IFBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5uZXdMb2NrKCk7CisJCWlmIChsb2FkaW5nTG9jayAhPSBudWxsKQorCQkJbG9hZGluZ0xvY2suYWNxdWlyZSgpOworCX0KKworCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBjb20uaWJtLnd0cC5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlJlc291cmNlSXNMb2FkaW5nQWRhcHRlciN3YWl0Rm9yUmVzb3VyY2VUb0xvYWQoKQorCSAqLworCXB1YmxpYyB2b2lkIHdhaXRGb3JSZXNvdXJjZVRvTG9hZCgpIHsKKworCQlpZiAobG9hZGluZ0xvY2sgPT0gbnVsbCkKKwkJCXJldHVybjsKKworCQlib29sZWFuIGxvY2tBY3F1aXJlZCA9IGZhbHNlOworCQl0cnkgeworCQkJaWYgKGxvYWRpbmdMb2NrICE9IG51bGwpCisJCQkJaWYgKCEobG9ja0FjcXVpcmVkID0gbG9hZGluZ0xvY2suYWNxdWlyZShERUxBWSkpKQorCQkJCQlsb2dXYXJuaW5nKCk7CisJCX0KKwkJY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCS8vIGlnbm9yZSwganVzdCBjb250aW51ZQorCQl9CisJCWZpbmFsbHkgeworCQkJaWYgKGxvY2tBY3F1aXJlZCkKKwkJCQlsb2FkaW5nTG9jay5yZWxlYXNlKCk7CisJCX0KKworCX0KKworCisJLyoqCisJICogCisJICovCisJcHJpdmF0ZSB2b2lkIGxvZ1dhcm5pbmcoKSB7CisJCU5vdGlmaWVyIHRhcmdldCA9IGdldFRhcmdldCgpOworCQlpZiAodGFyZ2V0ID09IG51bGwgfHwgISh0YXJnZXQgaW5zdGFuY2VvZiBSZXNvdXJjZSkpIHsKKwkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSB0YXJnZXQ7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oIltXQVJOSU5HXSBDb3VsZCBub3QgYWNxdWlyZSBTZW1hcGhvcmUgTG9jayBmb3IgUmVzb3VyY2U6IFwiIiArIHJlc291cmNlLmdldFVSSSgpICsgIlwiIGluICIgKyBnZXRDbGFzcygpKTsKKwkJfQorCisJfQorCisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIGNvbS5pYm0ud3RwLmludGVybmFsLmVtZi51dGlsaXRpZXMuUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQorCSAqLworCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCisJCWlmIChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSAhPSBudWxsKSB7CisJCQkvLyBsaXN0ZW4gZm9yIHRoZSByZW1vdmUgb2YgdGhlIGxvYWRpbmcgYWRhcHRlcgorCQkJaWYgKGlzU2V0TG9hZGVkUmVzb3VyY2VOb3RpZmljYXRpb24obm90aWZpY2F0aW9uKSkgeworCQkJCWlmIChsb2FkaW5nTG9jayAhPSBudWxsKQorCQkJCQlsb2FkaW5nTG9jay5yZWxlYXNlKCk7CisJCQkJcmVtb3ZlSXNMb2FkaW5nU3VwcG9ydCgpOworCQkJfQorCQl9CisJfQorCisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIGNvbS5pYm0ud3RwLmludGVybmFsLmVtZi51dGlsaXRpZXMuUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyI2ZvcmNlUmVsZWFzZSgpCisJICovCisJcHVibGljIHZvaWQgZm9yY2VSZWxlYXNlKCkgeworCQlpZiAobG9hZGluZ0xvY2sgIT0gbnVsbCAmJiBsb2FkaW5nTG9jay5nZXREZXB0aCgpID4gMCkKKwkJCWxvYWRpbmdMb2NrLnJlbGVhc2UoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL1Jlc291cmNlU3luY2hyb25pemVkSXNMb2FkaW5nQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL1Jlc291cmNlU3luY2hyb25pemVkSXNMb2FkaW5nQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTkwZThhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvUmVzb3VyY2VTeW5jaHJvbml6ZWRJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIENyZWF0ZWQgb24gT2N0IDI2LCAyMDA0CisgKgorICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCisgKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5SZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlJlc291cmNlSXNMb2FkaW5nQWRhcHRlckZhY3Rvcnk7CisKKworLyoqCisgKiBAYXV0aG9yIG1kZWxkZXIKKyAqCisgKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bworICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZVN5bmNocm9uaXplZElzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeSB7CisKKyAgICAKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBjb20uaWJtLnd0cC5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlJlc291cmNlSXNMb2FkaW5nQWRhcHRlckZhY3RvcnkjY3JlYXRlUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyIGNyZWF0ZVJlc291cmNlSXNMb2FkaW5nQWRhcHRlcigpIHsgCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VTeW5jaHJvbml6ZWRJc0xvYWRpbmdBZGFwdGVyKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcGx1Z2luL0Vjb3JlVXRpbGl0aWVzUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9wbHVnaW4vRWNvcmVVdGlsaXRpZXNQbHVnaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzI0YzA1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcGx1Z2luL0Vjb3JlVXRpbGl0aWVzUGx1Z2luLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBDcmVhdGVkIG9uIEp1biA5LCAyMDAzCisgKgorICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bworICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5SZXNvdXJjZVN5bmNocm9uaXplZElzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKKworLyoqCisgKiBAYXV0aG9yIERBQkVSRworICogCisgKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQorICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cworICovCitwdWJsaWMgY2xhc3MgRWNvcmVVdGlsaXRpZXNQbHVnaW4gZXh0ZW5kcyBQbHVnaW4geworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TTEFUT1JfRVhURU5TVElPTl9QT0lOVCA9ICJ0cmFuc2xhdG9yRXh0ZW5zaW9uIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQHBhcmFtIGRlc2NyaXB0b3IKKwkgKi8KKwlwdWJsaWMgRWNvcmVVdGlsaXRpZXNQbHVnaW4oKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0YXJ0dXAoKQorCSAqLworCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnN0YXJ0KGNvbnRleHQpOworCQlSZW5kZXJlckZhY3Rvcnkuc2V0RGVmYXVsdEhhbmRsZXIoUGx1Z2luUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIuSU5TVEFOQ0UpOworCQlQYWNrYWdlVVJJTWFwUmVhZGVyIHJlYWRlciA9IG5ldyBQYWNrYWdlVVJJTWFwUmVhZGVyKCk7CisJCXJlYWRlci5wcm9jZXNzRXh0ZW5zaW9ucygpOworCQkvL3VzZSBhIHN5bmNocm9uaXplZCBsb2FkaW5nIGFkYXB0ZXIgZmFjdG9yeQorCQlSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFID0gbmV3IFJlc291cmNlU3luY2hyb25pemVkSXNMb2FkaW5nQWRhcHRlckZhY3RvcnkoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9wbHVnaW4vUGFja2FnZVVSSU1hcFJlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcGx1Z2luL1BhY2thZ2VVUklNYXBSZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWMzOWIwCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcGx1Z2luL1BhY2thZ2VVUklNYXBSZWFkZXIuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5wbHVnaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkNvbXBhdGliaWxpdHlQYWNrYWdlTWFwcGluZ1JlZ2lzdHJ5OworCisvKioKKyAqIFRoaXMgcmVhZGVyIHdpbGwgcmVhZCB0aGUgcGFja2FnZVVSSU1hcCBleHRlbnNpb24gcG9pbnQgYW5kIHBvcHVsYXRlIHRoZQorICogQ29tcGF0aWJpbGl0eVBhY2thZ2VNYXBwaW5nUmVnaXN0cnkuCisgKiAKKyAqIFRoZSBwYWNrYWdlVVJJTWFwIHdpbGwgaGF2ZSB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24gZWxlbWVudC4KKyAqIAorICogPG1hcCBwcmVmaXg9InNvbWVQYWNrYWdlUHJlZml4IiB1cmk9InNvbWVQYWNrYWdlVVJJIi8+CisgKiAgCisgKi8KK3B1YmxpYyBjbGFzcyBQYWNrYWdlVVJJTWFwUmVhZGVyIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX0FUVF9OQU1FID0gInVyaSI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0FUVF9OQU1FID0gInByZWZpeCI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX05BTUUgPSAicGFja2FnZVVSSU1hcCI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqICAKKwkgKi8KKwlwdWJsaWMgUGFja2FnZVVSSU1hcFJlYWRlcigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwcml2YXRlIElFeHRlbnNpb25Qb2ludCBnZXRFeHRlbnNpb25Qb2ludCgpIHsKKwkJcmV0dXJuIFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoRWNvcmVVdGlsaXRpZXNQbHVnaW4uSUQsIEVYVEVOU0lPTl9QT0lOVF9OQU1FKTsKKwl9CisKKwkvKioKKwkgKiBDYWxsIHRoaXMgbWV0aG9kIHRvIHJlYWQgYW5kIHByb2Nlc3MgYWxsIG9mIHRoZSBwYWNrYWdlVVJJTWFwIGV4dGVuc2lvbnMuICoKKwkgKi8KKwlwdWJsaWMgdm9pZCBwcm9jZXNzRXh0ZW5zaW9ucygpIHsKKwkJQ29tcGF0aWJpbGl0eVBhY2thZ2VNYXBwaW5nUmVnaXN0cnkgcmVnID0gQ29tcGF0aWJpbGl0eVBhY2thZ2VNYXBwaW5nUmVnaXN0cnkuSU5TVEFOQ0U7CisJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZ2V0RXh0ZW5zaW9uUG9pbnQoKS5nZXRFeHRlbnNpb25zKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykKKwkJCXByb2Nlc3NFeHRlbnNpb24oZXh0ZW5zaW9uc1tpXSwgcmVnKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gZXh0ZW5zaW9uCisJICovCisJcHJpdmF0ZSB2b2lkIHByb2Nlc3NFeHRlbnNpb24oSUV4dGVuc2lvbiBleHRlbnNpb24sIENvbXBhdGliaWxpdHlQYWNrYWdlTWFwcGluZ1JlZ2lzdHJ5IHJlZykgeworCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdzID0gZXh0ZW5zaW9uLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3MubGVuZ3RoOyBpKyspCisJCQlwcm9jZXNzQ29uZmlndXJhdGlvbihjb25maWdzW2ldLCByZWcpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBlbGVtZW50CisJICovCisJcHJpdmF0ZSB2b2lkIHByb2Nlc3NDb25maWd1cmF0aW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBDb21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeSByZWcpIHsKKwkJU3RyaW5nIHByZWZpeCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFBSRUZJWF9BVFRfTkFNRSk7CisJCVN0cmluZyB1cmkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShVUklfQVRUX05BTUUpOworCQlyZWcucmVnaXN0ZXJQcmVmaXhUb1BhY2thZ2VVUkkocHJlZml4LCB1cmkpOworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3BsdWdpbi9QbHVnaW5SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93b3JrYmVuY2gvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcGx1Z2luL1BsdWdpblJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU4MDc1NwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd29ya2JlbmNoL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3BsdWdpbi9QbHVnaW5SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQ3JlYXRlZCBvbiBEZWMgMSwgMjAwMworICoKKyAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KKyAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cworICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnBsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlVJQ29udGV4dERldGVybWluYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRU1GMkRPTVJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKKworLyoqCisgKiBAYXV0aG9yIHNjaGFjaGVyCisgKiAKKyAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bworICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCisgKi8KK3B1YmxpYyBjbGFzcyBQbHVnaW5SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlciBleHRlbmRzIEVNRjJET01SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlciB7CisKKwlzdGF0aWMgZmluYWwgUGx1Z2luUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIgSU5TVEFOQ0UgPSBuZXcgUGx1Z2luUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIoKTsKKwlzdGF0aWMgZmluYWwgU3RyaW5nIEVYVF9QT0lOVF9OQU1FID0gInJlbmRlcmVyRmFjdG9yeSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqICAKKwkgKi8KKwlwcm90ZWN0ZWQgUGx1Z2luUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIoKSB7CisKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuRU1GMkRPTVJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyI2dldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKQorCSAqLworCXB1YmxpYyBSZW5kZXJlckZhY3RvcnkgZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpIHsKKwkJUmVuZGVyZXJGYWN0b3J5IGFGYWN0b3J5ID0gKFJlbmRlcmVyRmFjdG9yeSkgVUlDb250ZXh0RGV0ZXJtaW5hdGlvbi5jcmVhdGVJbnN0YW5jZShFWFRfUE9JTlRfTkFNRSk7CisJCXJldHVybiBhRmFjdG9yeSA9PSBudWxsID8gc3VwZXIuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpIDogYUZhY3Rvcnk7CisJfQorCisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0Fic3RyYWN0UmVuZGVyZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9BYnN0cmFjdFJlbmRlcmVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZjgzYjcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9BYnN0cmFjdFJlbmRlcmVySW1wbC5qYXZhCkBAIC0wLDAgKzEsMTU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7CisKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVuZGVyZXJJbXBsIGltcGxlbWVudHMgUmVuZGVyZXIgeworCisKKwlwcm90ZWN0ZWQgVHJhbnNsYXRvclJlc291cmNlIHJlc291cmNlOworCXByaXZhdGUgaW50IHZlcnNpb25JZDsKKwlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGluZyA9IHRydWU7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvciBmb3IgQWJzdHJhY3RSZW5kZXJlckltcGwuCisJICovCisJcHVibGljIEFic3RyYWN0UmVuZGVyZXJJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNzZXRSZXNvdXJjZShUcmFuc2xhdG9yUmVzb3VyY2UpCisJICovCisJcHVibGljIHZvaWQgc2V0UmVzb3VyY2UoVHJhbnNsYXRvclJlc291cmNlIGFSZXNvdXJjZSkgeworCQlyZXNvdXJjZSA9IGFSZXNvdXJjZTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIjZ2V0UmVzb3VyY2UoKQorCSAqLworCXB1YmxpYyBUcmFuc2xhdG9yUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7CisJCXJldHVybiByZXNvdXJjZTsKKwl9CisKKwlwdWJsaWMgaW50IGdldFZlcnNpb25JZCgpIHsKKwkJcmV0dXJuIHRoaXMudmVyc2lvbklkOworCX0KKworCXB1YmxpYyB2b2lkIHNldFZlcnNpb25JZChpbnQgdmVyc2lvbklkKSB7CisJCXRoaXMudmVyc2lvbklkID0gdmVyc2lvbklkOworCX0KKworCS8qKgorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkYXRpbmcoKSB7CisJCXJldHVybiB2YWxpZGF0aW5nOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBiCisJICovCisJcHVibGljIHZvaWQgc2V0VmFsaWRhdGluZyhib29sZWFuIGIpIHsKKwkJdmFsaWRhdGluZyA9IGI7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI2FjY2Vzc0ZvclJlYWQoKQorCSAqLworCXB1YmxpYyB2b2lkIGFjY2Vzc0ZvclJlYWQoKSB7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI2FjY2Vzc0ZvcldyaXRlKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2Nlc3NGb3JXcml0ZSgpIHsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIjaXNNb2RpZmllZCgpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNNb2RpZmllZCgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNpc1NoYXJlZCgpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTaGFyZWQoKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIjaXNTaGFyZWRGb3JXcml0ZSgpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTaGFyZWRGb3JXcml0ZSgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNwcmVEZWxldGUoKQorCSAqLworCXB1YmxpYyB2b2lkIHByZURlbGV0ZSgpIHsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIjcHJlVW5sb2FkKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBwcmVVbmxvYWQoKSB7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI3JlbGVhc2VGcm9tUmVhZCgpCisJICovCisJcHVibGljIHZvaWQgcmVsZWFzZUZyb21SZWFkKCkgeworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNyZWxlYXNlRnJvbVdyaXRlKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCByZWxlYXNlRnJvbVdyaXRlKCkgeworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNzZXRCYXRjaE1vZGUoYm9vbGVhbikKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRCYXRjaE1vZGUoYm9vbGVhbiBpc0JhdGNoKSB7CisJfQorCisJcHVibGljIGJvb2xlYW4gdXNlU3RyZWFtc0ZvcklPKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0JhdGNoTW9kZSgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0F0dHJpYnV0ZVRyYW5zbGF0b3JGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0F0dHJpYnV0ZVRyYW5zbGF0b3JGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGQwODY5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQXR0cmlidXRlVHJhbnNsYXRvckZpbHRlci5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKKyAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBDcmVhdGVkIG9uIFNlcCAyMSwgMjAwMworICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOworCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBBdHRyaWJ1dGVUcmFuc2xhdG9yRmlsdGVyIGV4dGVuZHMgVHJhbnNsYXRvckZpbHRlciB7CisKKwlwdWJsaWMgQXR0cmlidXRlVHJhbnNsYXRvckZpbHRlcigpIHsKKwkJc3VwZXIobnVsbCwgLTEpOworCX0KKworCXB1YmxpYyBBdHRyaWJ1dGVUcmFuc2xhdG9yRmlsdGVyKFRyYW5zbGF0b3IgdHJhbnMsIGludCB2ZXJzaW9uKSB7CisJCXN1cGVyKHRyYW5zLCB2ZXJzaW9uKTsKKwl9CisKKwlwdWJsaWMgZmluYWwgaW50IHNjYW5OZXh0VHJhbnNsYXRvcihUcmFuc2xhdG9yW10gY2hpbGRyZW4sIGludCBzdGFydCkgeworCQlpbnQgZm91bmQgPSBzdGFydCArIDE7CisJCWZvciAoOyBmb3VuZCA8IGNoaWxkcmVuLmxlbmd0aDsgKytmb3VuZCkgeworCQkJaWYgKGNoaWxkcmVuW2ZvdW5kXS5pc0RPTUF0dHJpYnV0ZSgpKQorCQkJCWJyZWFrOworCQl9CisJCWZvdW5kID0gKGZvdW5kIDwgY2hpbGRyZW4ubGVuZ3RoKSA/IGZvdW5kIDogLTE7CisJCXJldHVybiBmb3VuZDsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ2FjaGVFdmVudE5vZGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NhY2hlRXZlbnROb2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU3NTgzMwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NhY2hlRXZlbnROb2RlLmphdmEKQEAgLTAsMCArMSw1ODUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKKworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CisKKworLyoqCisgKiBDYWNoZUV2ZW50Tm9kZXMgKENFTk9zKSBzdG9yZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgZnJvbSBTQVggRXZlbnRzLiBUaGlzIGluZm9ybWF0aW9uIGNhbiB0aGVuIGJlCisgKiB1c2VkIG9uY2UgYWxsIG5lY2Vzc2FyeSBTQVggRXZlbnRzIGhhdmUgYmVlbiBnZW5lcmF0ZWQgdG8gY3JlYXRlIGFuZC9vciBzZXQgdmFsdWVzIG9uIEVNRiBtb2RlbAorICogb2JqZWN0cy4KKyAqIAorICogQ2FjaGVFdmVudE5vZGVzIChDRU5PcykgaGF2ZSBhIHNpbXBsZSBsaWZlY3ljbGU6IGluaXRpYWxpemUsIGNvbGxlY3QgZGF0YSwgY29tbWl0LCBkaXNjYXJkLiBXaGVuCisgKiBpbml0aWFsaXplZCwgQ0VOT3Mgd2lsbCBhdHRlbXB0IHRvIGZpbmQgdGhlIGFwcHJvcHJpYXRlIHRyYW5zbGF0b3IgZm9yIGEgZ2l2ZW4gWE1MIGVsZW1lbnQgbmFtZSwKKyAqIGFuZCBhbHNvIGNyZWF0ZS9zZXQgYW55IG5lY2Vzc2FyeSBFTUYgbW9kZWwgdmFsdWVzLiBEYXRhIGlzIGNvbGxlY3RlZCBhcyBTQVggY2hhcmFjdGVyKCkgZXZlbnRzCisgKiBhcmUgZ2VuZXJhdGVkLiBPbiB0aGUgU0FYIGVuZEVsZW1lbnQgZXZlbnQsIHRoZSBDRU5PIGlzIGNvbW1pdHRlZCgpLCB3aGljaCBpcyB3aGVyZSBpdCB3aWxsCisgKiBjb21wbGV0ZSBpdHMgcHJvY2Vzc2luZyB0byBjcmVhdGUgRU1GIG1vZGVsIGZlYXR1cmVzLiBJbiB0aG9zZSBjYXNlcyB3aGVyZSBpdCBjYW5ub3QgY29tcGxldGUgaXRzCisgKiBwcm9jZXNzaW5nLCBpdCB3aWxsIGRlZmVyIGl0cyBwcm9jZXNzaW5nIHRvIHRoZSB1cGRhdGVFTUYoKSBtZXRob2Qgb2YgaXRzIHBhcmVudC4gRGVmZXJlZAorICogcHJvY2Vzc2luZyBpcyBuZWNlc3NhcnkgdG8gaGFuZGxlIEVNRiBmZWF0dXJlcyB0aGF0IHJlcXVpcmUgcmVhZCBhaGVhZCBjdWVzIGZyb20gdGhlIFhNTC4gQ0VOT3MKKyAqIHdpbGwgYWRkIHRoZW1zZWx2ZXMgdG8gdGhlaXIgcGFyZW50cyBhcyBjaGlsZHJlbiBpbiBhIHRyZWUgZGF0YSBzdHJ1Y3R1cmUuIFdoZW4gYW4gQ0VOTworICogZGV0ZXJtaW5lcyBpdCBpcyB0aGUgZ29sZGVuIHBpZWNlIG9mIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGluc3RhbnRpYXRlIGl0cyBwYXJlbnQgZmVhdHVyZSwgaXQKKyAqIHdpbGwgdHJpZ2dlciBpdHMgcGFyZW50IENFTk8gdG8gcHJvY2VzcyB0aGUgcmVzdCBvZiB0aGUgY2FjaGVkIENFTk8gdHJlZS4gQXMgbWVudGlvbmVkLCB0aGUKKyAqIGJ1aWxkaW5nIG9mIGEgQ0VOTyB0cmVlIHdpbGwgb25seSBvY2N1ciBmb3Igbm9kZXMgd2l0aCByZWFkIGFoZWFkIGN1ZXMuCisgKiAKKyAqIGRpc2NhcmQoKSBpcyBpbnZva2VkIGJ5IGluaXQoKSB0byBlbnN1cmUgdGhhdCBubyBqdW5rIHN0YXRlIGlzIGxlZnQgZnJvbSBhIHByZXZpb3VzIHVzZSBvZiB0aGUKKyAqIENFTk8uIGNvbW1pdCgpIHdpbGwgY2FsbCBkaXNjYXJkIGFzIG5lZWRlZC4gQmVjYXVzZSBvZiB0aGUgdXNlIG9mIGRpc2NhcmQsIENFTk9zIGNhbiBiZSBwb29sZWQKKyAqIGFuZCByZXVzZWQuIElmIGEgQ0VOTyBkZXRlcm1pbmVzIHRoYXQgaXQgaXMgY29udGFpbmVkIGluIGEgcG9vbCwgaXQgd2lsbCBtYW5hZ2UgaXRzIG93biByZWxlYXNlCisgKiBmcm9tIHRoYXQgcG9vbC4gU2VsZi0gbWFuYWdlbWVudCBpcyBuZWNlc3NhcnkgYmVjYXVzZSBvZiB0aGUgd2F5IGluIHdoaWNoIENFTk9zIG1pZ2h0IGNhY2hlCisgKiBjZXJ0YWluIGNoaWxkcmVuIHdoaWxlIHdhaXRpbmcgdG8gY3JlYXRlIHRoZSBwYXJlbnQgRU1GIGZlYXR1cmUuCisgKiAKKyAqIEBhdXRob3IgbWRlbGRlcgorICovCitwdWJsaWMgY2xhc3MgQ2FjaGVFdmVudE5vZGUgeworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVF9OT0RFID0gIkVNRl9ST09UX05PREUiOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIFN0cmluZyBub2RlTmFtZSA9IG51bGw7CisJcHJpdmF0ZSBUcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSBudWxsOworCXByaXZhdGUgTm90aWZpZXIgZW1mT3duZXIgPSBudWxsOworCXByaXZhdGUgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG51bGw7CisJcHJpdmF0ZSBMaXN0IGNoaWxkcmVuID0gbnVsbDsKKwlwcml2YXRlIGludCB2ZXJzaW9uSUQ7CisKKwkvKgorCSAqIFRoZSBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZSB1c2VkIHRvIHN0b3JlIHRoZSBhdHRyaWJ1dGVzIGlzIGEgU3RyaW5nW10uIFRoZSBjaG9pY2Ugd2FzIG1hZGUKKwkgKiB0byB1c2UgYW4gYXJyYXkgdG8gYXZvaWQgdGhlIGNyZWF0aW9uIG9mIGFub3RoZXIgb2JqZWN0IChwcm9iYWJseSBhIEhhc2h0YWJsZSkgYW5kIHRvIGV4cGxvaXQKKwkgKiBhcnJheS1hY2Nlc3MgdGltZXMgdG8gZ2V0IHRoZSBuYW1lIGFuZCB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlcyAob3Bwb3NlZCB0byBmdWxsIGZsZWRnZWQKKwkgKiBtZXRob2QgaW52b2NhdGlvbnMpLgorCSAqICAKKwkgKi8KKwlwcml2YXRlIFN0cmluZ1tdIGF0dHJpYnV0ZXMgPSBudWxsOworCXByaXZhdGUgQ2FjaGVFdmVudE5vZGUgcGFyZW50ID0gbnVsbDsKKwlwcml2YXRlIENhY2hlRXZlbnRQb29sIGNvbnRhaW5pbmdQb29sID0gbnVsbDsKKwlwcml2YXRlIEJvb2xlYW4gaWdub3JhYmxlID0gbnVsbDsKKworCXB1YmxpYyBDYWNoZUV2ZW50Tm9kZShDYWNoZUV2ZW50UG9vbCBjb250YWluaW5nUG9vbCkgeworCQl0aGlzLmNvbnRhaW5pbmdQb29sID0gY29udGFpbmluZ1Bvb2w7CisJfQorCisJLyoqCisJICogTGlmZWN5Y2xlIG1ldGhvZC4gaW5pdChUcmFuc2xhdG9yUmVzb3VyY2UpIHdpbGwgY29uZmlndXJlIHRoaXMgQWRhcHRlciBhcyBhIFJPT1Qgbm9kZS4KKwkgKiAKKwkgKiBUaGlzIG1ldGhvZCB3aWxsIGludm9rZSBkaXNjYXJkKCkgYmVmb3JlIGNvbXBsZXRpbmcgaXRzIHRhc2tzLgorCSAqLworCXB1YmxpYyB2b2lkIGluaXQoVHJhbnNsYXRvclJlc291cmNlIHJlc291cmNlKSB7CisJCXRoaXMuZGlzY2FyZCgpOworCQl0aGlzLnNldEVtZk93bmVyKHJlc291cmNlKTsKKwkJdGhpcy5zZXRUcmFuc2xhdG9yKHJlc291cmNlLmdldFJvb3RUcmFuc2xhdG9yKCkpOworCQl0aGlzLnNldFZlcnNpb25JRChyZXNvdXJjZS5nZXRWZXJzaW9uSUQoKSk7CisJCXRoaXMubm9kZU5hbWUgPSBDYWNoZUV2ZW50Tm9kZS5ST09UX05PREU7CisJfQorCisJLyoqCisJICogTGlmZWN5Y2xlIG1ldGhvZC4gaW5pdChDYWNoZUV2ZW50Tm9kZSwgU3RyaW5nLCBBdHRyaWJ1dGVzKSB3aWxsIGNvbmZpZ3VyZSB0aGlzIEFkYXB0ZXIgdG8gYmUKKwkgKiBhIG5vbi1ST09UIG5vZGUgb2YgdGhlIEFkYXB0ZXIgZGF0YSBzdHJ1Y3R1cmUKKwkgKiAKKwkgKiBUaGlzIG1ldGhvZCB3aWxsIGludm9rZSBkaXNjYXJkKCkgYmVmb3JlIGNvbXBsZXRpbmcgaXRzIHRhc2tzLgorCSAqLworCXB1YmxpYyB2b2lkIGluaXQoQ2FjaGVFdmVudE5vZGUgcGFyZW50QXJnLCBTdHJpbmcgbm9kZU5hbWVBcmcsIEF0dHJpYnV0ZXMgYXR0cmlidXRlc0FyZykgeworCQl0aGlzLmRpc2NhcmQoKTsKKwkJdGhpcy5ub2RlTmFtZSA9IG5vZGVOYW1lQXJnOworCQlpbml0KHBhcmVudEFyZywgYXR0cmlidXRlc0FyZyk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGluaXQoQ2FjaGVFdmVudE5vZGUgcGFyZW50UmVjb3JkLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXNBcmcpIHsKKwkJc2V0UGFyZW50KHBhcmVudFJlY29yZCk7CisKKwkJc2V0QXR0cmlidXRlcyhhdHRyaWJ1dGVzQXJnKTsKKwkJaWYgKHBhcmVudCAhPSBudWxsKSB7CisJCQkvKiBJIGFtIG5vdCB0aGUgcm9vdCAqLworCisJCQkvKgorCQkJICogSWYgdGhlIHBhcmVudCBpcyBwYXJ0IG9mIHRoZSBET00gUGF0aCwgdGhlbiB3ZSBpZ25vcmUgaXQgYW5kIGludGVyYWN0IHdpdGggdGhlIGdyYW5kCisJCQkgKiBwYXJlbnQKKwkJCSAqLworCQkJaWYgKHBhcmVudC50cmFuc2xhdG9yICE9IG51bGwgJiYgcGFyZW50LmlzSW5ET01QYXRoKCkpIHsKKwkJCQlzZXRQYXJlbnQocGFyZW50LmdldFBhcmVudCgpKTsKKwkJCX0KKworCQkJc2V0VmVyc2lvbklEKHBhcmVudC5nZXRWZXJzaW9uSUQoKSk7CisJCQlpZiAocGFyZW50LmdldEVtZk93bmVyKCkgIT0gbnVsbCAmJiBwYXJlbnQuZ2V0VHJhbnNsYXRvcigpICE9IG51bGwpIHsKKworCQkJCS8qIE15IHBhcmVudCBoYWQgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGNyZWF0ZSB0aGVtc2VsZiAqLworCisJCQkJaWYgKHBhcmVudC5nZXRQYXJlbnQoKSAhPSBudWxsKSB7CisJCQkJCXNldFRyYW5zbGF0b3IocGFyZW50LmdldFRyYW5zbGF0b3IoKS5maW5kQ2hpbGQobm9kZU5hbWUsIHBhcmVudC5nZXRFbWZPd25lcigpLCBnZXRWZXJzaW9uSUQoKSkpOworCisJCQkJfSBlbHNlIHsKKwkJCQkJc2V0VHJhbnNsYXRvcihwYXJlbnQuZ2V0VHJhbnNsYXRvcigpKTsKKwkJCQl9CisKKwkJCQlpZiAodGhpcy50cmFuc2xhdG9yID09IG51bGwpIHsKKwkJCQkJLyogT3VyIHRyYW5zbGF0b3IgaXMgbnVsbCEgQWhoISBSdW4hICovCisJCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlBhcmVudCBUcmFuc2xhdG9yICgiICsgcGFyZW50LmdldFRyYW5zbGF0b3IoKSArIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJIikgZGlkIG5vdCBmaW5kIGEgQ2hpbGQgVHJhbnNsYXRvciBmb3IgXCIiICsgLy8kTk9OLU5MUy0xJCAKKwkJCQkJCQkJbm9kZU5hbWUgKyAiXCIuIik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisKKwkJCQlpZiAodGhpcy50cmFuc2xhdG9yLmdldFJlYWRBaGVhZEhlbHBlcihub2RlTmFtZSkgPT0gbnVsbCAmJiAhdGhpcy50cmFuc2xhdG9yLmlzTWFuYWdlZEJ5UGFyZW50KCkpIHsKKwkJCQkJLyoKKwkJCQkJICogSSBkbyBub3QgcmVxdWlyZSBhIHJlYWQgYWhlYWQgY3VlLCBhbmQgSSBhbSBub3QgbWFuYWdlZCBieSBteSBwYXJlbnQgc28gSSBjYW4KKwkJCQkJICogY3JlYXRlIGFuIGluc3RhbmNlIG9mIG15IEVNRiBvYmplY3QKKwkJCQkJICovCisKKwkJCQkJTm90aWZpZXIgbXlFbWZPd25lciA9IHRoaXMudHJhbnNsYXRvci5jcmVhdGVFTUZPYmplY3QoZ2V0Tm9kZU5hbWUoKSwgbnVsbCk7CisJCQkJCXNldEVtZk93bmVyKG15RW1mT3duZXIpOworCQkJCQl0aGlzLnRyYW5zbGF0b3Iuc2V0TU9GVmFsdWUocGFyZW50LmdldEVtZk93bmVyKCksIG15RW1mT3duZXIpOworCQkJCX0KKwkJCQkvKgorCQkJCSAqIEVsc2UgSSByZXF1aXJlIGEgcmVhZCBhaGVhZCB2YWx1ZSBvciBJIGFtIGJlaW5nIG1hbmFnZWQgYnkgbXkgcGFyZW50LCBzbyBJIGhhdmUKKwkJCQkgKiBubyBuZWVkIHRvIGNyZWF0ZSBhbiBFTUYgb2JqZWN0CisJCQkJICovCisJCQl9CisJCQkvKgorCQkJICogRWxzZSBJIGFtIG5vdCBtYXBwZWQgdG8gdGhlIEVNRiBzdGFjayAoWE1MIEVsZW1lbnRzIGZvdW5kIGluIHRoZSBET01QYXRoIGFyZSBpZ25vcmVkKQorCQkJICovCisJCX0KKwkJLyogcHJvY2Vzc0F0dHJpYnV0ZXMgaXMgZ3VhcmRlZCBhbmQgd2lsbCBub3QgZXhlY3V0ZSB1bmxlc3MgcmVhZHkgKi8KKwkJcHJvY2Vzc0F0dHJpYnV0ZXMoKTsKKworCX0KKworCS8qKgorCSAqIGNvbW1pdCgpIGlzIGludm9rZWQgb25seSBpZiB0aGUgQ2FjaGVFdmVudE5vZGUgKENFTk8pIGhhcyBhbGwgdGhlIGluZm9ybWF0aW9uIHRoZXkgbmVlZCBhbmQKKwkgKiBzaG91bGQgYmUgYWJsZSB0byBkZXRlcm1pbmUgd2hhdCB0byBkbyB0byB0aGUgRU1GIGZlYXR1cmUuCisJICogCisJICogVGhlIGNvbW1pdCgpIG1ldGhvZCB3aWxsIGludm9rZSBkaXNjYXJkKCkgd2hlbiBpdCBoYXMgY29tcGxldGVkIGl0cyB0YXNrcywgaWYgbmVlZGVkLiBUaHVzLAorCSAqIGFmdGVyIGludm9raW5nIHRoaXMgbWV0aG9kLCB0aGUgQ0VOTyBtYXkgaGF2ZSBubyBtZWFuaW5nZnVsIHN0YXRlLiBJZiBkaXNjYXJkKCkgaXMgaW52b2tlZCwKKwkgKiBhbGwgcHJldmlvdXNseSBoZWxkIHJlZmVyZW5jZSB3aWxsIGJlIHJlbGVhc2VkIGluIG9yZGVyIHRvIGJlIG1hZGUgZWxpZ2libGUgZm9yIEdhcmJhZ2UKKwkgKiBDb2xsZWN0aW9uLgorCSAqICAKKwkgKi8KKwlwdWJsaWMgdm9pZCBjb21taXQoKSB7CisKKwkJaWYgKHBhcmVudCA9PSBudWxsIHx8IHRoaXMuaXNJZ25vcmFibGUoKSkgeworCQkJZGlzY2FyZCgpOworCQkJcmVsZWFzZUZyb21Db250YWluaW5nUG9vbCgpOworCQkJcmV0dXJuOworCQl9CisKKwkJUmVhZEFoZWFkSGVscGVyIGhlbHBlciA9IG51bGw7CisJCVRyYW5zbGF0b3IgYWN0aXZlVHJhbnNsYXRvciA9IGdldFRyYW5zbGF0b3IoKTsKKwkJVHJhbnNsYXRvciBwYXJlbnRUcmFuc2xhdG9yID0gZ2V0UGFyZW50KCkuZ2V0VHJhbnNsYXRvcigpOworCisJCWlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQuZ2V0RW1mT3duZXIoKSA9PSBudWxsKSB7CisKKwkJCS8qCisJCQkgKiBOb3QgZW5vdWdoIGluZm9ybWF0aW9uIHlldCwgYWRkIHRoZSBDYWNoZUV2ZW50Tm9kZSB0byB0aGUgRE9NIENhY2hlIHRyZWUKKwkJCSAqLworCisJCQlwYXJlbnQuYXBwZW5kVG9CdWZmZXIodGhpcyk7CisJCQlpZiAoKGhlbHBlciA9IGdldFBhcmVudCgpLmdldFJlYWRBaGVhZEhlbHBlcigpKSAhPSBudWxsKSB7CisJCQkJLyoKKwkJCQkgKiBJZiB0aGUgcGFyZW50UmVjb3JkJ3MgZW1mT3duZXIgaXMgbnVsbCwgdGhlbiBpdCBtdXN0IG5vdCBiZSBpbml0aWFsaXplZCB0aGVyZWZvcmUKKwkJCQkgKiBpdCBvciBvbmUgb2YgaXRzIGFuY2VzdG9ycyBtdXN0IHJlcXVpcmUgcmVhZCBhaGVhZCBjbHVlcworCQkJCSAqIAorCQkJCSAqIFRoZSBmb2xsb3dpbmcgaWYgc3RhdGVtZW50IGNoZWNrcyBpZiB0aGUgcGFyZW50IGlzIHRoZSBub2RlIHdhaXRpbmcgZm9yIGEKKwkJCQkgKiByZWFkQWhlYWQgY3VlCisJCQkJICovCisJCQkJRU9iamVjdCBwYXJlbnRPd25lciA9IG51bGw7CisJCQkJaWYgKGhlbHBlci5ub2RlVmFsdWVJc1JlYWRBaGVhZE5hbWUoZ2V0Tm9kZU5hbWUoKSkpIHsKKwkJCQkJLyogVGhlIHJlYWRBaGVhZE5hbWUgaXMgdGhlIHZhbHVlIG9mIHRoZSBxTmFtZSBjaGlsZCBub2RlICovCisKKwkJCQkJLyogV2UgaGF2ZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8gY3JlYXRlIHRoZSBFbWZPd25lciBpbiB0aGUgcGFyZW50ISAqLworCQkJCQlwYXJlbnRPd25lciA9IHBhcmVudFRyYW5zbGF0b3IuY3JlYXRlRU1GT2JqZWN0KGdldFBhcmVudCgpLmdldE5vZGVOYW1lKCksIGdldEJ1ZmZlcigpKTsKKworCQkJCQkvKgorCQkJCQkgKiBOb3cgd2UgbmVlZCB0byBwYXJzZSB0aGUgY2FjaGVkIERPTSB0cmVlIGFuZCB1cGRhdGUgdGhlIGVtZk93bmVyIG9mIHRoZQorCQkJCQkgKiBwYXJlbnQKKwkJCQkJICovCisJCQkJCWdldFBhcmVudCgpLnVwZGF0ZUVNRihwYXJlbnRPd25lcik7CisKKwkJCQl9IGVsc2UgaWYgKGhlbHBlci5ub2RlTmFtZUlzUmVhZEFoZWFkTmFtZShnZXROb2RlTmFtZSgpKSkgeworCQkJCQkvKiBUaGUgcmVhZEFoZWFkTmFtZSBpcyB0aGUgYWN0dWFsIG5hbWUgb2YgdGhlIGNoaWxkIG5vZGUgKHFOYW1lKSAqLworCisJCQkJCS8qIFdlIGhhdmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGNyZWF0ZSB0aGUgRW1mT3duZXIgaW4gdGhlIHBhcmVudCEgKi8KKwkJCQkJcGFyZW50T3duZXIgPSBwYXJlbnRUcmFuc2xhdG9yLmNyZWF0ZUVNRk9iamVjdChnZXRQYXJlbnQoKS5nZXROb2RlTmFtZSgpLCBnZXROb2RlTmFtZSgpKTsKKworCQkJCQkvKgorCQkJCQkgKiBOb3cgd2UgbmVlZCB0byBwYXJzZSB0aGUgY2FjaGVkIERPTSB0cmVlIGFuZCB1cGRhdGUgdGhlIGVtZk93bmVyIG9mIHRoZQorCQkJCQkgKiBwYXJlbnQKKwkJCQkJICovCisJCQkJCWdldFBhcmVudCgpLnVwZGF0ZUVNRihwYXJlbnRPd25lcik7CisJCQkJfQorCisJCQl9IC8qIEVsc2UgYW4gYW5jZXN0b3Igb2YgdGhlIHBhcmVudCBpcyB3YWl0aW5nICovCisKKwkJfSBlbHNlIHsKKwkJCWlmIChhY3RpdmVUcmFuc2xhdG9yICE9IG51bGwpIHsKKwkJCQlpZiAoYWN0aXZlVHJhbnNsYXRvci5pc01hbmFnZWRCeVBhcmVudCgpKSB7CisKKwkJCQkJT2JqZWN0IHZhbHVlID0gYWN0aXZlVHJhbnNsYXRvci5jb252ZXJ0U3RyaW5nVG9WYWx1ZShnZXROb2RlTmFtZSgpLCBudWxsLCBnZXRCdWZmZXIoKSwgZ2V0UGFyZW50KCkuZ2V0RW1mT3duZXIoKSk7CisJCQkJCWFjdGl2ZVRyYW5zbGF0b3Iuc2V0TU9GVmFsdWUoZ2V0UGFyZW50KCkuZ2V0RW1mT3duZXIoKSwgdmFsdWUpOworCQkJCQlwcm9jZXNzQXR0cmlidXRlcygpOworCQkJCX0gZWxzZSB7CisKKwkJCQkJYWN0aXZlVHJhbnNsYXRvci5zZXRUZXh0VmFsdWVJZk5lY2Vzc2FyeShnZXRCdWZmZXIoKSwgZ2V0RW1mT3duZXIoKSwgZ2V0VmVyc2lvbklEKCkpOworCQkJCX0KKworCQkJfQorCQkJZGlzY2FyZCgpOworCQkJcmVsZWFzZUZyb21Db250YWluaW5nUG9vbCgpOworCQl9CisJfQorCisJLyoqCisJICogSW5zdHJ1Y3QgdGhlIENhY2hlRXZlbnROb2RlIHRvIGRpc2NhcmQgYWxsIHJlZmVyZW5jZXMgdG8gbWFrZSBldmVyeXRoaW5nIGVsaWdpYmxlIGZvciBnYXJiYWdlCisJICogY29sbGVjdGlvbi4gVGhpcyBzaG91bGQgT05MWSBiZSBjYWxsZWQgYWZ0ZXIgY29tbWl0IGhhcyBzdWNjZWVkZWQuIEluIHRoZSBjYXNlIG9mIEVNRgorCSAqIGZlYXR1cmVzIHRoYXQgcmVxdWlyZSBhIHJlYWRBaGVhZE5hbWUsIHByb2Nlc3Mgbm90IGJlIGNvbXBsZXRlZCBpbiBjb21taXQoKSwgYnV0IHJhdGhlciB3aWxsCisJICogYmUgZGVmZXJlZCB0byB0aGUgdXBkYXRlRU1GKCkgbWV0aG9kLiBUaGlzIG1ldGhvZCB3YXMgbWFkZSBwcml2YXRlIHNwZWNpZmljYWxseSBiZWNhdXNlIGl0CisJICogY291bGQgZXJhc2UgYWxsIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGUgQ2FjaGVFdmVudE5vZGUgYmVmb3JlIGl0IGhhcyBiZWVuIHByb2Nlc3NlZC4KKwkgKiAgCisJICovCisJcHJpdmF0ZSB2b2lkIGRpc2NhcmQoKSB7CisJCXRyYW5zbGF0b3IgPSBudWxsOworCQllbWZPd25lciA9IG51bGw7CisJCWJ1ZmZlciA9IG51bGw7CisJCWlmIChjaGlsZHJlbiAhPSBudWxsKQorCQkJY2hpbGRyZW4uY2xlYXIoKTsKKwkJY2hpbGRyZW4gPSBudWxsOworCQlhdHRyaWJ1dGVzID0gbnVsbDsKKwkJcGFyZW50ID0gbnVsbDsKKwl9CisKKwlwcml2YXRlIHZvaWQgcmVsZWFzZUZyb21Db250YWluaW5nUG9vbCgpIHsKKwkJaWYgKGNvbnRhaW5pbmdQb29sICE9IG51bGwpCisJCQljb250YWluaW5nUG9vbC5yZWxlYXNlTm9kZSh0aGlzKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0lnbm9yYWJsZSgpIHsKKwkJaWYgKGlnbm9yYWJsZSA9PSBudWxsKSB7CisJCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOworCQkJaWYgKHRoaXMudHJhbnNsYXRvciAhPSBudWxsKSB7CisJCQkJaWYgKHRoaXMudHJhbnNsYXRvci5pc0VtcHR5Q29udGVudFNpZ25pZmljYW50KCkpIHsKKwkJCQkJcmVzdWx0ID0gZmFsc2U7CisJCQkJfSBlbHNlIHsKKwkJCQkJU3RyaW5nIGRvbVBhdGggPSB0aGlzLnRyYW5zbGF0b3IuZ2V0RE9NUGF0aCgpOworCQkJCQlyZXN1bHQgPSAoZG9tUGF0aCAhPSBudWxsKSA/IGRvbVBhdGguaW5kZXhPZih0aGlzLm5vZGVOYW1lKSA+PSAwIDogZmFsc2U7CisJCQkJfQorCQkJfQorCQkJaWdub3JhYmxlID0gcmVzdWx0ID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKKwkJfQorCQlyZXR1cm4gaWdub3JhYmxlLmJvb2xlYW5WYWx1ZSgpOworCX0KKworCS8qKgorCSAqIERldGVybWluZXMgaWYgYSBnaXZlbiBjaGlsZCBoYXMgYSB0cmFuc2xhdG9yLgorCSAqIAorCSAqIEBwYXJhbSBjaGlsZE5vZGVOYW1lCisJICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBYTUwgY2hpbGQgbm9kZQorCSAqIEByZXR1cm4gdHJ1ZSBvbmx5IGlmIHRoZSBjaGlsZE5vZGVOYW1lIGNhbiBiZSBpZ25vcmVkIChlLmcuIGl0IGlzIHBhcnQgb2YgdGhlIERPTSBQYXRoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQ2hpbGRJZ25vcmFibGUoU3RyaW5nIGNoaWxkTm9kZU5hbWUpIHsKKwkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKKworCQlUcmFuc2xhdG9yIGNoaWxkVHJhbnNsYXRvciA9IG51bGw7CisJCWlmICh0aGlzLmdldFRyYW5zbGF0b3IoKSAhPSBudWxsKSB7CisJCQljaGlsZFRyYW5zbGF0b3IgPSB0aGlzLmdldFRyYW5zbGF0b3IoKS5maW5kQ2hpbGQoY2hpbGROb2RlTmFtZSwgdGhpcy5nZXRFbWZPd25lcigpLCB0aGlzLmdldFZlcnNpb25JRCgpKTsKKworCQkJaWYgKGNoaWxkVHJhbnNsYXRvciAhPSBudWxsKSB7CisJCQkJaWYgKGNoaWxkVHJhbnNsYXRvci5pc0VtcHR5Q29udGVudFNpZ25pZmljYW50KCkpIHsKKwkJCQkJcmVzdWx0ID0gZmFsc2U7CisJCQkJfSBlbHNlIHsKKwkJCQkJU3RyaW5nIHRlbXAgPSBudWxsOworCQkJCQlyZXN1bHQgPSAoKHRlbXAgPSBjaGlsZFRyYW5zbGF0b3IuZ2V0RE9NUGF0aCgpKSAhPSBudWxsKSA/IHRlbXAuaW5kZXhPZihjaGlsZE5vZGVOYW1lKSA+PSAwIDogZmFsc2U7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0luRE9NUGF0aCgpIHsKKwkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKKworCQlpZiAodGhpcy5nZXRUcmFuc2xhdG9yKCkgIT0gbnVsbCkgeworCisJCQlyZXN1bHQgPSB0aGlzLmdldE5vZGVOYW1lKCkuZXF1YWxzKHRoaXMuZ2V0VHJhbnNsYXRvcigpLmdldERPTVBhdGgoKSk7CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCVN0cmluZ0J1ZmZlciBvdXRwdXQgPSBuZXcgU3RyaW5nQnVmZmVyKCJDYWNoZUV2ZW50Tm9kZVsiKTsvLyROT04tTkxTLTEkCisJCW91dHB1dC5hcHBlbmQoIm5vZGVOYW1lPSIpOy8vJE5PTi1OTFMtMSQKKwkJb3V0cHV0LmFwcGVuZChub2RlTmFtZSk7CisJCW91dHB1dC5hcHBlbmQoIjsgdHJhbnNsYXRvcj0iKTsvLyROT04tTkxTLTEkCisJCW91dHB1dC5hcHBlbmQodHJhbnNsYXRvcik7CisJCW91dHB1dC5hcHBlbmQoIjsgZW1mT3duZXI9Iik7Ly8kTk9OLU5MUy0xJAorCQl0cnkgeworCQkJb3V0cHV0LmFwcGVuZChlbWZPd25lcik7CisJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKwkJCW91dHB1dC5hcHBlbmQoIkNvdWxkIG5vdCByZW5kZXIgYXMgc3RyaW5nISIpOy8vJE5PTi1OTFMtMSQKKwkJfQorCQlvdXRwdXQuYXBwZW5kKCI7IGJ1ZmZlcj0iKTsvLyROT04tTkxTLTEkCisJCW91dHB1dC5hcHBlbmQodGhpcy5idWZmZXIpOworCQlvdXRwdXQuYXBwZW5kKCI7IGhhc0NoaWxkcmVuPSIpOy8vJE5PTi1OTFMtMSQKKwkJb3V0cHV0LmFwcGVuZCgoY2hpbGRyZW4gIT0gbnVsbCAmJiBjaGlsZHJlbi5zaXplKCkgPiAwKSk7CisJCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKKwkJCQlvdXRwdXQuYXBwZW5kKCJcblx0Y2hpbGRyZW4oIik7Ly8kTk9OLU5MUy0xJAorCQkJCW91dHB1dC5hcHBlbmQoaSk7CisJCQkJb3V0cHV0LmFwcGVuZCgiKTogIik7Ly8kTk9OLU5MUy0xJAorCQkJCW91dHB1dC5hcHBlbmQodGhpcy5jaGlsZHJlbi5nZXQoaSkpOworCQkJfQorCQl9CisJCW91dHB1dC5hcHBlbmQoIl0iKTsvLyROT04tTkxTLTEkCisJCXJldHVybiBvdXRwdXQudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiBVcGRhdGVzIHRoZSBFTUYgbW9kZWwgYnkgY3JlYXRpbmcgRU1GIEZlYXR1cmVzIGFzIG5lY2Vzc2FyeSBmcm9tIHRoZSBET00gVHJlZSBDYWNoZQorCSAqIAorCSAqIEBwYXJhbSBvd25lcgorCSAqLworCXB1YmxpYyB2b2lkIHVwZGF0ZUVNRihFT2JqZWN0IG93bmVyKSB7CisJCXRoaXMuc2V0RW1mT3duZXIob3duZXIpOworCQlpZiAodGhpcy5wYXJlbnQgIT0gbnVsbCkgeworCQkJdGhpcy50cmFuc2xhdG9yLnNldE1PRlZhbHVlKChFT2JqZWN0KSB0aGlzLnBhcmVudC5nZXRFbWZPd25lcigpLCBvd25lcik7CisJCQl0aGlzLnByb2Nlc3NBdHRyaWJ1dGVzKCk7CisJCX0KKworCQl0aGlzLnVwZGF0ZUVNRigpOworCX0KKworCS8qKgorCSAqIFRoZSB0cmFuc2xhdG9yIGFuZCB0aGUgb3duZXIgb2YgdGhlIHBhcmVudCBDRU5PIHBhc3NlZCB0byB0aGlzIG1ldGhvZCBzaG91bGQgYmUgbm9ubnVsbAorCSAqLworCXB1YmxpYyB2b2lkIHVwZGF0ZUVNRigpIHsKKwkJaWYgKHRoaXMuY2hpbGRyZW4gPT0gbnVsbCkKKwkJCXJldHVybjsKKworCQlDYWNoZUV2ZW50Tm9kZSBjaGlsZCA9IG51bGw7CisJCVRyYW5zbGF0b3IgY2hpbGRUcmFuc2xhdG9yID0gbnVsbDsKKwkJT2JqZWN0IHZhbHVlID0gbnVsbDsKKwkJaWYgKHRoaXMuZ2V0RW1mT3duZXIoKSAhPSBudWxsKSB7CisJCQlOb3RpZmllciBwYXJlbnRPd25lciA9IHRoaXMuZ2V0RW1mT3duZXIoKTsKKwkJCVRyYW5zbGF0b3IgcGFyZW50VHJhbnNsYXRvciA9IHRoaXMuZ2V0VHJhbnNsYXRvcigpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLnNpemUoKTsgaSsrKSB7CisKKwkJCQljaGlsZCA9IChDYWNoZUV2ZW50Tm9kZSkgdGhpcy5jaGlsZHJlbi5nZXQoaSk7IC8qIENyZWF0ZSB0aGUgRU1GIGZlYXR1cmUgKi8KKwkJCQlpZiAodGhpcy5pc0NoaWxkSWdub3JhYmxlKGNoaWxkLmdldE5vZGVOYW1lKCkpKSB7CisJCQkJCXRoaXMuYWRkQ2hpbGRyZW4oY2hpbGQuZ2V0Q2hpbGRyZW4oKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJY2hpbGRUcmFuc2xhdG9yID0gcGFyZW50VHJhbnNsYXRvci5maW5kQ2hpbGQoY2hpbGQuZ2V0Tm9kZU5hbWUoKSwgcGFyZW50T3duZXIsIGNoaWxkLmdldFZlcnNpb25JRCgpKTsKKwkJCQkJY2hpbGQuc2V0VHJhbnNsYXRvcihjaGlsZFRyYW5zbGF0b3IpOworCisJCQkJCXZhbHVlID0gY2hpbGRUcmFuc2xhdG9yLmNvbnZlcnRTdHJpbmdUb1ZhbHVlKGNoaWxkLmdldE5vZGVOYW1lKCksIG51bGwsIGNoaWxkLmdldEJ1ZmZlcigpLCBwYXJlbnRPd25lcik7CisJCQkJCWNoaWxkVHJhbnNsYXRvci5zZXRNT0ZWYWx1ZShwYXJlbnRPd25lciwgdmFsdWUpOworCisJCQkJCWlmIChjaGlsZFRyYW5zbGF0b3IuaXNPYmplY3RNYXAoKSkgeworCQkJCQkJY2hpbGQuc2V0RW1mT3duZXIoKE5vdGlmaWVyKSB2YWx1ZSk7CisJCQkJCQljaGlsZFRyYW5zbGF0b3Iuc2V0VGV4dFZhbHVlSWZOZWNlc3NhcnkoY2hpbGQuZ2V0QnVmZmVyKCksIGNoaWxkLmdldEVtZk93bmVyKCksIGdldFZlcnNpb25JRCgpKTsKKwkJCQkJfQorCisJCQkJCWNoaWxkLnByb2Nlc3NBdHRyaWJ1dGVzKCk7CisJCQkJCWNoaWxkLnVwZGF0ZUVNRigpOyAvKiB1cGRhdGUgdGhlIEVNRiBvZiB0aGUgY2hpbGQgKi8KKworCQkJCX0KKwkJCQljaGlsZC5kaXNjYXJkKCk7CisJCQkJY2hpbGQucmVsZWFzZUZyb21Db250YWluaW5nUG9vbCgpOworCQkJfQorCQkJdGhpcy5jaGlsZHJlbiA9IG51bGw7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRDaGlsZChDYWNoZUV2ZW50Tm9kZSBjaGlsZCkgeworCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSB7CisJCQl0aGlzLmNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOworCQl9CisJCWlmIChwYXJlbnQgIT0gbnVsbCAmJiB0aGlzLmlzSWdub3JhYmxlKCkpIHsKKwkJCXBhcmVudC5hZGRDaGlsZChjaGlsZCk7CisJCX0gZWxzZSB7CisJCQl0aGlzLmNoaWxkcmVuLmFkZChjaGlsZCk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZHJlbihMaXN0IGNoaWxkcmVuQXJnKSB7CisJCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKKwkJCXRoaXMuY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7CisJCX0KKwkJdGhpcy5jaGlsZHJlbi5hZGRBbGwoY2hpbGRyZW5BcmcpOworCX0KKworCXB1YmxpYyBib29sZWFuIHJlbW92ZUNoaWxkKENhY2hlRXZlbnROb2RlIGNoaWxkKSB7CisJCWlmICh0aGlzLmNoaWxkcmVuID09IG51bGwpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdGhpcy5jaGlsZHJlbi5yZW1vdmUoY2hpbGQpOworCX0KKworCXB1YmxpYyBMaXN0IGdldENoaWxkcmVuKCkgeworCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKKwl9CisKKwlwdWJsaWMgUmVhZEFoZWFkSGVscGVyIGdldFJlYWRBaGVhZEhlbHBlcigpIHsKKwkJaWYgKHRoaXMudHJhbnNsYXRvciAhPSBudWxsICYmIHRoaXMudHJhbnNsYXRvci5oYXNSZWFkQWhlYWROYW1lcygpKSB7CisJCQlyZXR1cm4gdHJhbnNsYXRvci5nZXRSZWFkQWhlYWRIZWxwZXIobm9kZU5hbWUpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCisJLyogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgYXR0cmlidXRlcyBmaWVsZCBmb3IgaW5mbyBvbiBob3cgaXQgaXMgc3RydWN0dXJlZCAqLworCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZXMoQXR0cmlidXRlcyBhdHRyKSB7CisKKwkJLyoKKwkJICogVGhlIGF0dHJpYnV0ZXMgcmV0dXJuZWQgZnJvbSB0aGUgcGFyc2VyIG1heSBiZSBzdG9yZWQgYnkgcmVmZXJlbmNlLCBzbyB3ZSBtdXN0IGNvcHkgdGhlbQorCQkgKiBvdmVyIHRvIGEgbG9jYWwgZGF0YSBzdG9yZQorCQkgKi8KKwkJaWYgKGF0dHIgIT0gbnVsbCAmJiBhdHRyLmdldExlbmd0aCgpID4gMCkgeworCisJCQlpZiAodGhpcy5hdHRyaWJ1dGVzID09IG51bGwpIHsKKwkJCQl0aGlzLmF0dHJpYnV0ZXMgPSBuZXcgU3RyaW5nW2F0dHIuZ2V0TGVuZ3RoKCkgKiAyXTsKKwkJCX0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0ci5nZXRMZW5ndGgoKTsgaSsrKSB7CisJCQkJdGhpcy5hdHRyaWJ1dGVzW2ldID0gYXR0ci5nZXRRTmFtZShpKTsKKwkJCQl0aGlzLmF0dHJpYnV0ZXNbaSArIGF0dHIuZ2V0TGVuZ3RoKCldID0gYXR0ci5nZXRWYWx1ZShpKTsKKwkJCX0KKworCQl9CisJfQorCisJLyoqCisJICogcHJvY2Vzc0F0dHJpYnV0ZXMgbWF5IGJlIGludm9rZWQgbXVsdGlwbGUgdGltZXMuIEl0IGlzIGNvbmZpZ3VyZWQgdG8gb25seSBjYXJyeSBvdXQgdGhlCisJICogcHJvY2Vzc2luZyBvbmUgdGltZS4gQWZ0ZXIgaXQgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlcyB0aGUgY29uc3RydWN0aW9uIG9mIFRyYW5zbGF0b3JzIGFuZAorCSAqIHZhbHVlcyBpdCB3aWxsIGRpc2NhcmQgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGVzIGZpZWxkIGJ5IHNldHRpbmcgaXQgdG8gbnVsbC4KKwkgKiAgCisJICovCisJcHVibGljIHZvaWQgcHJvY2Vzc0F0dHJpYnV0ZXMoKSB7CisJCS8qIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGF0dHJpYnV0ZXMgZmllbGQgZm9yIGluZm8gb24gaG93IGl0IGlzIHN0cnVjdHVyZWQgKi8KKwkJaWYgKHRoaXMuYXR0cmlidXRlcyAhPSBudWxsICYmIHRoaXMuYXR0cmlidXRlcy5sZW5ndGggPiAwKSB7CisKKwkJCWlmICh0aGlzLmVtZk93bmVyICE9IG51bGwgJiYgdGhpcy50cmFuc2xhdG9yICE9IG51bGwpIHsKKwkJCQlUcmFuc2xhdG9yIGF0dHJUcmFuc2xhdG9yID0gbnVsbDsKKwkJCQlmaW5hbCBpbnQgbGltaXQgPSB0aGlzLmF0dHJpYnV0ZXMubGVuZ3RoIC8gMjsKKwkJCQlPYmplY3QgdmFsdWUgPSBudWxsOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGltaXQ7IGkrKykgeworCisJCQkJCS8qIEZpbmQgdGhlIGF0dHJpYnV0ZSB0cmFuc2xhdG9yIGJ5IHVzaW5nIHRoZSBhdHRyaWJ1dGUgbmFtZSAoYXR0cmlidXRlc1tpXSkgKi8KKwkJCQkJYXR0clRyYW5zbGF0b3IgPSB0aGlzLnRyYW5zbGF0b3IuZmluZENoaWxkKHRoaXMuYXR0cmlidXRlc1tpXSwgdGhpcy5lbWZPd25lciwgdGhpcy52ZXJzaW9uSUQpOworCisJCQkJCWlmIChhdHRyVHJhbnNsYXRvciAhPSBudWxsKSB7CisKKwkJCQkJCS8qCisJCQkJCQkgKiBDb252ZXJ0IHRoZSB2YWx1ZSBvZiBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSB2YWx1ZSAoYXR0cmlidXRlc1tpK2xpbWl0XSkKKwkJCQkJCSAqIHRvIGEgbWVhbmluZ2Z1bCB2YWx1ZQorCQkJCQkJICovCisJCQkJCQl2YWx1ZSA9IGF0dHJUcmFuc2xhdG9yLmNvbnZlcnRTdHJpbmdUb1ZhbHVlKHRoaXMuYXR0cmlidXRlc1tpICsgbGltaXRdLCAoRU9iamVjdCkgdGhpcy5lbWZPd25lcik7CisJCQkJCQlhdHRyVHJhbnNsYXRvci5zZXRNT0ZWYWx1ZSgoRU9iamVjdCkgdGhpcy5lbWZPd25lciwgdmFsdWUpOworCQkJCQl9CisJCQkJfQorCisJCQkJLyogRm9yZ2V0IHRoZSBhdHRyaWJ1dGVzIHNvIHdlIGRvIG5vdCBwcm9jZXNzIHRoZW0gYWdhaW4gKi8KKwkJCQl0aGlzLmF0dHJpYnV0ZXMgPSBudWxsOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogQXBwZW5kcyBkYXRhIHRvIHRoZSBidWZmZXIgc3RvcmVkIGJ5IHRoaXMgQ0VOTy4gVGV4dCB3aWxsIGJlIGV4dHJhY3RlZCBmcm9tIHRoZSBkYXRhIGFycmF5CisJICogYmVnaW5pbmcgYXQgcG9zaXRpb25nIDxpPnN0YXJ0IDwvaT4gYW5kIGVuZGluZyBhdCBwb3NpdGlvbiA8aT5zdGFydCtsZW5ndGggPC9pPi4KKwkgKiAKKwkgKiBAcGFyYW0gZGF0YQorCSAqIEBwYXJhbSBzdGFydAorCSAqIEBwYXJhbSBsZW5ndGgKKwkgKi8KKwlwdWJsaWMgdm9pZCBhcHBlbmRUb0J1ZmZlcihjaGFyW10gZGF0YSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7CisKKwkJaWYgKHBhcmVudCAhPSBudWxsICYmIHRoaXMuaXNJZ25vcmFibGUoKSkgeworCQkJcGFyZW50LmFwcGVuZFRvQnVmZmVyKGRhdGEsIHN0YXJ0LCBsZW5ndGgpOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKGJ1ZmZlciA9PSBudWxsKSB7CisJCQl0aGlzLmJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJfQorCisJCS8qCisJCSAqIGFjdHMgYXMgYSBtb3JlIGVmZmljaWVudCBmb3JtIG9mICJhcHBlbmQiLiBVc2luZyB0aGlzIG1ldGhvZCBhdm9pZHMgdGhlIG5lZWQgdG8gY29weSB0aGUKKwkJICogZGF0YSBpbnRvIGl0cyBvd24gZGF0YSBzdHJ1Y3R1cmUgKGUuZy4gU3RyaW5nKSBiZWZvcmUgYmVpbmcgYWRkZWQgdG8gdGhlIGJ1ZmZlcgorCQkgKi8KKwkJdGhpcy5idWZmZXIuaW5zZXJ0KGJ1ZmZlci5sZW5ndGgoKSwgZGF0YSwgc3RhcnQsIGxlbmd0aCk7CisKKwl9CisKKwkvKioKKwkgKiBBZGQgdGhlIGdpdmVuIENFTk8gYXMgYSBjaGlsZCBvZiB0aGlzIENFTk8uCisJICogCisJICogQHBhcmFtIHJlY29yZAorCSAqLworCXB1YmxpYyB2b2lkIGFwcGVuZFRvQnVmZmVyKENhY2hlRXZlbnROb2RlIHJlY29yZCkgeworCisJCXRoaXMuYWRkQ2hpbGQocmVjb3JkKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEJ1ZmZlcigpIHsKKwkJaWYgKHRoaXMuYnVmZmVyID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiB0aGlzLmJ1ZmZlci50b1N0cmluZygpOworCX0KKworCXB1YmxpYyBOb3RpZmllciBnZXRFbWZPd25lcigpIHsKKwkJcmV0dXJuIGVtZk93bmVyOworCX0KKworCXB1YmxpYyBDYWNoZUV2ZW50Tm9kZSBnZXRQYXJlbnQoKSB7CisJCXJldHVybiBwYXJlbnQ7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNldFBhcmVudChDYWNoZUV2ZW50Tm9kZSByZWNvcmQpIHsKKwkJdGhpcy5wYXJlbnQgPSByZWNvcmQ7CisJfQorCisJcHVibGljIFRyYW5zbGF0b3IgZ2V0VHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIHRoaXMudHJhbnNsYXRvcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRFbWZPd25lcihOb3RpZmllciBub3RpZmllcikgeworCisJCXRoaXMuZW1mT3duZXIgPSBub3RpZmllcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUcmFuc2xhdG9yKFRyYW5zbGF0b3IgdHJhbnNsYXRvcikgeworCQl0aGlzLnRyYW5zbGF0b3IgPSB0cmFuc2xhdG9yOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7CisJCXJldHVybiBub2RlTmFtZTsKKwl9CisKKwlwdWJsaWMgaW50IGdldFZlcnNpb25JRCgpIHsKKworCQlpZiAodGhpcy5wYXJlbnQgPT0gbnVsbCkgeworCQkJdHJ5IHsKKwkJCQlyZXR1cm4gKChUcmFuc2xhdG9yUmVzb3VyY2UpIHRoaXMuZ2V0RW1mT3duZXIoKSkuZ2V0VmVyc2lvbklEKCk7CisKKwkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdGhpcy52ZXJzaW9uSUQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmVyc2lvbklEKGludCBpKSB7CisJCXZlcnNpb25JRCA9IGk7CisJfQorCisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9DYWNoZUV2ZW50UG9vbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ2FjaGVFdmVudFBvb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTc5OWUyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ2FjaGVFdmVudFBvb2wuamF2YQpAQCAtMCwwICsxLDE0OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOworCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKKworLyoqCisgKiBQcm92aWRlcyBhbiBpbnN0YW5jZSBwb29sIG9mIHJldXNhYmxlIENhY2hlRXZlbnROb2Rlcy4gVGhlIHBvb2wgd2lsbCBkZWZhdWx0IHRvIDEwIGxpdmUKKyAqIGluc3RhbmNlcy4gV2hlbiBpdHMgYXZhaWxhYmxlIGluc3RhbmNlcyByZWFjaCBmaXZlIHRpbWVzIGl0cyBpbml0aWFsIGNhcGFjaXR5LCBpdCB3aWxsIHNocmluaworICogaXRzZWxmIGRvd24gdG8gdGhlIGluaXRpYWwgY2FwYWNpdHkuCisgKiAKKyAqIEBhdXRob3IgbWRlbGRlcgorICovCitwdWJsaWMgY2xhc3MgQ2FjaGVFdmVudFBvb2wgeworCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9DQVBBQ0lUWSA9IDEwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQ0FQQUNJVFlfSU5DUkVNRU5UID0gMjU7CisKKwlwcml2YXRlIGludCBwb29sQ2FwYWNpdHkgPSBERUZBVUxUX0NBUEFDSVRZOworCXByaXZhdGUgQ2FjaGVFdmVudFN0YWNrIGF2YWlsYWJsZVBvb2wgPSBudWxsOworCXByaXZhdGUgQ29sbGVjdGlvbiBpbnVzZVBvb2wgPSBudWxsOworCisJcHVibGljIENhY2hlRXZlbnRQb29sKCkgeworCQl0aGlzKERFRkFVTFRfQ0FQQUNJVFkpOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhIENhY2hlRXZlbnRQT29sIHdpdGggdGhlIGdpdmVuIGluaXRpYWwgY2FwYWNpdHkKKwkgKiAKKwkgKiBAcGFyYW0gaW5pdGlhbENhcGFjaXR5CisJICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBpbnN0YW5jZXMgdG8gY3JlYXRlLgorCSAqLworCXB1YmxpYyBDYWNoZUV2ZW50UG9vbChpbnQgaW5pdGlhbENhcGFjaXR5KSB7CisJCXBvb2xDYXBhY2l0eSA9IChpbml0aWFsQ2FwYWNpdHkgPiAwKSA/IGluaXRpYWxDYXBhY2l0eSA6IERFRkFVTFRfQ0FQQUNJVFk7CisJCWF2YWlsYWJsZVBvb2wgPSBuZXcgQ2FjaGVFdmVudFN0YWNrKCk7CisJCWludXNlUG9vbCA9IG5ldyBBcnJheUxpc3QocG9vbENhcGFjaXR5KTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSBDYWNoZUV2ZW50Tm9kZSAoQ0VOTykgaW5pdGlhbGl6ZWQgdG8gdXNlIHRoZSBnaXZlbiByZXNvdXJjZSBhcyBpdHMgRU1GIE93bmVyLgorCSAqIAorCSAqIFRISVMgTUVUSE9EIFNIT1VMRCBPTkxZIEJFIFVTRUQgVE8gQ1JFQVRFIFJPT1QgTk9ERVMuCisJICogCisJICogQHBhcmFtIHJlc291cmNlCisJICogICAgICAgICAgICB0aGUgcmVzb3VyY2UgdGhhdCB3aWxsIGJlIHBvcHVsYXRlZAorCSAqIEByZXR1cm4gYSBDYWNoZUV2ZW50Tm9kZSB0byBzZXJ2ZSBhcyB0aGUgcm9vdC4KKwkgKi8KKwlwdWJsaWMgQ2FjaGVFdmVudE5vZGUgY3JlYXRlQ2FjaGVFdmVudE5vZGUoVHJhbnNsYXRvclJlc291cmNlIHJlc291cmNlKSB7CisJCUNhY2hlRXZlbnROb2RlIGFkYXB0ZXIgPSBmZXRjaEZyZWVOb2RlKCk7CisJCWFkYXB0ZXIuaW5pdChyZXNvdXJjZSk7CisJCXJldHVybiBhZGFwdGVyOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBjaGlsZCBDYWNoZUV2ZW50Tm9kZXMgKENFTk9zKSB0aGF0IHdpbGwgYnJhbmNoIGZyb20gdGhlIGdpdmVuIHBhcmVudC4KKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50CisJICogICAgICAgICAgICB0aGUgY29udGFpbmluZyBDRU5PCisJICogQHBhcmFtIG5vZGVOYW1lCisJICogICAgICAgICAgICBUaGUgdmFsdWUgb2YgdGhlIFhNTCBlbGVtZW50IG5vZGUgbmFtZQorCSAqIEBwYXJhbSBhdHRyaWJ1dGVzCisJICogICAgICAgICAgICBUaGUgYXR0cmlidXRlcyB0aGF0IHdlcmUgcGFydCBvZiB0aGUgZ2l2ZW4gWE1MIGVsZW1lbnQKKwkgKiBAcmV0dXJuIEEgQ0VOTyB0aGF0IGhhcyBiZWVuIHByb3Blcmx5IGluaXRpYWxpemVkLgorCSAqLworCXB1YmxpYyBDYWNoZUV2ZW50Tm9kZSBjcmVhdGVDYWNoZUV2ZW50Tm9kZShDYWNoZUV2ZW50Tm9kZSBwYXJlbnQsIFN0cmluZyBub2RlTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7CisJCUNhY2hlRXZlbnROb2RlIGFkYXB0ZXIgPSBmZXRjaEZyZWVOb2RlKCk7CisJCWFkYXB0ZXIuaW5pdChwYXJlbnQsIG5vZGVOYW1lLCBhdHRyaWJ1dGVzKTsKKwkJcmV0dXJuIGFkYXB0ZXI7CisJfQorCisJLyoqCisJICogUmVsZWFzZSB0aGUgQ2FjaGVFdmVudE5vZGUgQ0VOTyBiYWNrIHRvIHRoZSBwb29sIG9mIGF2YWlsYWJlIGluc3RhbmNlcy4gVGhpcyBtZXRob2Qgc2hvdWxkCisJICogbm90IGJlIGludm9rZWQgZGlyZWN0bHkuIENFTk9zIHdoaWNoIGFyZSBhY3F1aXJlZCBmcm9tIGEgZ2l2ZW4gcG9vbCB3aWxsIGF1dG9tYXRpY2FsbHkKKwkgKiByZWxlYXNlIHRoZW1zZWx2ZXMgd2hlbiBuZWNlc3NhcnkuCisJICogCisJICogQHBhcmFtIGFkYXB0ZXIKKwkgKi8KKwlwdWJsaWMgdm9pZCByZWxlYXNlTm9kZShDYWNoZUV2ZW50Tm9kZSBhZGFwdGVyKSB7CisJCWZyZWVOb2RlKGFkYXB0ZXIpOworCX0KKworCS8qKgorCSAqIGZyZWV6ZVBvb2woKSBzaG91bGQgYmUgaW52b2tlZCB0byBmcmVlIGFueSB1bnVzZWQgcmVzb3VyY2VzLiBBZnRlciBmcmVlemVQb29sIGhhcyBiZWVuCisJICogaW52b2tlZCwgd2FybVBvb2woKSB3aWxsIG5lZWQgdG8gYmUgaW52b2tlZCBiZWZvcmUgdGhlIHBvb2wgY2FuIGJlIHVzZWQgYWdhaW4uCisJICogIAorCSAqLworCXB1YmxpYyB2b2lkIGZyZWV6ZVBvb2woKSB7CisJCWF2YWlsYWJsZVBvb2wuY2xlYXIoKTsKKwkJYXZhaWxhYmxlUG9vbCA9IG51bGw7CisJfQorCisJLyoqCisJICogd2FybVBvb2woKSBtdXN0IGJlIGludm9rZWQgdG8gbm90aWZ5IHRoZSBwb29sIGl0IGlzIGFib3V0IHRvIGJlIHVzZWQuIFRoaXMgc2hvdWxkIG9jY3VyIG9ubHkKKwkgKiBvbmNlIHBlciBkb2N1bWVudCByZW5kZXJpbmcuIFVudGlsIHRoZSBwb29sIGlzIGluIHVzZSwgaXQgY29udGFpbnMgbm8gYXZhaWxhYmxlCisJICogQ2FjaGVFdmVudE5vZGVzIChDRU5PcykgaW4gb3JkZXIgdG8gbGltaXQgdGhlIHNpemUgb2YgdGhlIGluLW1lbW9yeSBmb290cHJpbnQgb2YgdGhlCisJICogRU1GMlNBWFdyaXRlci4KKwkgKiAgCisJICovCisJcHVibGljIHZvaWQgd2FybVBvb2woKSB7CisJCWVuc3VyZU1pbmltdW1DYXBhY2l0eSgpOworCX0KKworCXByaXZhdGUgQ2FjaGVFdmVudE5vZGUgZmV0Y2hGcmVlTm9kZSgpIHsKKwkJQ2FjaGVFdmVudE5vZGUgcmVzdWx0ID0gbnVsbDsKKworCQlpZiAoYXZhaWxhYmxlUG9vbCA9PSBudWxsIHx8IGF2YWlsYWJsZVBvb2wuaXNFbXB0eSgpKQorCQkJd2FybVBvb2woKTsKKworCQlyZXN1bHQgPSBhdmFpbGFibGVQb29sLnBvcCgpOworCQlpbnVzZVBvb2wuYWRkKHJlc3VsdCk7CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcml2YXRlIHZvaWQgZnJlZU5vZGUoQ2FjaGVFdmVudE5vZGUgYWRhcHRlcikgeworCQlpZiAoaW51c2VQb29sLnJlbW92ZShhZGFwdGVyKSkKKwkJCWF2YWlsYWJsZVBvb2wucHVzaChhZGFwdGVyKTsKKwkJLy9lbHNlCisJCS8vCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkFkYXB0ZXIgbm90IGNvbnRhaW5lZCBpbiBwb29sISIpOworCQlpZiAoYXZhaWxhYmxlUG9vbC5zaXplKCkgPiAoNSAqIHBvb2xDYXBhY2l0eSkpIHsKKwkJCWF2YWlsYWJsZVBvb2wuY2xlYXIoKTsKKwkJCWVuc3VyZU1pbmltdW1DYXBhY2l0eSgpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGVuc3VyZU1pbmltdW1DYXBhY2l0eSgpIHsKKwkJaWYgKGF2YWlsYWJsZVBvb2wgPT0gbnVsbCkgeworCQkJYXZhaWxhYmxlUG9vbCA9IG5ldyBDYWNoZUV2ZW50U3RhY2soKTsKKwkJfQorCQlpZiAoYXZhaWxhYmxlUG9vbC5zaXplKCkgPCBwb29sQ2FwYWNpdHkpIHsKKwkJCWZpbmFsIGludCBtaW5pbXVtQ2FwYWNpdHkgPSBwb29sQ2FwYWNpdHkgLSBhdmFpbGFibGVQb29sLnNpemUoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWluaW11bUNhcGFjaXR5OyBpKyspCisJCQkJYXZhaWxhYmxlUG9vbC5wdXNoKG5ldyBDYWNoZUV2ZW50Tm9kZSh0aGlzKSk7CisJCX0KKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9DYWNoZUV2ZW50U3RhY2suamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NhY2hlRXZlbnRTdGFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZjQxOTgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9DYWNoZUV2ZW50U3RhY2suamF2YQpAQCAtMCwwICsxLDU5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBDcmVhdGVkIG9uIFNlcCAyNCwgMjAwMworICoKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkVtcHR5U3RhY2tFeGNlcHRpb247CisKKy8qKgorICogQW4gdW5zeW5jaHJvbml6ZWQgaW1wbGVtZW50YXRpb24gb2YgYSBTdGFjayAoTElGTykgZGF0YSBzdHJ1Y3R1cmUuIE5vIGNhc3RpbmcgaXMgcmVxdWlyZWQgd2hlbgorICogdXNpbmcgdGhpcyBkYXRhIHN0cnVjdHVyZS4KKyAqIAorICogQGF1dGhvciBtZGVsZGVyCisgKi8KK3B1YmxpYyBjbGFzcyBDYWNoZUV2ZW50U3RhY2sgZXh0ZW5kcyBBcnJheUxpc3QgeworCisJLyoqCisJICogCisJICogQHJldHVybiB0aGUgdG9wIG9mIHRoZSBzdGFjayB3aXRob3V0IHJlbW92aW5nIGl0CisJICovCisJcHVibGljIENhY2hlRXZlbnROb2RlIHBlZWsoKSB7CisJCWlmIChzaXplKCkgPT0gMCkKKwkJCXRocm93IG5ldyBFbXB0eVN0YWNrRXhjZXB0aW9uKCk7CisKKwkJcmV0dXJuIChDYWNoZUV2ZW50Tm9kZSkgZ2V0KHNpemUoKSAtIDEpOworCX0KKworCS8qKgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHRvcCBvZiB0aGUgc3RhY2sgYW5kIHJlbW92aW5nIGl0CisJICovCisJcHVibGljIENhY2hlRXZlbnROb2RlIHBvcCgpIHsKKwkJaWYgKHNpemUoKSA9PSAwKQorCQkJdGhyb3cgbmV3IEVtcHR5U3RhY2tFeGNlcHRpb24oKTsKKworCQlyZXR1cm4gKENhY2hlRXZlbnROb2RlKSByZW1vdmUoc2l6ZSgpIC0gMSk7CisJfQorCisJLyoqCisJICogCisJICogQHBhcmFtIGFkYXB0ZXIKKwkgKiAgICAgICAgICAgIEEgQ0VOTyB0byBwdXNoIG9udG8gdGhlIHRvcCBvZiB0aGUgc3RhY2sKKwkgKi8KKwlwdWJsaWMgdm9pZCBwdXNoKENhY2hlRXZlbnROb2RlIGFkYXB0ZXIpIHsKKwkJYWRkKGFkYXB0ZXIpOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlQYWNrYWdlTWFwcGluZ1JlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MzY3YzgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeS5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHJlZ2lzdGVyIG1hcHBpbmdzIGZvciBhIHBhY2thZ2UgcHJlZml4IHRvIGl0cyBjdXJyZW50IG5hbWVzcGFjZSBVUkkuIEFsc28sCisgKiB0aGlzIHJlZ2lzdHJ5IGlzIHVzZWQgdG8gbWFwIHRoZSBwYWNrYWdlCisgKi8KK3B1YmxpYyBjbGFzcyBDb21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeSB7CisJcHVibGljIHN0YXRpYyBDb21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeSBJTlNUQU5DRSA9IG5ldyBDb21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeSgpOworCXByaXZhdGUgTWFwIHByZWZpeFRvUGFja2FnZVVSSXMgPSBuZXcgSGFzaE1hcCgpOworCXByaXZhdGUgTWFwIHBhY2thZ2VVUklzVG9QcmVmaXhlcyA9IG5ldyBIYXNoTWFwKCk7CisKKwkvKioKKwkgKiAgCisJICovCisJcHJpdmF0ZSBDb21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeSgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIE1hcCBnZXRQYWNrYWdlVVJJc1RvUHJlZml4ZXMoKSB7CisJCXJldHVybiBwYWNrYWdlVVJJc1RvUHJlZml4ZXM7CisJfQorCisJLyoqCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBNYXAgZ2V0UHJlZml4VG9QYWNrYWdlVVJJcygpIHsKKwkJcmV0dXJuIHByZWZpeFRvUGFja2FnZVVSSXM7CisJfQorCisJcHVibGljIHZvaWQgcmVnaXN0ZXJQcmVmaXhUb1BhY2thZ2VVUkkoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkgeworCQlpZiAocHJlZml4ICE9IG51bGwgJiYgdXJpICE9IG51bGwpIHsKKwkJCXByZWZpeFRvUGFja2FnZVVSSXMucHV0KHByZWZpeCwgdXJpKTsKKwkJCXBhY2thZ2VVUklzVG9QcmVmaXhlcy5wdXQodXJpLCBwcmVmaXgpOworCQl9CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVJlc291cmNlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVJlc291cmNlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MjRkZTMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5UmVzb3VyY2VGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQ3JlYXRlZCBvbiBBcHIgMjMsIDIwMDMKKyAqCisgKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCisgKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VGYWN0b3J5SW1wbDsKKworLyoqCisgKiBAYXV0aG9yIERBQkVSRworICogCisgKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQorICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cworICovCitwdWJsaWMgY2xhc3MgQ29tcGF0aWJpbGl0eVJlc291cmNlRmFjdG9yeSBleHRlbmRzIFhNSVJlc291cmNlRmFjdG9yeUltcGwgeworCS8qKgorCSAqICAKKwkgKi8KKwlwdWJsaWMgQ29tcGF0aWJpbGl0eVJlc291cmNlRmFjdG9yeSgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwcm90ZWN0ZWQgTWFwIHByZWZpeFRvUGFja2FnZVVSSXM7CisKKwlwcm90ZWN0ZWQgTWFwIHBhY2thZ2VVUklzVG9QcmVmaXhlczsKKworCXB1YmxpYyBNYXAgZ2V0UHJlZml4VG9QYWNrYWdlVVJJKCkgeworCQlyZXR1cm4gQ29tcGF0aWJpbGl0eVBhY2thZ2VNYXBwaW5nUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0UHJlZml4VG9QYWNrYWdlVVJJcygpOworCX0KKworCXB1YmxpYyBNYXAgZ2V0UGFja2FnZVVSSXNUb1ByZWZpeGVzKCkgeworCQlyZXR1cm4gQ29tcGF0aWJpbGl0eVBhY2thZ2VNYXBwaW5nUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0UGFja2FnZVVSSXNUb1ByZWZpeGVzKCk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VGYWN0b3J5SW1wbCNjcmVhdGVSZXNvdXJjZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQorCSAqLworCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7CisJCXJldHVybiBuZXcgQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlSW1wbCh1cmkpOworCX0KKworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVNBWFhNSUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlTQVhYTUlIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU2ZmYzZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlTQVhYTUlIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQ3JlYXRlZCBvbiBBcHIgMzAsIDIwMDMKKyAqCisgKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCisgKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTEhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5TQVhYTUlIYW5kbGVyOworCisvKioKKyAqIEBhdXRob3IgREFCRVJHCisgKiAKKyAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCisgKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCisgKi8KK3B1YmxpYyBjbGFzcyBDb21wYXRpYmlsaXR5U0FYWE1JSGFuZGxlciBleHRlbmRzIFNBWFhNSUhhbmRsZXIgeworCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIE5VTExfQVRUUklCID0gWE1MUmVzb3VyY2UuWFNJX05TICsgIjpudWxsIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQHBhcmFtIHhtaVJlc291cmNlCisJICogQHBhcmFtIGhlbHBlcgorCSAqIEBwYXJhbSBvcHRpb25zCisJICovCisJcHVibGljIENvbXBhdGliaWxpdHlTQVhYTUlIYW5kbGVyKFhNTFJlc291cmNlIHhtaVJlc291cmNlLCBYTUxIZWxwZXIgaGVscGVyLCBNYXAgb3B0aW9ucykgeworCQlzdXBlcih4bWlSZXNvdXJjZSwgaGVscGVyLCBvcHRpb25zKTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxIYW5kbGVyI2lzTnVsbCgpCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNOdWxsKCkgeworCQlib29sZWFuIGlzbnVsbCA9IHN1cGVyLmlzTnVsbCgpOworCQlpZiAoIWlzbnVsbCkKKwkJCWlzbnVsbCA9IGF0dHJpYnMuZ2V0VmFsdWUoTlVMTF9BVFRSSUIpICE9IG51bGw7CisJCXJldHVybiBpc251bGw7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVVSSUNvbnZlcnRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVVSSUNvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMTM1ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5VVJJQ29udmVydGVyLmphdmEKQEAgLTAsMCArMSwxNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQorICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcjsKKworcHVibGljIGludGVyZmFjZSBDb21wYXRpYmlsaXR5VVJJQ29udmVydGVyIGV4dGVuZHMgVVJJQ29udmVydGVyIHsKKwlVUkkgZGVOb3JtYWxpemUoVVJJIHVyaSk7CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5WE1JTG9hZEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlYTUlMb2FkSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMTdhNDYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5WE1JTG9hZEltcGwuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBDcmVhdGVkIG9uIEFwciAzMCwgMjAwMworICoKKyAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KKyAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cworICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlNBWFdyYXBwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSUxvYWRJbXBsOworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7CisKKy8qKgorICogQGF1dGhvciBEQUJFUkcKKyAqIAorICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKKyAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKKyAqLworcHVibGljIGNsYXNzIENvbXBhdGliaWxpdHlYTUlMb2FkSW1wbCBleHRlbmRzIFhNSUxvYWRJbXBsIHsKKworCS8qKgorCSAqIEBwYXJhbSBoZWxwZXIKKwkgKi8KKwlwdWJsaWMgQ29tcGF0aWJpbGl0eVhNSUxvYWRJbXBsKFhNTEhlbHBlciBoZWxwZXIpIHsKKwkJc3VwZXIoaGVscGVyKTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxMb2FkSW1wbCNtYWtlRGVmYXVsdEhhbmRsZXIoKQorCSAqLworCXByb3RlY3RlZCBEZWZhdWx0SGFuZGxlciBtYWtlRGVmYXVsdEhhbmRsZXIoKSB7CisJCXJldHVybiBuZXcgU0FYV3JhcHBlcihuZXcgQ29tcGF0aWJpbGl0eVNBWFhNSUhhbmRsZXIocmVzb3VyY2UsIGhlbHBlciwgb3B0aW9ucykpOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlYTUlSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk1NGY1ZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlYTUlSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKKyAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNSVJlc291cmNlOworCitwdWJsaWMgaW50ZXJmYWNlIENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZSBleHRlbmRzIFhNSVJlc291cmNlIHsKKwlpbnQgRk9STUFUX0VNRjEgPSAwOworCS8qKgorCSAqIGZvcm1hdCBmb3IgTU9GNSBjb21wYXRpYmlsaXR5OyBub3RlIHRoYXQgdGhpcyBjYW4gTk9UIGJlIHVzZWQgd2l0aCByZXNvdXJjZXMgdXNpbmdzIHRoZQorCSAqICJwbGF0Zm9ybTovcGx1Z2luIiBwcm90b2NvbCIKKwkgKi8KKwlpbnQgRk9STUFUX01PRjUgPSAxOworCisJdm9pZCBhZGRPcmlnaW5hbFBhY2thZ2VVUkkoU3RyaW5nIHBhY2thZ2VVcmksIFN0cmluZyBvcmlnaW5hbFVyaSk7CisKKwlpbnQgZ2V0Rm9ybWF0KCk7CisKKwkvKioKKwkgKiBTZXQgdGhlIHNlcmlhbGl6YXRpb24gZm9ybWF0LiBCeSBkZWZhdWx0IGl0IGlzIEZPUk1BVF9FTUYxLgorCSAqIAorCSAqIEBzZWUgQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlI0ZPUk1BVF9FTUYxCisJICogQHNlZSBDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UjRk9STUFUX01PRjUKKwkgKi8KKwl2b2lkIHNldEZvcm1hdChpbnQgZm9ybWF0KTsKKworCWJvb2xlYW4gdXNlc0RlZmF1bHRGb3JtYXQoKTsKKworCS8qKgorCSAqIEBwYXJhbSByb290T2JqZWN0CisJICovCisJdm9pZCByZW1vdmVQcmVzZXJ2aW5nSWRzKEVPYmplY3Qgcm9vdE9iamVjdCk7CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5WE1JUmVzb3VyY2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5WE1JUmVzb3VyY2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI5ZmU5NAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0NvbXBhdGliaWxpdHlYTUlSZXNvdXJjZUltcGwuamF2YQpAQCAtMCwwICsxLDM3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MTG9hZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFNhdmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuSURVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5SZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlJlc291cmNlSXNMb2FkaW5nQWRhcHRlckZhY3Rvcnk7CisKKworcHVibGljIGNsYXNzIENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZUltcGwgZXh0ZW5kcyBYTUlSZXNvdXJjZUltcGwgaW1wbGVtZW50cyBDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UgeworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRU5DT0RJTkcgPSAiVVRGLTgiOyAvLyROT04tTkxTLTEkCisJcHJvdGVjdGVkIGludCBmb3JtYXQgPSBGT1JNQVRfRU1GMTsKKwlwcm90ZWN0ZWQgTWFwIG9yaWdpbmFsUGFja2FnZVVSSXMgPSBuZXcgSGFzaE1hcCgpOworCXByaXZhdGUgYm9vbGVhbiBwcmVzZXJ2ZUlEcyA9IGZhbHNlOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNX1BST1RPQ09MID0gInBsYXRmb3JtIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFURk9STV9QTFVHSU4gPSAicGx1Z2luIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQ29uc3RydWN0b3IgZm9yIE1hcHBhYmxlWE1JUmVzb3VyY2VJbXBsLgorCSAqLworCXB1YmxpYyBDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2VJbXBsKCkgeworCQlzdXBlcigpOworCQlpbml0RGVmYXVsdFNhdmVPcHRpb25zKCk7CisJfQorCisJcHVibGljIENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZUltcGwoVVJJIHVyaSkgeworCQlzdXBlcih1cmkpOworCQlpbml0RGVmYXVsdFNhdmVPcHRpb25zKCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VJbXBsI2NyZWF0ZVhNTEhlbHBlcigpCisJICovCisJcHJvdGVjdGVkIGZpbmFsIFhNTEhlbHBlciBjcmVhdGVYTUxIZWxwZXIoKSB7CisJCU1hcHBlZFhNSUhlbHBlciBoZWxwZXIgPSBkb0NyZWF0ZVhNTEhlbHBlcigpOworCQloZWxwZXIuc2V0UGFja2FnZVVSSXNUb1ByZWZpeGVzKGdldFBhY2thZ2VVUklzVG9QcmVmaXhlcygpKTsKKwkJcmV0dXJuIGhlbHBlcjsKKwl9CisKKwlwcm90ZWN0ZWQgTWFwcGVkWE1JSGVscGVyIGRvQ3JlYXRlWE1MSGVscGVyKCkgeworCQlyZXR1cm4gbmV3IE1hcHBlZFhNSUhlbHBlcih0aGlzLCBnZXRQcmVmaXhUb1BhY2thZ2VVUklzKCkpOworCX0KKworCS8qKgorCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG5vdCBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgorCSAqIAorCSAqIEBzZWUgQ29tcGF0aWJpbGl0eVBhY2thZ2VNYXBwaW5nUmVnaXN0cnkjZ2V0UHJlZml4VG9QYWNrYWdlVVJJcygpCisJICovCisJcHJvdGVjdGVkIE1hcCBnZXRQcmVmaXhUb1BhY2thZ2VVUklzKCkgeworCQlyZXR1cm4gQ29tcGF0aWJpbGl0eVBhY2thZ2VNYXBwaW5nUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0UHJlZml4VG9QYWNrYWdlVVJJcygpOworCX0KKworCS8qKgorCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG5vdCBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgorCSAqIAorCSAqIEBzZWUgQ29tcGF0aWJpbGl0eVBhY2thZ2VNYXBwaW5nUmVnaXN0cnkjZ2V0UHJlZml4VG9QYWNrYWdlVVJJcygpCisJICovCisJcHJvdGVjdGVkIE1hcCBnZXRQYWNrYWdlVVJJc1RvUHJlZml4ZXMoKSB7CisJCXJldHVybiBDb21wYXRpYmlsaXR5UGFja2FnZU1hcHBpbmdSZWdpc3RyeS5JTlNUQU5DRS5nZXRQYWNrYWdlVVJJc1RvUHJlZml4ZXMoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRPcmlnaW5hbFBhY2thZ2VVUkkoU3RyaW5nIHBhY2thZ2VVcmksIFN0cmluZyBvcmlnaW5hbFVyaSkgeworCQlvcmlnaW5hbFBhY2thZ2VVUklzLnB1dChwYWNrYWdlVXJpLCBvcmlnaW5hbFVyaSk7CisJfQorCisJcHVibGljIGludCBnZXRGb3JtYXQoKSB7CisJCXJldHVybiBmb3JtYXQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0Rm9ybWF0KGludCBmb3JtYXQpIHsKKwkJaWYgKCFpc1BsYXRmb3JtUGx1Z2luUmVzb3VyY2VVUkkoKSkKKwkJCXRoaXMuZm9ybWF0ID0gZm9ybWF0OworCX0KKworCXByaXZhdGUgYm9vbGVhbiBpc1BsYXRmb3JtUGx1Z2luUmVzb3VyY2VVUkkoKSB7CisJCVVSSSBhVVJJID0gZ2V0VVJJKCk7CisKKwkJcmV0dXJuIGFVUkkgIT0gbnVsbCAmJiBQTEFURk9STV9QUk9UT0NPTC5lcXVhbHModXJpLnNjaGVtZSgpKSAmJiBQTEFURk9STV9QTFVHSU4uZXF1YWxzKHVyaS5zZWdtZW50KDApKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSNnZXRVUklGcmFnbWVudChFT2JqZWN0KQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VVJJRnJhZ21lbnQoRU9iamVjdCBlT2JqZWN0KSB7CisJCWlmICh1c2VzRGVmYXVsdEZvcm1hdCgpKQorCQkJcmV0dXJuIHN1cGVyLmdldFVSSUZyYWdtZW50KGVPYmplY3QpOworCQlyZXR1cm4gSURVdGlsLmdldE9yQXNzaWduSUQoZU9iamVjdCwgdGhpcyk7CisJfQorCisJcHVibGljIGJvb2xlYW4gdXNlc0RlZmF1bHRGb3JtYXQoKSB7CisJCXJldHVybiBmb3JtYXQgPT0gQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlLkZPUk1BVF9FTUYxOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlSW1wbCNjcmVhdGVYTUxTYXZlKCkKKwkgKi8KKwlwcm90ZWN0ZWQgWE1MU2F2ZSBjcmVhdGVYTUxTYXZlKCkgeworCQlpZiAodXNlc0RlZmF1bHRGb3JtYXQoKSkKKwkJCXJldHVybiBzdXBlci5jcmVhdGVYTUxTYXZlKCk7CisJCXJldHVybiBuZXcgQ29tcGF0aWJpbGl0eVhNSVNhdmVJbXBsKGNyZWF0ZVhNTEhlbHBlcigpKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxSZXNvdXJjZUltcGwjZG9TYXZlKE91dHB1dFN0cmVhbSwgTWFwKQorCSAqLworCXB1YmxpYyB2b2lkIGRvU2F2ZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJc3VwZXIuZG9TYXZlKG91dHB1dFN0cmVhbSwgb3B0aW9ucyk7CisJfQorCisJLyoqCisJICogTWV0aG9kIGluaXREZWZhdWx0T3B0aW9ucy4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBpbml0RGVmYXVsdFNhdmVPcHRpb25zKCkgeworCQlpZiAoZGVmYXVsdFNhdmVPcHRpb25zID09IG51bGwpIHsKKwkJCWdldERlZmF1bHRTYXZlT3B0aW9ucygpOworCQl9CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUltcGwjZ2V0RU9iamVjdEJ5SUQoU3RyaW5nKQorCSAqLworCXByb3RlY3RlZCBFT2JqZWN0IGdldEVPYmplY3RCeUlEKFN0cmluZyBpZCkgeworCQlpZiAoaWRUb0VPYmplY3RNYXAgIT0gbnVsbCkgeworCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGlkVG9FT2JqZWN0TWFwLmdldChpZCk7CisJCQlpZiAoZU9iamVjdCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIGVPYmplY3Q7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ2FsbGVkIHdoZW4gdGhlIG9iamVjdCBpcyB1bmxvYWRlZC4gVGhpcyBpbXBsZW1lbnRhdGlvbgorCSAqIHtAbGluayBJbnRlcm5hbEVPYmplY3QjZVNldFByb3h5VVJJIHNldHN9dGhlIG9iamVjdCB0byBiZSBhIHByb3h5IGFuZCBjbGVhcnMgdGhlCisJICoge0BsaW5rICNlQWRhcHRlcnMgYWRhcHRlcnN9LgorCSAqLworCXByb3RlY3RlZCB2b2lkIHVubG9hZGVkKEludGVybmFsRU9iamVjdCBpbnRlcm5hbEVPYmplY3QpIHsKKwkJLy9vdmVycmlkZGVuIGZyb20gdGhlIHN1cGVyIGNsYXNzOyBjYWxsIHN1cGVyLmdldFVSSUZyYWdtZW50IGluc3RlYWQgb2YgdGhlIGltcGxlbWVudGF0aW9uCisJCS8vYXQgdGhpcyBsZXZlbCwgdG8gYXZvaWQgSUQgZ2VuZXJhdGlvbiBkdXJpbmcgdW5sb2FkCisJCS8vaW50ZXJuYWxFT2JqZWN0LmVTZXRQcm94eVVSSSh1cmkuYXBwZW5kRnJhZ21lbnQoZ2V0VVJJRnJhZ21lbnQoaW50ZXJuYWxFT2JqZWN0KSkpOworCQlpbnRlcm5hbEVPYmplY3QuZVNldFByb3h5VVJJKHVyaS5hcHBlbmRGcmFnbWVudChzdXBlci5nZXRVUklGcmFnbWVudChpbnRlcm5hbEVPYmplY3QpKSk7CisJCWludGVybmFsRU9iamVjdC5lQWRhcHRlcnMoKS5jbGVhcigpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbCNkb0xvYWQoamF2YS5pby5JbnB1dFN0cmVhbSwKKwkgKiAgICAgIGphdmEudXRpbC5NYXApCisJICovCisJcHVibGljIGZpbmFsIHZvaWQgZG9Mb2FkKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJYmFzaWNEb0xvYWQoaW5wdXRTdHJlYW0sIG9wdGlvbnMpOworCX0KKworCS8qKgorCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2RvTG9hZChJbnB1dFN0cmVhbSwgTWFwKX0gaW5zdGVhZC4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBiYXNpY0RvTG9hZChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXN1cGVyLmRvTG9hZChpbnB1dFN0cmVhbSwgb3B0aW9ucyk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VJbXBsI2luaXQoKQorCSAqLworCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7CisJCXN1cGVyLmluaXQoKTsKKwkJc2V0RW5jb2RpbmcoREVGQVVMVF9FTkNPRElORyk7CisJfQorCisJcHJvdGVjdGVkIFhNTExvYWQgY3JlYXRlWE1MTG9hZCgpIHsKKwkJcmV0dXJuIG5ldyBDb21wYXRpYmlsaXR5WE1JTG9hZEltcGwoY3JlYXRlWE1MSGVscGVyKCkpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlI3JlbW92ZVByZXNlcnZpbmdJZHMob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlUHJlc2VydmluZ0lkcyhFT2JqZWN0IHJvb3RPYmplY3QpIHsKKwkJc2V0UHJlc2VydmVJRHModHJ1ZSk7CisJCWdldENvbnRlbnRzKCkucmVtb3ZlKHJvb3RPYmplY3QpOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcHJlc2VydmVJRHMuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNQcmVzZXJ2ZUlEcygpIHsKKwkJcmV0dXJuIHByZXNlcnZlSURzOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBwcmVzZXJ2ZUlEcworCSAqICAgICAgICAgICAgVGhlIHByZXNlcnZlSURzIHRvIHNldC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQcmVzZXJ2ZUlEcyhib29sZWFuIHByZXNlcnZlSURzKSB7CisJCXRoaXMucHJlc2VydmVJRHMgPSBwcmVzZXJ2ZUlEczsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxSZXNvdXJjZUltcGwjZGV0YWNoZWRIZWxwZXIob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCisJICovCisJcHJvdGVjdGVkIHZvaWQgZGV0YWNoZWRIZWxwZXIoRU9iamVjdCBlT2JqZWN0KSB7CisJCWlmIChtb2RpZmljYXRpb25UcmFja2luZ0FkYXB0ZXIgIT0gbnVsbCkgeworCQkJZU9iamVjdC5lQWRhcHRlcnMoKS5yZW1vdmUobW9kaWZpY2F0aW9uVHJhY2tpbmdBZGFwdGVyKTsKKwkJfQorCisJCWlmICh1c2VVVUlEcygpKSB7CisJCQlERVRBQ0hFRF9FT0JKRUNUX1RPX0lEX01BUC5wdXQoZU9iamVjdCwgZ2V0SUQoZU9iamVjdCkpOworCQl9CisKKwkJaWYgKCFpc1ByZXNlcnZlSURzKCkgJiYgaWRUb0VPYmplY3RNYXAgIT0gbnVsbCAmJiBlT2JqZWN0VG9JRE1hcCAhPSBudWxsKSB7CisJCQlpZFRvRU9iamVjdE1hcC5yZW1vdmUoZU9iamVjdFRvSURNYXAucmVtb3ZlKGVPYmplY3QpKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCBsb2FkKE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIFJlc291cmNlSXNMb2FkaW5nQWRhcHRlciBhZGFwdGVyID0gbnVsbDsKKyAgICAgICAgaWYgKGlzTG9hZGVkKSB7CisgICAgICAgICAgICBhZGFwdGVyID0gUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyLmZpbmRBZGFwdGVyKHRoaXMpOworICAgICAgICAgICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkgCisgICAgICAgICAgICAgICAgYWRhcHRlci53YWl0Rm9yUmVzb3VyY2VUb0xvYWQoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsgICAgICAgICAgICAKKyAgICAgICAgICAgIGFkYXB0ZXIgPSBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIuZmluZEFkYXB0ZXIodGhpcyk7CisgICAgICAgICAgICBpZiAoYWRhcHRlciA9PSBudWxsICYmICFpc0xvYWRlZCkgCisgICAgICAgICAgICAgICAgYWRkU3luY2hyb25pemF0aW9uTG9hZGluZ0FkYXB0ZXIoKTsKKyAgICAgICAgfQorICAgICAgICBpZihhZGFwdGVyICE9IG51bGwpCisgICAgICAgICAgICBhZGFwdGVyLndhaXRGb3JSZXNvdXJjZVRvTG9hZCgpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3VwZXIubG9hZChvcHRpb25zKTsKKyAgICAgICAgICAgIH0gY2F0Y2goSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlTG9hZGluZ1N5bmNocm9uaXphdGlvbkFkYXB0ZXIoKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBpb2U7CisgICAgICAgICAgICB9IGNhdGNoKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgICAgICByZW1vdmVMb2FkaW5nU3luY2hyb25pemF0aW9uQWRhcHRlcigpOworICAgICAgICAgICAgICAgIHRocm93IHJlOworICAgICAgICAgICAgfSBjYXRjaChFcnJvciBlKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlTG9hZGluZ1N5bmNocm9uaXphdGlvbkFkYXB0ZXIoKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCXB1YmxpYyB2b2lkIGxvYWRFeGlzdGluZyhNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQkKKyAgICAgICAgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyIGFkYXB0ZXIgPSBudWxsOworICAgICAgICBpZiAoaXNMb2FkZWQpIHsKKyAgICAgICAgICAgIGFkYXB0ZXIgPSBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIuZmluZEFkYXB0ZXIodGhpcyk7CisgICAgICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsKSAKKyAgICAgICAgICAgICAgICBhZGFwdGVyLndhaXRGb3JSZXNvdXJjZVRvTG9hZCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeyAgICAgICAgICAgIAorICAgICAgICAgICAgYWRhcHRlciA9IFJlc291cmNlSXNMb2FkaW5nQWRhcHRlci5maW5kQWRhcHRlcih0aGlzKTsKKyAgICAgICAgICAgIGlmIChhZGFwdGVyID09IG51bGwgJiYgIWlzTG9hZGVkKSAKKyAgICAgICAgICAgICAgICBhZGRTeW5jaHJvbml6YXRpb25Mb2FkaW5nQWRhcHRlcigpOworICAgICAgICB9CisgICAgICAgIGlmKGFkYXB0ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIGFkYXB0ZXIud2FpdEZvclJlc291cmNlVG9Mb2FkKCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBsb2FkKChJbnB1dFN0cmVhbSkgbnVsbCwgb3B0aW9ucyk7CisgICAgICAgICAgICB9IGNhdGNoKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgIHJlbW92ZUxvYWRpbmdTeW5jaHJvbml6YXRpb25BZGFwdGVyKCk7CisgICAgICAgICAgICAgICAgdGhyb3cgaW9lOworICAgICAgICAgICAgfSBjYXRjaChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlTG9hZGluZ1N5bmNocm9uaXphdGlvbkFkYXB0ZXIoKTsKKyAgICAgICAgICAgICAgICB0aHJvdyByZTsKKyAgICAgICAgICAgIH0gY2F0Y2goRXJyb3IgZSkgeworICAgICAgICAgICAgICAgIHJlbW92ZUxvYWRpbmdTeW5jaHJvbml6YXRpb25BZGFwdGVyKCk7CisgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwkKKwkgIC8qKgorICAgICAqIAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFkZFN5bmNocm9uaXphdGlvbkxvYWRpbmdBZGFwdGVyKCkgeworICAgIAlzeW5jaHJvbml6ZWQgKGVBZGFwdGVycygpKSB7CisgICAgICAgIGlmIChSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIuZmluZEFkYXB0ZXIodGhpcykgPT0gbnVsbCkKKyAgICAgICAgICAgIGVBZGFwdGVycygpLmFkZChSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZVJlc291cmNlSXNMb2FkaW5nQWRhcHRlcigpKTsKKyAgICAJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZUxvYWRpbmdTeW5jaHJvbml6YXRpb25BZGFwdGVyKCkgeworICAgICAgICBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIgYWRhcHRlciA9IFJlc291cmNlSXNMb2FkaW5nQWRhcHRlci5maW5kQWRhcHRlcih0aGlzKTsKKyAgICAgICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgYWRhcHRlci5mb3JjZVJlbGVhc2UoKTsKKyAgICAgICAgICAgIGVBZGFwdGVycygpLnJlbW92ZShhZGFwdGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhc2UgMTogTE9BRCBSRVNPVVJDRSBGUk9NIERJU0sgdGhpcy5pc0xvYWRlZCA9PSBmYWxzZSBBTkQgaXNMb2FkZWQgPT0KKyAgICAgKiB0cnVlICh3aGljaCBtZWFucyB3ZSBlbnRlcmVkIHRoZSBsb2FkKCkgbWV0aG9kLCBidXQgaGF2ZSBub3QgY29tcGxldGVkCisgICAgICogdGhlIGxvYWQpLCBhbmQgd2UncmUgbG9hZGluZyBmcm9tIGEgcmVzb3VyY2Ugb24gZGlzaywgdGhlbiB3ZSBhZGQgdGhlCisgICAgICogYWRhcHRlciBDYXNlIDI6IFJFU09VUkNFIENSRUFUSU9OIChOT1QgQSBMT0FEKSBDYXNlIDQ6IFJFU09VUkNFIENSRUFUSU9OLAorICAgICAqIFVOTE9BREVELCBORVcgQ09OVEVOVFMgKE5PVCBBIExPQUQpIFJlc291cmNlIGlzIGNyZWF0ZWQgYnV0IG5vdCBmcm9tIGEKKyAgICAgKiByZXNvdXJjZSBvbiBkaXNrLCBzbyBjb250ZW50cyBpcyBudWxsIEFORCBub3QgZW1wdHksIHNvIG5vIGFkYXB0ZXI6IFRISVMKKyAgICAgKiBJUyBOT1QgQSBMT0FEIENhc2UgMzogUkVTT1VSQ0UgSEFTIEJFRU4gVU5MT0FERUQsIEJFSU5HIFJFTE9BREVEIEZST00KKyAgICAgKiBESVNLIENvbnRlbnRzIGlzIE5PVCBudWxsLCBidXQgaXQgaXMgRW1wdHkgYW5kIHRoZSByZXNvdXJjZSBpcyBiZWluZworICAgICAqIGxvYWRlZCBmcm9tIGRpc2suIFdlIG11c3QgYWRkIHRoZSBhZGFwdGVyLgorICAgICAqIAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUmVzb3VyY2VCZWluZ0xvYWRlZChib29sZWFuIGlzTG9hZGVkKSB7CisgICAgICAgIHJldHVybiAoIXRoaXMuaXNMb2FkZWQgJiYgaXNMb2FkZWQpICYmIChjb250ZW50cyA9PSBudWxsIHx8IGNvbnRlbnRzLmlzRW1wdHkoKSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UjZ2V0Q29udGVudHMoKQorICAgICAqLworICAgIHB1YmxpYyBFTGlzdCBnZXRDb250ZW50cygpIHsKKyAgICAgICAgd2FpdEZvclJlc291cmNlVG9Mb2FkSWZOZWNlc3NhcnkoKTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldENvbnRlbnRzKCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUltcGwjaXNMb2FkZWQoKQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTG9hZGVkKCkgeworICAgICAgICB3YWl0Rm9yUmVzb3VyY2VUb0xvYWRJZk5lY2Vzc2FyeSgpOworICAgICAgICByZXR1cm4gc3VwZXIuaXNMb2FkZWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCB3YWl0Rm9yUmVzb3VyY2VUb0xvYWRJZk5lY2Vzc2FyeSgpIHsKKyAgICAgICAgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyIGxvYWRpbmdBZGFwdGVyID0gUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyLmZpbmRBZGFwdGVyKHRoaXMpOworICAgICAgICBpZiAobG9hZGluZ0FkYXB0ZXIgIT0gbnVsbCkgbG9hZGluZ0FkYXB0ZXIud2FpdEZvclJlc291cmNlVG9Mb2FkKCk7CisgICAgfQorCisKKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVhNSVNhdmVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db21wYXRpYmlsaXR5WE1JU2F2ZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWE3YmYyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29tcGF0aWJpbGl0eVhNSVNhdmVJbXBsLmphdmEKQEAgLTAsMCArMSwxMjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKKyAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUlSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTEhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlTYXZlSW1wbDsKKworcHVibGljIGNsYXNzIENvbXBhdGliaWxpdHlYTUlTYXZlSW1wbCBleHRlbmRzIFhNSVNhdmVJbXBsIHsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yIGZvciBDb21wYXRpYmlsaXR5WE1JU2F2ZUltcGwuCisJICogCisJICogQHBhcmFtIGhlbHBlcgorCSAqLworCXB1YmxpYyBDb21wYXRpYmlsaXR5WE1JU2F2ZUltcGwoWE1MSGVscGVyIGhlbHBlcikgeworCQlzdXBlcihoZWxwZXIpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yIGZvciBDb21wYXRpYmlsaXR5WE1JU2F2ZUltcGwuCisJICogCisJICogQHBhcmFtIG9wdGlvbnMKKwkgKiBAcGFyYW0gaGVscGVyCisJICogQHBhcmFtIGVuY29kaW5nCisJICovCisJcHVibGljIENvbXBhdGliaWxpdHlYTUlTYXZlSW1wbChNYXAgb3B0aW9ucywgWE1MSGVscGVyIGhlbHBlciwgU3RyaW5nIGVuY29kaW5nKSB7CisJCXN1cGVyKG9wdGlvbnMsIGhlbHBlciwgZW5jb2RpbmcpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVNhdmVJbXBsI2luaXQoWE1MUmVzb3VyY2UsIE1hcCkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBpbml0KFhNTFJlc291cmNlIHJlc291cmNlLCBNYXAgb3B0aW9ucykgeworCQlzdXBlci5pbml0KHJlc291cmNlLCBvcHRpb25zKTsKKwkJeG1pVHlwZSA9IHRydWU7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JU2F2ZUltcGwjYWRkTmFtZXNwYWNlRGVjbGFyYXRpb25zKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGROYW1lc3BhY2VEZWNsYXJhdGlvbnMoKSB7CisJCWRvYy5hZGRBdHRyaWJ1dGUoWE1JX1ZFUl9OUywgWE1JUmVzb3VyY2UuVkVSU0lPTl9WQUxVRSk7CisJCWRvYy5hZGRBdHRyaWJ1dGUoWE1JX1hNTE5TLCBYTUlSZXNvdXJjZS5YTUlfVVJJKTsKKwkJRVBhY2thZ2VbXSBwYWNrYWdlcyA9IGhlbHBlci5wYWNrYWdlcygpOworCQlTdHJpbmdCdWZmZXIgeHNpU2NoZW1hTG9jYXRpb24gPSBudWxsOworCQlpZiAoZGVjbGFyZVNjaGVtYUxvY2F0aW9uKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhY2thZ2VzLmxlbmd0aDsgaSsrKSB7CisJCQkJRVBhY2thZ2UgZVBhY2thZ2UgPSBwYWNrYWdlc1tpXTsKKworCQkJCUVPYmplY3Qgcm9vdCA9IEVjb3JlVXRpbC5nZXRSb290Q29udGFpbmVyKGVQYWNrYWdlKTsKKwkJCQlpZiAocm9vdCBpbnN0YW5jZW9mIEVQYWNrYWdlKSB7CisJCQkJCUVQYWNrYWdlIHJvb3RFUGFja2FnZSA9IChFUGFja2FnZSkgcm9vdDsKKwkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByb290RVBhY2thZ2UuZVJlc291cmNlKCk7CisJCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7CisJCQkJCQlVUkkgdXJpID0gcmVzb3VyY2UuZ2V0VVJJKCk7CisJCQkJCQlTdHJpbmcgcm9vdE5zVVJJID0gcm9vdEVQYWNrYWdlLmdldE5zVVJJKCk7CisJCQkJCQlpZiAodXJpID09IG51bGwgPyByb290TnNVUkkgIT0gbnVsbCA6ICF1cmkudG9TdHJpbmcoKS5lcXVhbHMocm9vdE5zVVJJKSkgeworCQkJCQkJCWRlY2xhcmVYU0kgPSB0cnVlOworCQkJCQkJCWlmICh4c2lTY2hlbWFMb2NhdGlvbiA9PSBudWxsKSB7CisJCQkJCQkJCXhzaVNjaGVtYUxvY2F0aW9uID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCXhzaVNjaGVtYUxvY2F0aW9uLmFwcGVuZCgnICcpOworCQkJCQkJCX0KKwkJCQkJCQl4c2lTY2hlbWFMb2NhdGlvbi5hcHBlbmQocm9vdE5zVVJJKTsKKwkJCQkJCQl4c2lTY2hlbWFMb2NhdGlvbi5hcHBlbmQoJyAnKTsKKwkJCQkJCQl4c2lTY2hlbWFMb2NhdGlvbi5hcHBlbmQoaGVscGVyLmdldEhSRUYocm9vdEVQYWNrYWdlKSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoZGVjbGFyZVhTSSkgeworCQkJZG9jLmFkZEF0dHJpYnV0ZShYU0lfWE1MTlMsIFhNTFJlc291cmNlLlhTSV9VUkkpOworCQl9CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWNrYWdlcy5sZW5ndGg7IGkrKykgeworCQkJRVBhY2thZ2UgZVBhY2thZ2UgPSBwYWNrYWdlc1tpXTsKKwkJCS8vTW9kaWZpZWQgZnJvbSBzdXBlcmNsYXNzIC0gZGlzcGF0Y2ggYmFjayB0byBoZWxwZXIgZm9yIGNvbXBhdGliaWxpdHkKKwkJCS8vU3RyaW5nIG5zVVJJID0gZVBhY2thZ2UuZ2V0TnNVUkkoKTsKKwkJCS8vU3RyaW5nIG5zUHJlZml4ID0gZVBhY2thZ2UuZ2V0TnNQcmVmaXgoKTsKKwkJCVN0cmluZ1tdIG5zSW5mbyA9ICgoTWFwcGVkWE1JSGVscGVyKSBoZWxwZXIpLmdldE5TSW5mbyhlUGFja2FnZSk7CisJCQlkb2MuYWRkQXR0cmlidXRlTlMoWE1MUmVzb3VyY2UuWE1MX05TLCBuc0luZm9bMF0sIG5zSW5mb1sxXSk7CisJCX0KKworCQlpZiAoeHNpU2NoZW1hTG9jYXRpb24gIT0gbnVsbCkgeworCQkJZG9jLmFkZEF0dHJpYnV0ZShYU0lfU0NIRU1BX0xPQ0FUSU9OLCB4c2lTY2hlbWFMb2NhdGlvbi50b1N0cmluZygpKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIHNhdmVIcmVmKEVPYmplY3QgcmVtb3RlLCBFU3RydWN0dXJhbEZlYXR1cmUgZikgeworCQlTdHJpbmcgbmFtZSA9IGhlbHBlci5nZXRRTmFtZShmKTsKKwkJU3RyaW5nIGhyZWYgPSBoZWxwZXIuZ2V0SFJFRihyZW1vdGUpOworCQlpZiAoaHJlZiAhPSBudWxsKSB7CisJCQlkb2Muc3RhcnRFbGVtZW50KG5hbWUpOworCQkJRUNsYXNzIGVDbGFzcyA9IHJlbW90ZS5lQ2xhc3MoKTsKKworCQkJRUNsYXNzIGV4cGVjdGVkVHlwZSA9IChFQ2xhc3MpIGYuZ2V0RVR5cGUoKTsKKwkJCS8vQ2hhbmdlZCBuZXh0IGxpbmUgdG8gYWx3YXlzIHdyaXRlIHR5cGUgaWYgZXhwZWN0ZWRUeXBlCisJCQkvL2lzIGRpZmZlcmVudCBmcm9tIGVDbGFzcworCQkJaWYgKGVDbGFzcyAhPSBleHBlY3RlZFR5cGUpIHsKKwkJCQlzYXZlVHlwZUF0dHJpYnV0ZShlQ2xhc3MpOworCQkJfQorCisJCQlkb2MuYWRkQXR0cmlidXRlKFhNTFJlc291cmNlLkhSRUYsIGhyZWYpOworCQkJZG9jLmVuZEVtcHR5RWxlbWVudCgpOworCQl9CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Db25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTZmMTAyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQ3JlYXRlZCBvbiBBcHIgMTUsIDIwMDMKKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKKworLyoqCisgKiBAYXV0aG9yIHNjaGFjaGVyCisgKi8KK3B1YmxpYyBjbGFzcyBDb25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIHsKKworCXByb3RlY3RlZCBTdHJpbmcgYXR0cmlidXRlVmFsdWU7CisKKwkvKioKKwkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKKwkgKiBAcGFyYW0gZUNsYXNzCisJICovCisJcHVibGljIENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSkgeworCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgbnVsbCwgRE9NX0FUVFJJQlVURSk7CisJCXRoaXMuYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVWYWx1ZTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldE1PRlZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQorCSAqLworCXB1YmxpYyBPYmplY3QgZ2V0TU9GVmFsdWUoRU9iamVjdCBtb2ZPYmplY3QpIHsKKwkJcmV0dXJuIGF0dHJpYnV0ZVZhbHVlOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjaXNTZXRNT0ZWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1NldE1PRlZhbHVlKEVPYmplY3QgZW1mT2JqZWN0KSB7CisJCXJldHVybiB0cnVlOworCX0KKworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRGVmYXVsdFRyYW5zbGF0b3JGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9EZWZhdWx0VHJhbnNsYXRvckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmFiY2U1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRGVmYXVsdFRyYW5zbGF0b3JGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQ3JlYXRlZCBvbiBBdWcgMjAsIDIwMDMKKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5OYW1lc3BhY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLk5hbWVzcGFjZUFkYXB0ZXI7CisKKworLyoqCisgKiBAYXV0aG9yIHNjaGFjaGVyCisgKi8KK3B1YmxpYyBjbGFzcyBEZWZhdWx0VHJhbnNsYXRvckZhY3RvcnkgaW1wbGVtZW50cyBWYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5IHsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTE5TID0gInhtbG5zOiI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIERlZmF1bHRUcmFuc2xhdG9yRmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBEZWZhdWx0VHJhbnNsYXRvckZhY3RvcnkoKTsKKworCXB1YmxpYyBEZWZhdWx0VHJhbnNsYXRvckZhY3RvcnkoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeSNhY2NlcHRzKGphdmEubGFuZy5TdHJpbmcpCisJICovCisJcHVibGljIGJvb2xlYW4gYWNjZXB0cyhTdHJpbmcgZG9tTmFtZSkgeworCQlyZXR1cm4gZG9tTmFtZSAhPSBudWxsICYmIGRvbU5hbWUuc3RhcnRzV2l0aChYTUxOUyk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeSNhY2NlcHRzKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBhY2NlcHRzKE5vdGlmaWNhdGlvbiBub3RpZikgeworCQlyZXR1cm4gbm90aWYuZ2V0RmVhdHVyZSgpID09IE5hbWVzcGFjZUFkYXB0ZXIuTk9USUZJQ0FUSU9OX0ZFQVRVUkU7CisJfQorCisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5WYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5I2NyZWF0ZShqYXZhLmxhbmcuU3RyaW5nKQorCSAqLworCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZShTdHJpbmcgZG9tTmFtZSkgeworCQlyZXR1cm4gbmV3IE5hbWVzcGFjZVRyYW5zbGF0b3IoZG9tTmFtZSk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeSNjcmVhdGUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCisJICovCisJcHVibGljIExpc3QgY3JlYXRlKE5vdGlmaWVyIHRhcmdldCkgeworCQlpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBFT2JqZWN0KSkKKwkJCXJldHVybiBudWxsOworCQlMaXN0IG5hbWVzcGFjZXMgPSBOYW1lc3BhY2VBZGFwdGVyLmdldE5hbWVzcGFjZXMoKEVPYmplY3QpIHRhcmdldCk7CisJCWlmIChuYW1lc3BhY2VzID09IG51bGwgfHwgbmFtZXNwYWNlcy5pc0VtcHR5KCkpCisJCQlyZXR1cm4gbnVsbDsKKwkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KG5hbWVzcGFjZXMuc2l6ZSgpKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lc3BhY2VzLnNpemUoKTsgaSsrKSB7CisJCQlyZXN1bHQuYWRkKGNyZWF0ZSgoTmFtZXNwYWNlKSBuYW1lc3BhY2VzLmdldChpKSkpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeSNjcmVhdGUob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQorCSAqLworCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZShOb3RpZmljYXRpb24gbm90aWYpIHsKKwkJTmFtZXNwYWNlIG5zID0gKE5hbWVzcGFjZSkgbm90aWYuZ2V0TmV3VmFsdWUoKTsKKwkJcmV0dXJuIGNyZWF0ZShucyk7CisJfQorCisJcHJpdmF0ZSBUcmFuc2xhdG9yIGNyZWF0ZShOYW1lc3BhY2UgbnMpIHsKKwkJcmV0dXJuIG5ldyBOYW1lc3BhY2VUcmFuc2xhdG9yKFhNTE5TICsgbnMuZ2V0UHJlZml4KCkpOworCX0KKworCisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0RlcGVuZGVuY3lUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9EZXBlbmRlbmN5VHJhbnNsYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZDFjNjIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9EZXBlbmRlbmN5VHJhbnNsYXRvci5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIENyZWF0ZWQgb24gTWFyIDI1LCAyMDAzCisgKgorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworCisvKioKKyAqIEBhdXRob3Igc2NoYWNoZXIKKyAqLworcHVibGljIGNsYXNzIERlcGVuZGVuY3lUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciB7CisKKwkvKioKKwkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKKwkgKiBAcGFyYW0gYUZlYXR1cmUKKwkgKi8KKwlwdWJsaWMgRGVwZW5kZW5jeVRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRGVwZW5kZW50RmVhdHVyZSkgeworCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUpOworCQlkZXBlbmRlbmN5RmVhdHVyZSA9IGFEZXBlbmRlbnRGZWF0dXJlOworCX0KKworCXB1YmxpYyBFT2JqZWN0IGdldENoaWxkKEVPYmplY3QgcGFyZW50KSB7CisJCUVPYmplY3QgY2hpbGQgPSBiYXNpY0dldERlcGVuZGVuY3lPYmplY3QocGFyZW50KTsKKwkJaWYgKGNoaWxkID09IG51bGwpCisJCQlyZXR1cm4gY3JlYXRlQ2hpbGQocGFyZW50KTsKKwkJcmV0dXJuIGNoaWxkOworCX0KKworCisJcHJvdGVjdGVkIEVPYmplY3QgY3JlYXRlQ2hpbGQoRU9iamVjdCBwYXJlbnQpIHsKKwkJRU9iamVjdCBjaGlsZCA9IGNyZWF0ZUVNRk9iamVjdChkZXBlbmRlbmN5RmVhdHVyZSk7CisJCXBhcmVudC5lU2V0KGRlcGVuZGVuY3lGZWF0dXJlLCBjaGlsZCk7CisJCXJldHVybiBjaGlsZDsKKwl9CisKKwlwdWJsaWMgTGlzdCBnZXRNT0ZDaGlsZHJlbihFT2JqZWN0IG1vZk9iamVjdCkgeworCQkvL3JldHVybiBzdXBlci5nZXRNT0ZDaGlsZHJlbihnZXRDaGlsZChtb2ZPYmplY3QpKTsKKwkJcmV0dXJuIHN1cGVyLmdldE1PRkNoaWxkcmVuKG1vZk9iamVjdCk7CisJfQorCisJcHVibGljIE9iamVjdCBnZXRNT0ZWYWx1ZShFT2JqZWN0IG1vZk9iamVjdCkgeworCQlyZXR1cm4gc3VwZXIuZ2V0TU9GVmFsdWUoZ2V0Q2hpbGQobW9mT2JqZWN0KSk7CisJfQorCisJcHVibGljIHZvaWQgc2V0TU9GVmFsdWUoRU9iamVjdCBlbWZPYmplY3QsIE9iamVjdCB2YWx1ZSkgeworCQkvL3N1cGVyLnNldE1PRlZhbHVlKGdldENoaWxkKGVtZk9iamVjdCksIHZhbHVlKTsKKwkJc3VwZXIuc2V0TU9GVmFsdWUoZ2V0Q2hpbGQoZW1mT2JqZWN0KSwgdmFsdWUsIC0xKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNT0ZWYWx1ZShOb3RpZmllciBvd25lciwgT2JqZWN0IHZhbHVlLCBpbnQgbmV3SW5kZXgpIHsKKwkJc3VwZXIuc2V0TU9GVmFsdWUoZ2V0Q2hpbGQoKEVPYmplY3QpIG93bmVyKSwgdmFsdWUsIG5ld0luZGV4KTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVNT0ZWYWx1ZShOb3RpZmllciBvd25lciwgT2JqZWN0IHZhbHVlKSB7CisJCXN1cGVyLnJlbW92ZU1PRlZhbHVlKGdldENoaWxkKChFT2JqZWN0KSBvd25lciksIHZhbHVlKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1NldE1PRlZhbHVlKEVPYmplY3QgZW1mT2JqZWN0KSB7CisJCXJldHVybiBzdXBlci5pc1NldE1PRlZhbHVlKGdldENoaWxkKGVtZk9iamVjdCkpOworCX0KKworCXB1YmxpYyB2b2lkIHVuU2V0TU9GVmFsdWUoRU9iamVjdCBlbWZPYmplY3QpIHsKKwkJc3VwZXIudW5TZXRNT0ZWYWx1ZShnZXRDaGlsZChlbWZPYmplY3QpKTsKKwl9CisKKworCXB1YmxpYyBib29sZWFuIGlzRGVwZW5kZW5jeUNoaWxkKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBmZWF0dXJlRXhpc3RzKEVPYmplY3QgZW1mT2JqZWN0KSB7CisJCXJldHVybiBzdXBlci5mZWF0dXJlRXhpc3RzKGdldENoaWxkKGVtZk9iamVjdCkpOworCX0KKworCXB1YmxpYyB2b2lkIGNsZWFyTGlzdChFT2JqZWN0IG1vZk9iamVjdCkgeworCQlzdXBlci5jbGVhckxpc3QoZ2V0Q2hpbGQobW9mT2JqZWN0KSk7CisJfQorCisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyRE9NQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTUFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzgyZWExCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTUFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCisgKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOworCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisKK3B1YmxpYyBpbnRlcmZhY2UgRU1GMkRPTUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVyIHsKKworCisJQ2xhc3MgQURBUFRFUl9DTEFTUyA9IEVNRjJET01BZGFwdGVyLmNsYXNzOworCisJLyoqCisJICogUmV0dXJuIHRoZSBET00gbm9kZSB0aGF0IHRoZSB0YXJnZXQgb2YgdGhpcyBhZGFwdGVyIG1hcHMgdG8uIElmIHRoZSB0YXJnZXQgTU9GIG9iamVjdCBtYXBzIHRvCisJICogbW9yZSB0aGFuIG9uZSBET00gbm9kZSwgdGhpcyBub2RlIGlzIHRoZSB0b3AtbW9zdCBub2RlLgorCSAqLworCU5vZGUgZ2V0Tm9kZSgpOworCisJdm9pZCBzZXROb2RlKE5vZGUgYU5vZGUpOworCisJLyoqCisJICogU2V0IHRvIGZhbHNlIGFuZCBub3RpZmljYXRpb24gb2YgY2hhbmdlcyBmcm9tIGJvdGggdGhlIERPTSBub2RlIGFuZCB0aGUgTU9GIG9iamVjdCB3aWxsIGJlCisJICogaWdub3JlZC4KKwkgKi8KKwlib29sZWFuIGlzTm90aWZpY2F0aW9uRW5hYmxlZCgpOworCisJLyoqCisJICogU2V0IHRvIGZhbHNlIGFuZCBub3RpZmljYXRpb24gb2YgY2hhbmdlcyBmcm9tIGJvdGggdGhlIERPTSBub2RlIGFuZCB0aGUgTU9GIG9iamVjdCB3aWxsIGJlCisJICogaWdub3JlZC4KKwkgKi8KKwl2b2lkIHNldE5vdGlmaWNhdGlvbkVuYWJsZWQoYm9vbGVhbiBpc0VuYWJsZWQpOworCisJLyoqCisJICogVXBkYXRlcyB0aGUgRE9NIHRyZWUgZm9yIHRoaXMgYWRhcHRlciBmcm9tIHRoZSBjdXJyZW50IHZhbHVlcyBvZiB0aGUgTU9GIE9iamVjdC4gVGhpcyBtZXRob2QKKwkgKiB1cGRhdGVzIEFMTCB0aGUgRE9NIG5vZGVzIGZyb20gYWxsIHRoZSBNT0YgYXR0cmlidXRlcy4KKwkgKi8KKwl2b2lkIHVwZGF0ZURPTSgpOworCisJLyoqCisJICogVXBkYXRlcyB0aGUgTU9GIE9iamVjdCBmcm9tIHRoZSBET00gdHJlZS4gQWxsIHRoZSBjaGlsZHJlbiBvZiB0aGUgRE9NIHRyZWUgYXJlIHVwZGF0ZWQgaW50bworCSAqIHRoZSBNT0Ygb2JqZWN0LgorCSAqLworCXZvaWQgdXBkYXRlTU9GKCk7CisKKwlwdWJsaWMgdm9pZCB1cGRhdGVET01GZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KTsKKworCXB1YmxpYyB2b2lkIHVwZGF0ZU1PRkZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpOworCisJRU9iamVjdCBnZXRFT2JqZWN0KCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdHJ1ZSBpZiBNT0Ygb2JqZWN0IGlzIGEgcHJveHkuCisJICovCisJYm9vbGVhbiBpc01PRlByb3h5KCk7CisKKwkvKioKKwkgKiBSZW1vdmUgdGhlIERPTSBhZGFwdGVycyBmcm9tIHRoZSBub2RlIEFORCBhbGwgaXRzIGNoaWxkIG5vZGVzLCByZWN1cnNpdmVseS4KKwkgKi8KKwl2b2lkIHJlbW92ZUFkYXB0ZXJzKE5vZGUgbm9kZSk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTUFkYXB0ZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyRE9NQWRhcHRlckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjRjNzI3Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTUFkYXB0ZXJJbXBsLmphdmEKQEAgLTAsMCArMSwxODAyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuQXNzZXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5ET01VdGlsaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV0b29sc0NvcHlTZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FeHRlbmRlZEVjb3JlVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuUmV2aXNpdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuU3RyaW5nVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuVHJhbnNsYXRvclNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLldGVFV0aWxzUmVzb3VyY2VIYW5kbGVyOworaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CitpbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKKworCitwdWJsaWMgY2xhc3MgRU1GMkRPTUFkYXB0ZXJJbXBsIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBFTUYyRE9NQWRhcHRlciB7CisKKwlmaW5hbCBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gZkRlYnVnID0gZmFsc2U7CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBmTm90aWZpY2F0aW9uRW5hYmxlZCA9IHRydWU7CisKKwlwcm90ZWN0ZWQgTm9kZSBmTm9kZTsKKworCXByb3RlY3RlZCBUcmFuc2xhdG9yIGZUcmFuc2xhdG9yOworCisJcHJvdGVjdGVkIEVNRjJET01SZW5kZXJlciBmUmVuZGVyZXI7CisKKwlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNoaWxkVHJhbnNsYXRvcnM7CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Jvb3QgPSBmYWxzZTsKKwkKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk0gPSAib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJU1JVTk5JTkcgPSAiaXNSdW5uaW5nIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBjbGFzcyBEZXBlbmRlbmN5QWRhcHRlciBleHRlbmRzIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwgeworCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZID0gIkVNRjJET01EZXBlbmRlbmN5QWRhcHRlciI7IC8vJE5PTi1OTFMtMSQKKworCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKKwkJCUVNRjJET01BZGFwdGVySW1wbC50aGlzLm5vdGlmeUNoYW5nZWQobXNnKTsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjaXNBZGFwdGVyRm9yVHlwZShPYmplY3QpCisJCSAqLworCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7CisJCQlyZXR1cm4gS0VZLmVxdWFscyh0eXBlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yIGZvciByb290IGFkYXB0ZXJzLgorCSAqLworCXB1YmxpYyBFTUYyRE9NQWRhcHRlckltcGwoVHJhbnNsYXRvclJlc291cmNlIHJlc291cmNlLCBEb2N1bWVudCBkb2N1bWVudCwgRU1GMkRPTVJlbmRlcmVyIHJlbmRlcmVyLCBUcmFuc2xhdG9yIHRyYW5zbGF0b3IpIHsKKwkJdGhpcygoTm90aWZpZXIpIHJlc291cmNlLCAoTm9kZSkgZG9jdW1lbnQsIHJlbmRlcmVyLCB0cmFuc2xhdG9yKTsKKwkJaXNSb290ID0gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3QgYW4gQWRhcHRlciBnaXZlbiBhbiBFT2JqZWN0IGFuZCBhIG5vZGUKKwkgKi8KKwlwdWJsaWMgRU1GMkRPTUFkYXB0ZXJJbXBsKE5vdGlmaWVyIG9iamVjdCwgTm9kZSBub2RlLCBFTUYyRE9NUmVuZGVyZXIgcmVuZGVyZXIsIFRyYW5zbGF0b3IgdHJhbnNsYXRvcikgeworCQlzdXBlcigpOworCQlzZXRUYXJnZXQob2JqZWN0KTsKKwkJZk5vZGUgPSBub2RlOworCQlmUmVuZGVyZXIgPSByZW5kZXJlcjsKKwkJZlRyYW5zbGF0b3IgPSB0cmFuc2xhdG9yOworCQlpbml0Q2hpbGRUcmFuc2xhdG9ycygpOworCQlhZGRFTUZBZGFwdGVyKCk7CisJCWFkZERPTUFkYXB0ZXIoKTsKKwkJYWRkRGVwZW5kZW5jeUFkYXB0ZXJJZk5lY2Vzc2FyeSgpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZyb20gYSBET00gTm9kZS4gVGhlIEVPYmplY3Qgd2lsbCBiZSBjcmVhdGVkCisJICovCisJcHVibGljIEVNRjJET01BZGFwdGVySW1wbChOb2RlIG5vZGUsIEVNRjJET01SZW5kZXJlciByZW5kZXJlciwgVHJhbnNsYXRvciB0cmFuc2xhdG9yKSB7CisJCWZOb2RlID0gbm9kZTsKKwkJZlJlbmRlcmVyID0gcmVuZGVyZXI7CisJCWZUcmFuc2xhdG9yID0gdHJhbnNsYXRvcjsKKwkJc2V0VGFyZ2V0RnJvbU5vZGUoKTsKKwkJaW5pdENoaWxkVHJhbnNsYXRvcnMoKTsKKwkJYWRkRU1GQWRhcHRlcigpOworCQlhZGRET01BZGFwdGVyKCk7CisJCWFkZERlcGVuZGVuY3lBZGFwdGVySWZOZWNlc3NhcnkoKTsKKworCX0KKworCXByb3RlY3RlZCB2b2lkIGFkZERlcGVuZGVuY3lBZGFwdGVySWZOZWNlc3NhcnkoKSB7CisJCWlmICghZlRyYW5zbGF0b3IuaXNEZXBlbmRlbmN5UGFyZW50KCkpCisJCQlyZXR1cm47CisJCUVPYmplY3QgY2hpbGQgPSBmVHJhbnNsYXRvci5iYXNpY0dldERlcGVuZGVuY3lPYmplY3QoZ2V0RU9iamVjdCgpKTsKKwkJaWYgKGNoaWxkICE9IG51bGwpCisJCQlhZGREZXBlbmRlbmN5QWRhcHRlcihjaGlsZCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgaW5pdENoaWxkVHJhbnNsYXRvcnMoKSB7CisJCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7CisJCWJvb2xlYW4gaXNSdW5uaW5nID0gZmFsc2U7IC8vaXMgdGhlIE9TR0kgcGxhdGZvcm0gcnVubmluZyA/CisJCXRyeSB7CisJCQkvLyBJZiB0aGUgUGxhdGZvcm0gY2xhc3MgY2FuIGJlIGZvdW5kLCB0aGVuIGNvbnRpbnVlIHRvIGNoZWNrIGlmIHRoZSBPU0dJIHBsYXRmb3JtIGlzIHJ1bm5pbmcKKwkJCUNsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShQTEFURk9STSk7CisJCQlNZXRob2QgbSA9IGNsYXp6LmdldE1ldGhvZChJU1JVTk5JTkcsIG51bGwpOworCQkJaXNSdW5uaW5nID0gKChCb29sZWFuKW0uaW52b2tlKGNsYXp6LCBudWxsKSkuYm9vbGVhblZhbHVlKCk7CisJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworCQkgICAgIC8vIElnbm9yZSBiZWNhdXNlIHRoaXMgbXVzdCBiZSBpbiBhIG5vbl9PU0dJIGVudmlyb25tZW50CisJCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKwkJCSAvLyBJZ25vcmUgYmVjYXVzZSB0aGlzIG11c3QgYmUgaW4gYSBub25fT1NHSSBlbnZpcm9ubWVudAorCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworCQkJIC8vIElnbm9yZSBiZWNhdXNlIHRoaXMgbXVzdCBiZSBpbiBhIG5vbl9PU0dJIGVudmlyb25tZW50CisJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisJCQkgLy8gSWdub3JlIGJlY2F1c2UgdGhpcyBtdXN0IGJlIGluIGEgbm9uX09TR0kgZW52aXJvbm1lbnQKKwkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisJCQkgLy8gSWdub3JlIGJlY2F1c2UgdGhpcyBtdXN0IGJlIGluIGEgbm9uX09TR0kgZW52aXJvbm1lbnQKKwkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisJCQkgLy8gSWdub3JlIGJlY2F1c2UgdGhpcyBtdXN0IGJlIGluIGEgbm9uX09TR0kgZW52aXJvbm1lbnQKKwkJfQkKKwkJLy9DaGVjayBmb3IgZXh0ZW5kZWQgY2hpbGQgdHJhbnNsYXRvcnMgYmVjYXVzZSB3ZSBhcmUgaW4gT1NHSSBtb2RlCisJCWlmIChpc1J1bm5pbmcpIHsKKwkJCVRyYW5zbGF0b3JbXSBleHRlbmRlZENoaWxkcmVuID0gVHJhbnNsYXRvclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRUcmFuc2xhdG9ycygpOworCSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbmRlZENoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJICAgICAgICAJaWYgKGV4dGVuZGVkQ2hpbGRyZW5baV0gIT0gbnVsbCkKKwkgICAgICAgICAgICAJY2hpbGRyZW4uYWRkKGV4dGVuZGVkQ2hpbGRyZW5baV0pOworCSAgICAgICAgfQorCQl9CisJCQorCQkKKwkJY2hpbGRyZW4uYWRkQWxsKEFycmF5cy5hc0xpc3QoZlRyYW5zbGF0b3IuZ2V0Q2hpbGRyZW4oZ2V0VGFyZ2V0KCksIGZSZW5kZXJlci5nZXRWZXJzaW9uSUQoKSkpKTsKKworCQlWYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5IGZhY3RvcnkgPSBmVHJhbnNsYXRvci5nZXRWYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5KCk7CisJCWlmIChmYWN0b3J5ICE9IG51bGwpIHsKKwkJCVN0cmluZyBkb21OYW1lID0gbnVsbDsKKwkJCU5hbWVkTm9kZU1hcCBtYXAgPSBmTm9kZS5nZXRBdHRyaWJ1dGVzKCk7CisKKwkJCWlmIChtYXAgIT0gbnVsbCkgeworCQkJCWludCBsZW5ndGggPSBtYXAuZ2V0TGVuZ3RoKCk7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkJCQlOb2RlIGF0dHJOb2RlID0gbWFwLml0ZW0oaSk7CisJCQkJCWRvbU5hbWUgPSBhdHRyTm9kZS5nZXROb2RlTmFtZSgpOworCQkJCQkvL0hhbmRsZSB2YXJpYWJsZSB0cmFuc2xhdG9ycworCQkJCQlUcmFuc2xhdG9yIHQgPSBmVHJhbnNsYXRvci5maW5kQ2hpbGQoZG9tTmFtZSwgZ2V0VGFyZ2V0KCksIGZSZW5kZXJlci5nZXRWZXJzaW9uSUQoKSk7CisJCQkJCWlmICh0ICE9IG51bGwgJiYgIWNoaWxkcmVuLmNvbnRhaW5zKHQpKQorCQkJCQkJY2hpbGRyZW4uYWRkKHQpOworCQkJCX0KKwkJCX0KKwkJCUxpc3QgY2hpbGRyZW5Gcm9tRU1GID0gZmFjdG9yeS5jcmVhdGUoZ2V0VGFyZ2V0KCkpOworCQkJaWYgKGNoaWxkcmVuRnJvbUVNRiAhPSBudWxsKQorCQkJCWNoaWxkcmVuLmFkZEFsbChjaGlsZHJlbkZyb21FTUYpOworCQl9CisKKwkJY2hpbGRUcmFuc2xhdG9ycyA9IChUcmFuc2xhdG9yW10pIGNoaWxkcmVuLnRvQXJyYXkobmV3IFRyYW5zbGF0b3JbY2hpbGRyZW4uc2l6ZSgpXSk7CisJfQorCisJLyoqCisJICogU2V0IHRvIGZhbHNlIGFuZCBub3RpZmljYXRpb24gb2YgY2hhbmdlcyBmcm9tIGJvdGggdGhlIERPTSBub2RlIGFuZCB0aGUgTU9GIG9iamVjdCB3aWxsIGJlCisJICogaWdub3JlZC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc05vdGlmaWNhdGlvbkVuYWJsZWQoKSB7CisJCXJldHVybiBmTm90aWZpY2F0aW9uRW5hYmxlZDsKKwl9CisKKwkvKioKKwkgKiBTZXQgdG8gZmFsc2UgYW5kIG5vdGlmaWNhdGlvbiBvZiBjaGFuZ2VzIGZyb20gYm90aCB0aGUgRE9NIG5vZGUgYW5kIHRoZSBNT0Ygb2JqZWN0IHdpbGwgYmUKKwkgKiBpZ25vcmVkLgorCSAqLworCXB1YmxpYyB2b2lkIHNldE5vdGlmaWNhdGlvbkVuYWJsZWQoYm9vbGVhbiBpc0VuYWJsZWQpIHsKKwkJZk5vdGlmaWNhdGlvbkVuYWJsZWQgPSBpc0VuYWJsZWQ7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgeworCQlyZXR1cm4gRU1GMkRPTUFkYXB0ZXIuQURBUFRFUl9DTEFTUyA9PSB0eXBlOworCX0KKworCXByb3RlY3RlZCB2b2lkIGFkZEVNRkFkYXB0ZXIoKSB7CisJCXRhcmdldC5lQWRhcHRlcnMoKS5hZGQodGhpcyk7CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlzYi5hcHBlbmQoc2hvcnRDbGFzc05hbWUodGhpcykpOworCQlzYi5hcHBlbmQoJygnKTsKKwkJc2IuYXBwZW5kKGdldE5vZGUoKS5nZXROb2RlTmFtZSgpKTsKKwkJc2IuYXBwZW5kKCcsJyk7CisJCXNiLmFwcGVuZChzaG9ydENsYXNzTmFtZShnZXRUYXJnZXQoKSkpOworCQlzYi5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBzaG9ydENsYXNzTmFtZShPYmplY3QgbykgeworCQlpZiAobyAhPSBudWxsKSB7CisJCQlTdHJpbmcgY24gPSBvLmdldENsYXNzKCkuZ2V0TmFtZSgpOworCQkJaW50IGkgPSBjbi5sYXN0SW5kZXhPZignLicpOworCQkJcmV0dXJuIGNuLnN1YnN0cmluZyhpICsgMSwgY24ubGVuZ3RoKCkpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qCisJICogUHJpbnRzIG91dCBhIE1PRiBub3RpZmljYXRpb24gZm9yIGRlYnVnZ2luZworCSAqLworCXByb3RlY3RlZCB2b2lkIGRlYnVnTU9GTm90aWZ5KE5vdGlmaWNhdGlvbiBtc2cpIHsKKwkJaWYgKGZEZWJ1ZykgeworCQkJU3RyaW5nIG5vdGlmVHlwZSA9ICIiOyAvLyROT04tTkxTLTEkCisJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgeworCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERCA6CisJCQkJCW5vdGlmVHlwZSA9ICJBREQiOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRSA6CisJCQkJCW5vdGlmVHlwZSA9ICJSRU1PVkUiOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZIDoKKwkJCQkJbm90aWZUeXBlID0gIkFERF9NQU5ZIjsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWSA6CisJCQkJCW5vdGlmVHlwZSA9ICJSRU1PVkVfTUFOWSI7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBOb3RpZmljYXRpb24uU0VUIDogeworCQkJCQlpZiAobXNnLmdldFBvc2l0aW9uKCkgPT0gTm90aWZpY2F0aW9uLk5PX0lOREVYKQorCQkJCQkJbm90aWZUeXBlID0gIlJFUExBQ0UiOyAvLyROT04tTkxTLTEkCisJCQkJCWVsc2UKKwkJCQkJCW5vdGlmVHlwZSA9ICJTRVQiOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljYXNlIE5vdGlmaWNhdGlvbi5VTlNFVCA6CisJCQkJCW5vdGlmVHlwZSA9ICJVTlNFVCI7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQl9CisKKwkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIk1PRiBDaGFuZ2U6ICIgKyBub3RpZlR5cGUpOyAvLyROT04tTkxTLTEkCisJCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJcdG5vdGlmaWVyICAgICAgOiAiICsgbXNnLmdldE5vdGlmaWVyKCkpOyAvLyROT04tTkxTLTEkCisJCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJcdGNoYW5nZWRGZWF0dXJlOiAiICsgbXNnLmdldEZlYXR1cmUoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlx0b2xkVmFsdWUgICAgICA6ICIgKyBtc2cuZ2V0T2xkVmFsdWUoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlx0bmV3VmFsdWUgICAgICA6ICIgKyBtc2cuZ2V0TmV3VmFsdWUoKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKworCS8qCisJICogT3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY3JlYXRlIHRoZSBmZWF0dXJlIG1hcHMgZm9yIHRoZSBhZGFwdGVyLgorCSAqLworCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRUcmFuc2xhdG9ycygpIHsKKwkJcmV0dXJuIGNoaWxkVHJhbnNsYXRvcnM7CisJfQorCisJcHJvdGVjdGVkIFRyYW5zbGF0b3IgZmluZFRyYW5zbGF0b3IoTm90aWZpY2F0aW9uIG5vdCkgeworCQlpZiAobm90LmdldEZlYXR1cmUoKSA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCVRyYW5zbGF0b3JbXSBtYXBzID0gZ2V0Q2hpbGRUcmFuc2xhdG9ycygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcHMubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChtYXBzW2ldLmlzTWFwRm9yKG5vdC5nZXRGZWF0dXJlKCksIG5vdC5nZXRPbGRWYWx1ZSgpLCBub3QuZ2V0TmV3VmFsdWUoKSkpCisJCQkJcmV0dXJuIG1hcHNbaV07CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogVXBkYXRlIGFsbCB0aGUgY2hpbGRyZW4gb2YgdGhlIHRhcmdldCBNT0Ygb2JqZWN0IGluIHRoZSByZWxhdGlvbnNoaXAgZGVzY3JpYmVkIGJ5CisJICogCisJICogQG1hcC4KKwkgKiAKKwkgKiBAcGFyYW0gbWFwCisJICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5tb2YyZG9tLkF0dHJpYnV0ZVRyYW5zbGF0b3IgRGVzY3JpYmVzIHRoZSBtYXBwaW5nIGZyb20gdGhlIE1PRgorCSAqICAgICAgICAgICAgYXR0cmlidXRlIG5hbWUgdG8gdGhlIERPTSBub2RlIG5hbWUKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBwcmltVXBkYXRlRE9NTXVsdGlGZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIExpc3QgbW9mQ2hpbGRyZW4sIExpc3QgZG9tQ2hpbGRyZW4sIE5vdGlmaWVyIG93bmVyKSB7CisKKwkJLy9Vc2VkIGZvciBpbnNlcnRpbmcgcHJpbWl0aXZlcworCQlMaXN0IGlub3JkZXJET01DaGlsZHJlbiA9IG51bGw7CisJCWlmICghbWFwLmlzT2JqZWN0TWFwKCkgfHwgbWFwLmlzTWFuYWdlZEJ5UGFyZW50KCkpIHsKKwkJCWlub3JkZXJET01DaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCWlub3JkZXJET01DaGlsZHJlbi5hZGRBbGwoZG9tQ2hpbGRyZW4pOworCQl9CisJCU5vZGUgcGFyZW50ID0gZmluZERPTVBhdGgobm9kZSwgbWFwLCBmYWxzZSk7CisKKwkJLy8gR28gdGhvdWdoIHRoZSBNT0YgY2hpbGRyZW4gY2hlY2tpbmcgdG8gc2VlIGlmIHRoZSBjb3JyZXNwb25kaW5nCisJCS8vIE1PRiBBZGFwdGVyIGNoaWxkcmVuIGV4aXN0cy4gSWYgbm90LCBjcmVhdGUgdGhlIGFkYXB0ZXIuCisJCS8vIEFsc28gaGFuZGxlcyByZW9yZGVyaW5nIGNoaWxkcmVuIHRoYXQgaGF2ZSBtb3ZlZC4KKwkJaW50IGkgPSAwOworCQlmb3IgKDsgaSA8IG1vZkNoaWxkcmVuLnNpemUoKTsgaSsrKSB7CisJCQlPYmplY3QgY2hpbGQgPSBtb2ZDaGlsZHJlbi5nZXQoaSk7CisJCQlFT2JqZWN0IG1vZkNoaWxkID0gbnVsbDsKKworCQkJRU1GMkRPTUFkYXB0ZXIgYWRhcHRlciA9IG51bGw7CisKKwkJCS8vIENoZWNrIHRvIHNlZSBpZiB0aGUgY2hpbGQgaXMgYSBNT0YgT2JqZWN0LgorCQkJaWYgKCFtYXAuaXNNYW5hZ2VkQnlQYXJlbnQoKSAmJiBjaGlsZCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKKwkJCQltb2ZDaGlsZCA9IChFT2JqZWN0KSBtb2ZDaGlsZHJlbi5nZXQoaSk7CisJCQkJYWRhcHRlciA9IGdldEV4aXN0aW5nQWRhcHRlcihtb2ZDaGlsZCk7CisJCQl9CisKKwkJCWlmIChhZGFwdGVyICE9IG51bGwgJiYgaSA8IGRvbUNoaWxkcmVuLnNpemUoKSAmJiBkb21DaGlsZHJlbi5nZXQoaSkgPT0gYWRhcHRlci5nZXROb2RlKCkpCisJCQkJY29udGludWU7CisJCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7CisJCQkJaWYgKGRvbUNoaWxkcmVuLmlzRW1wdHkoKSkKKwkJCQkJY29udGludWU7CisJCQkJLy8gQSBub2RlIGhhcyBiZWVuIHJlb3JkZXJlZCBpbiB0aGUgbGlzdAorCQkJCU5vZGUgcmVvcmRlck5vZGUgPSBhZGFwdGVyLmdldE5vZGUoKTsKKwkJCQlOb2RlIGluc2VydEJlZm9yZU5vZGUgPSByZW9yZGVyTm9kZTsKKwkJCQlpZiAoaSA8IGRvbUNoaWxkcmVuLnNpemUoKSAmJiBkb21DaGlsZHJlbi5nZXQoaSkgIT0gcmVvcmRlck5vZGUpIHsKKwkJCQkJaW5zZXJ0QmVmb3JlTm9kZSA9IChOb2RlKSBkb21DaGlsZHJlbi5nZXQoaSk7CisJCQkJfQorCQkJCWRvbUNoaWxkcmVuLnJlbW92ZShyZW9yZGVyTm9kZSk7CisJCQkJZG9tQ2hpbGRyZW4uYWRkKGksIHJlb3JkZXJOb2RlKTsKKwkJCQlpZiAocmVvcmRlck5vZGUgIT0gaW5zZXJ0QmVmb3JlTm9kZSkgeworCQkJCQlyZW9yZGVyRE9NQ2hpbGQocGFyZW50LCByZW9yZGVyTm9kZSwgaW5zZXJ0QmVmb3JlTm9kZSwgbWFwKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8vIEEgbmV3IG5vZGUgaGFzIGJlZW4gYWRkZWQsIGNyZWF0ZSBpdAorCQkJCXBhcmVudCA9IGNyZWF0ZURPTVBhdGgobm9kZSwgbWFwKTsKKwkJCQlpZiAobW9mQ2hpbGQgIT0gbnVsbCkgeworCQkJCQlhZGFwdGVyID0gY3JlYXRlQWRhcHRlcihtb2ZDaGlsZCwgbWFwKTsKKwkJCQkJTm9kZSBuZXdOb2RlID0gYWRhcHRlci5nZXROb2RlKCk7CisJCQkJCU5vZGUgaW5zZXJ0QmVmb3JlTm9kZSA9IGZpbmRJbnNlcnRCZWZvcmVOb2RlKHBhcmVudCwgbWFwLCBtb2ZDaGlsZHJlbiwgaSwgZG9tQ2hpbGRyZW4pOworCQkJCQlET01VdGlsaXRpZXMuaW5zZXJ0QmVmb3JlTm9kZUFuZFdoaXRlc3BhY2UocGFyZW50LCBuZXdOb2RlLCBpbnNlcnRCZWZvcmVOb2RlKTsKKwkJCQkJZG9tQ2hpbGRyZW4uYWRkKGksIG5ld05vZGUpOworCQkJCQlib29sZWFuIG5vdGlmaWNhdGlvbkZsYWcgPSBhZGFwdGVyLmlzTm90aWZpY2F0aW9uRW5hYmxlZCgpOworCQkJCQlhZGFwdGVyLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOworCQkJCQl0cnkgeworCQkJCQkJaW5kZW50KG5ld05vZGUsIG1hcCk7CisJCQkJCX0gZmluYWxseSB7CisJCQkJCQlhZGFwdGVyLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQobm90aWZpY2F0aW9uRmxhZyk7CisJCQkJCX0KKwkJCQkJYWRhcHRlci51cGRhdGVET00oKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvLyBUaGUgbW9mIGZlYXR1cmUgaXMgYSBjb2xsZWN0aW9uIG9mIHByaW1pdGl2ZXMuCisJCQkJCS8vIGNyZWF0ZSBhIG5ldyBkb20gbm9kZSBhbmQgbGlzdGVuIHRvIGl0LgorCQkJCQlFbGVtZW50IG5ld05vZGUgPSBjcmVhdGVOZXdOb2RlKG51bGwsIG1hcCk7CisJCQkJCU5vZGUgaW5zZXJ0QmVmb3JlTm9kZSA9IGZpbmRJbnNlcnRCZWZvcmVOb2RlKHBhcmVudCwgbWFwLCBtb2ZDaGlsZHJlbiwgaSwgaW5vcmRlckRPTUNoaWxkcmVuKTsKKwkJCQkJRE9NVXRpbGl0aWVzLmluc2VydEJlZm9yZU5vZGVBbmRXaGl0ZXNwYWNlKHBhcmVudCwgbmV3Tm9kZSwgaW5zZXJ0QmVmb3JlTm9kZSk7CisJCQkJCWluZGVudChuZXdOb2RlLCBtYXApOworCQkJCQlhZGRET01BZGFwdGVyKG5ld05vZGUpOyAvLyBIb29rIHVwIGxpc3RlbmVycworCQkJCQlkb21DaGlsZHJlbi5hZGQoaSwgbmV3Tm9kZSk7CisJCQkJCWlub3JkZXJET01DaGlsZHJlbi5hZGQobmV3Tm9kZSk7CisJCQkJCVRleHQgbmV3VGV4dCA9IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUobWFwLmNvbnZlcnRWYWx1ZVRvU3RyaW5nKGNoaWxkLCAoRU9iamVjdCkgb3duZXIpKTsKKwkJCQkJRE9NVXRpbGl0aWVzLmluc2VydEJlZm9yZU5vZGUobmV3Tm9kZSwgbmV3VGV4dCwgbnVsbCk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gUmVtb3ZlIGFueSByZW1haW5pbmcgYWRhcHRlcnMuCisJCWZvciAoOyBpIDwgZG9tQ2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKKwkJCXJlbW92ZURPTUNoaWxkKHBhcmVudCwgKEVsZW1lbnQpIGRvbUNoaWxkcmVuLmdldChpKSk7CisJCX0KKworCQkvLyBJZiB0aGVyZSBhcmUgbm8gTU9GIGNoaWxkcmVuLCByZW1vdmUgYW55IHVubmVjZXNzYXJ5IERPTSBub2RlIHBhdGhzCisJCWlmIChtb2ZDaGlsZHJlbi5zaXplKCkgPT0gMCAmJiBtYXAuaGFzRE9NUGF0aCgpKSB7CisJCQlpZiAobWFwLnNob3VsZFJlbmRlckVtcHR5RE9NUGF0aCgoRU9iamVjdCkgb3duZXIpKQorCQkJCWNyZWF0ZURPTVBhdGgobm9kZSwgbWFwKTsKKwkJCWVsc2UKKwkJCQlyZW1vdmVET01QYXRoKG5vZGUsIG1hcCk7CisJCX0KKworCX0KKworCS8qKgorCSAqIFVwZGF0ZSBhbGwgdGhlIGNoaWxkcmVuIG9mIHRoZSB0YXJnZXQgTU9GIG9iamVjdCBpbiB0aGUgcmVsYXRpb25zaGlwIGRlc2NyaWJlZCBieQorCSAqIAorCSAqIEBtYXAuCisJICogCisJICogQHBhcmFtIG1hcAorCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMubW9mMmRvbS5BdHRyaWJ1dGVUcmFuc2xhdG9yIERlc2NyaWJlcyB0aGUgbWFwcGluZyBmcm9tIHRoZSBNT0YKKwkgKiAgICAgICAgICAgIGF0dHJpYnV0ZSBuYW1lIHRvIHRoZSBET00gbm9kZSBuYW1lCisJICovCisJcHJvdGVjdGVkIHZvaWQgcHJpbVVwZGF0ZU1PRk11bHRpRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBMaXN0IG1vZkNoaWxkcmVuLCBMaXN0IGRvbUNoaWxyZW4pIHsKKworCQlIYXNodGFibGUgbm9kZVRvQWRhcHRlciA9IG5ldyBIYXNodGFibGUoKTsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZkNoaWxkcmVuLnNpemUoKTsgaSsrKSB7CisJCQlFTUYyRE9NQWRhcHRlciBhZGFwdGVyID0gZ2V0RXhpc3RpbmdBZGFwdGVyKChFT2JqZWN0KSBtb2ZDaGlsZHJlbi5nZXQoaSkpOworCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKKwkJCQlub2RlVG9BZGFwdGVyLnB1dChhZGFwdGVyLmdldE5vZGUoKSwgYWRhcHRlcik7CisJCX0KKworCQkvLyBHbyB0aG91Z2ggdGhlIERPTSBjaGlsZHJlbiBjaGVja2luZyB0byBzZWUgaWYgdGhlIGNvcnJlc3BvbmRpbmcKKwkJLy8gTU9GIEFkYXB0ZXIgY2hpbGRyZW4gZXhpc3RzLiBJZiBub3QsIGNyZWF0ZSB0aGUgYWRhcHRlci4KKwkJLy8gQWxzbyBoYW5kbGVzIHJlb3JkZXJpbmcgY2hpbGRyZW4gdGhhdCBoYXZlIG1vdmVkLgorCQlpbnQgaSA9IDA7CisJCWludCBtb2ZJbmRleCA9IDA7CisJCUxpc3QgYWRhcHRlcnNUb1VwZGF0ZSA9IG5ldyBBcnJheUxpc3QoKTsKKwkJZm9yICg7IGkgPCBkb21DaGlscmVuLnNpemUoKTsgaSsrKSB7CisJCQlFbGVtZW50IGNoaWxkTm9kZSA9IChFbGVtZW50KSBkb21DaGlscmVuLmdldChpKTsKKwkJCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSBpIDwgbW9mQ2hpbGRyZW4uc2l6ZSgpID8gZ2V0RXhpc3RpbmdBZGFwdGVyKChFT2JqZWN0KSBtb2ZDaGlsZHJlbi5nZXQoaSkpIDogbnVsbDsKKwkJCWlmIChhZGFwdGVyICE9IG51bGwgJiYgIWFkYXB0ZXIuaXNNT0ZQcm94eSgpICYmIGFkYXB0ZXIuZ2V0Tm9kZSgpID09IGNoaWxkTm9kZSkgeworCQkJCS8vIEJlY2F1c2UgdGhlIGFkYXB0ZXIgaXMgcHJvY2Vzc2luZyBTVFJVQ1RVUkVfQ0hBTkdFRCBmcm9tIHRoZQorCQkJCS8vIERPTSwgd2UKKwkJCQkvLyBtdXN0IHVwZGF0ZSBhbGwgdGhlIHdheSBkb3duIHRoZSB0cmVlIHNpbmNlIGFueXRoaW5nIHVuZGVyCisJCQkJLy8gdGhlIG5vdGlmeWluZworCQkJCS8vIERPTSBub2RlIGNvdWxkIGhhdmUgY2hhbmdlZC4KKwkJCQlhZGFwdGVyLnVwZGF0ZU1PRigpOworCQkJCW1vZkluZGV4Kys7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWFkYXB0ZXIgPSAoRU1GMkRPTUFkYXB0ZXIpIG5vZGVUb0FkYXB0ZXIuZ2V0KGNoaWxkTm9kZSk7CisJCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7CisJCQkJcmVvcmRlcklmTmVjZXNzYXJ5KChFTGlzdCkgbW9mQ2hpbGRyZW4sIGFkYXB0ZXIuZ2V0RU9iamVjdCgpLCBtb2ZJbmRleCk7CisJCQkJbW9mSW5kZXgrKzsKKwkJCX0gZWxzZSB7CisJCQkJYWRhcHRlciA9IGNyZWF0ZUFkYXB0ZXIoY2hpbGROb2RlLCBtYXApOworCQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKKwkJCQkJdHJ5IHsKKwkJCQkJCS8vV2UgZG9uJ3Qgd2FudCB0byBwdXNoIGFueXRoaW5nIGJhY2sgdG8gdGhlIGNoaWxkIGRvbQorCQkJCQkJYWRhcHRlci5zZXROb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKKwkJCQkJCW1hcC5zZXRNT0ZWYWx1ZShnZXRUYXJnZXQoKSwgYWRhcHRlci5nZXRUYXJnZXQoKSwgbW9mSW5kZXgpOworCQkJCQl9IGZpbmFsbHkgeworCQkJCQkJYWRhcHRlci5zZXROb3RpZmljYXRpb25FbmFibGVkKHRydWUpOworCQkJCQl9CisKKwkJCQkJYWRhcHRlcnNUb1VwZGF0ZS5hZGQoYWRhcHRlcik7CisJCQkJCW1vZkluZGV4Kys7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gUmVtb3ZlIGFueSByZW1haW5pbmcgYWRhcHRlcnMuCisJCS8vbWFrZSBhIGNvcHkgc28gd2UgcmVtb3ZlIGFsbCBpdGVtcyAtIGJ1ZyAxOTI0NjggCisJCQkJT2JqZWN0W10gY2hpbGRyZW5BcnJheSA9IG1vZkNoaWxkcmVuLnRvQXJyYXkoKTsKKwkJCQlmb3IgKDsgaSA8IGNoaWxkcmVuQXJyYXkubGVuZ3RoOyBpKyspIHsKKwkJCQkJcmVtb3ZlTU9GVmFsdWUoKEVPYmplY3QpIGNoaWxkcmVuQXJyYXlbaV0sIG1hcCk7CisJCSAJCX0KKworCQkvLyBUaGUgYWRhcHRlcnMgY2Fubm90IGJlIHVwZGF0ZWQgYXMgdGhleSBjcmVhdGVkLiBXZSBtdXN0IHdhaXQgdW50aWwKKwkJLy8gYWxsIG9mIHRoZSBhZGFwdGVycyBhcmUgY3JlYXRlZCBhbmQgcmVtb3ZlZCBiZWZvcmUgdXBkYXRpbmcsCisJCS8vIG90aGVyd2lzZQorCQkvLyB3ZSBjYW4gZ2V0IGluIGEgc3RhdGUgd2hlcmUgdGhlcmUgYXJlIGFkYXB0ZXJzIGZpZ2h0aW5nIHdpdGgKKwkJLy8gZWFjaG90aGVyCisJCS8vIChvbmUgZm9yIHRoZSBvbGQgbm9kZSBhbmQgb25lIGZvciB0aGUgbmV3IG5vZGUpLgorCQlmb3IgKGludCBqID0gMDsgaiA8IGFkYXB0ZXJzVG9VcGRhdGUuc2l6ZSgpOyBqKyspIHsKKwkJCSgoRU1GMkRPTUFkYXB0ZXIpIGFkYXB0ZXJzVG9VcGRhdGUuZ2V0KGopKS51cGRhdGVNT0YoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJlbW92ZXMgYSBmZWF0dXJlJ3MgdmFsdWUuCisJICogCisJICogQHBhcmFtIGNoaWxkQWRhcHRlcgorCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMubW9mMmRvbS5FTUYyRE9NQWRhcHRlciBUaGUgY2hpbGQgdG8gcmVtb3ZlCisJICogQHBhcmFtIG1vZkF0dHJpYnV0ZU5hbWUKKwkgKiAgICAgICAgICAgIFN0cmluZyBUaGUgbmFtZSBvZiB0aGUgbW9mQXR0cmlidXRlIHRvIHJlbW92ZSB0aGUgY2hpbGQgZnJvbS4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVNT0ZWYWx1ZShFT2JqZWN0IHZhbHVlLCBUcmFuc2xhdG9yIHRyYW5zbGF0b3IpIHsKKworCQlpZiAodmFsdWUgPT0gbnVsbCkKKwkJCXJldHVybjsKKworCQlFTUYyRE9NQWRhcHRlciBhZGFwdGVyID0gKEVNRjJET01BZGFwdGVyKSBFY29yZVV0aWwuZ2V0RXhpc3RpbmdBZGFwdGVyKHZhbHVlLCBFTUYyRE9NQWRhcHRlci5BREFQVEVSX0NMQVNTKTsKKwkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgeworCQkJLy8gUmVtb3ZlIHRoZSBhZGFwdGVyIGZyb20gQk9USCB0aGUgTU9GIE9iamVjdCBhbmQgdGhlIERPTSBOb2RlcworCQkJcmVtb3ZlQWRhcHRlcnMoYWRhcHRlci5nZXROb2RlKCkpOworCQkJdmFsdWUuZUFkYXB0ZXJzKCkucmVtb3ZlKGFkYXB0ZXIpOworCQl9CisKKwkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSB0cmFuc2xhdG9yLmdldEZlYXR1cmUoKTsKKwkJYm9vbGVhbiBkb1VubG9hZCA9IGZlYXR1cmUgPT0gbnVsbCB8fCAodHJhbnNsYXRvci5pc09iamVjdE1hcCgpICYmICgoRVJlZmVyZW5jZSkgZmVhdHVyZSkuaXNDb250YWlubWVudCgpKTsKKworCQkvLyB0cmFuc2xhdG9yLnJlbW92ZU1PRlZhbHVlKCkgd2FzIGhlcmUgb3JpZ2luYWxseQorCisJCS8vIFVubG9hZCB0aGUgb2JqZWN0cy4KKwkJaWYgKGRvVW5sb2FkKQorCQkJRXh0ZW5kZWRFY29yZVV0aWwudW5sb2FkKHZhbHVlKTsKKworCQkvLyBSZW1vdmUgdGhlIE1PRiB2YWx1ZQorCQl0cmFuc2xhdG9yLnJlbW92ZU1PRlZhbHVlKGdldFRhcmdldCgpLCB2YWx1ZSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcmVvcmRlcklmTmVjZXNzYXJ5KEVMaXN0IGVtZkNoaWxkcmVuLCBFT2JqZWN0IGVPYmosIGludCBlbWZJbmRleCkgeworCQlpbnQgY3VyckluZGV4ID0gZW1mQ2hpbGRyZW4uaW5kZXhPZihlT2JqKTsKKwkJaWYgKGN1cnJJbmRleCA+IC0xICYmIGN1cnJJbmRleCAhPSBlbWZJbmRleCkKKwkJCWVtZkNoaWxkcmVuLm1vdmUoZW1mSW5kZXgsIGVPYmopOworCX0KKworCS8qKgorCSAqIGRlZmF1bHQgaXMgdG8gZG8gbm90aGluZzsgc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBpbmRlbnQoTm9kZSBuZXdOb2RlLCBUcmFuc2xhdG9yIG1hcCkgeworCisJfQorCisJcHJvdGVjdGVkIE5vZGUgZmluZEluc2VydEJlZm9yZU5vZGUoTm9kZSBwYXJlbnROb2RlLCBUcmFuc2xhdG9yIG1hcCwgTGlzdCBtb2ZMaXN0LCBpbnQgbW9mSW54LCBMaXN0IGRvbUxpc3QpIHsKKwkJTm9kZSBpbnNlcnRCZWZvcmVOb2RlID0gbnVsbDsKKworCQkvLyBJZiB0aGVyZSBhcmUgbm8gY3VycmVudCBkb20gY2hpbGRyZW4gZm9yIHRoaXMgbWFwLCBmaW5kIHRoZSBpbml0aWFsCisJCS8vIGluc2VydCBwb3MuCisJCWlmIChkb21MaXN0LnNpemUoKSA9PSAwKQorCQkJcmV0dXJuIGZpbmRJbml0aWFsSW5zZXJ0QmVmb3JlTm9kZShwYXJlbnROb2RlLCBtYXApOworCisJCS8vIElmIHNvbWUgZG9tIG5vZGVzIHRoZW4gZmluZCB0aGUgY29ycmVjdCBvbmUgdG8gaW5zZXJ0IGJlZm9yZS4KKwkJaW50IGkgPSBtb2ZJbnggKyAxOworCQl3aGlsZSAoaSA8IG1vZkxpc3Quc2l6ZSgpICYmIGluc2VydEJlZm9yZU5vZGUgPT0gbnVsbCkgeworCQkJLy8gU3RhcnQgYXQgdGhlIG1vZklueCBwYXNzZWQgaW4gYW5kIGxvb2sgZm9yd2FyZCBmb3IgdGhlIGZpcnN0CisJCQkvLyBhZGFwdGVkCisJCQkvLyBNT0Ygb2JqZWN0LiBVc2UgdGhhdCBub2RlIGFzIHRoZSBpbnNlcnQgYmVmb3JlIG5vZGUuCisJCQlPYmplY3QgbyA9IG1vZkxpc3QuZ2V0KGkpOworCQkJaWYgKCFtYXAuaXNPYmplY3RNYXAoKSB8fCBtYXAuaXNNYW5hZ2VkQnlQYXJlbnQoKSkKKwkJCQlicmVhazsKKwkJCUVPYmplY3QgdE1PRk9iamVjdCA9IChFT2JqZWN0KSBvOworCQkJRU1GMkRPTUFkYXB0ZXIgdEFkYXB0ZXIgPSAoRU1GMkRPTUFkYXB0ZXIpIEVjb3JlVXRpbC5nZXRFeGlzdGluZ0FkYXB0ZXIodE1PRk9iamVjdCwgRU1GMkRPTUFkYXB0ZXIuQURBUFRFUl9DTEFTUyk7CisJCQlpZiAodEFkYXB0ZXIgIT0gbnVsbCkgeworCQkJCWluc2VydEJlZm9yZU5vZGUgPSB0QWRhcHRlci5nZXROb2RlKCk7CisJCQl9CisJCQlpKys7CisJCX0KKworCQkvLyBIYW5kbGUgaW5zZXJ0aW5nIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QKKwkJaWYgKGluc2VydEJlZm9yZU5vZGUgPT0gbnVsbCkKKwkJCWluc2VydEJlZm9yZU5vZGUgPSBET01VdGlsaXRpZXMuZ2V0TmV4dE5vZGVTaWJsaW5nKChOb2RlKSBkb21MaXN0LmdldChkb21MaXN0LnNpemUoKSAtIDEpKTsKKwkJaWYgKGluc2VydEJlZm9yZU5vZGUgPT0gbnVsbCkKKwkJCWluc2VydEJlZm9yZU5vZGUgPSAoKE5vZGUpIGRvbUxpc3QuZ2V0KGRvbUxpc3Quc2l6ZSgpIC0gMSkpLmdldE5leHRTaWJsaW5nKCk7CisKKwkJcmV0dXJuIGluc2VydEJlZm9yZU5vZGU7CisJfQorCisJcHJvdGVjdGVkIE5vZGUgZmluZEluaXRpYWxJbnNlcnRCZWZvcmVOb2RlKE5vZGUgcGFyZW50Tm9kZSwgVHJhbnNsYXRvciBtYXBOb2RlKSB7CisJCVRyYW5zbGF0b3JbXSBtYXBzID0gZ2V0Q2hpbGRUcmFuc2xhdG9ycygpOworCisJCS8vIEZpcnN0LCBza2lwIHBhc3QgYWxsIHRoZSBtYXBzIGluIHRoZSBvcmRlcmVkIGNvbGxlY3Rpb24KKwkJLy8gb2YgbWFwcy4gV2Ugd2FudCB0byBiZWdpbiB0aGUgc2VhcmNoIHdpdGggdGhpcyBub2RlLgorCQlpbnQgaSA9IDA7CisJCWZvciAoOyBpIDwgbWFwcy5sZW5ndGg7IGkrKykgeworCQkJaWYgKG1hcHNbaV0gPT0gbWFwTm9kZSkKKwkJCQlicmVhazsKKwkJfQorCisJCS8vIE5vdyBzZWFyY2ggZ28gdGhyb3VnaCBlYWNoIG1hcCBub2RlIHVudGlsIGEgY2hpbGQgbm9kZSBtYXRjaGluZworCQkvLyBpdHMgRE9NIG5hbWUgaXMgZm91bmQuCisJCU5vZGUgaW5zZXJ0QmVmb3JlTm9kZSA9IG51bGw7CisJCWZvciAoaW50IGogPSBpOyBqIDwgbWFwcy5sZW5ndGggJiYgaW5zZXJ0QmVmb3JlTm9kZSA9PSBudWxsOyBqKyspIHsKKwkJCU5vZGVMaXN0IGNoaWxkTm9kZXMgPSBwYXJlbnROb2RlLmdldENoaWxkTm9kZXMoKTsKKwkJCVRyYW5zbGF0b3Igbm9kZVRvRmluZE1hcCA9IG1hcHNbal07CisJCQlmb3IgKGludCBrID0gMDsgayA8IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCk7IGsrKykgeworCQkJCU5vZGUgbm9kZSA9IGNoaWxkTm9kZXMuaXRlbShrKTsKKwkJCQlpZiAobm9kZVRvRmluZE1hcC5pc01hcEZvcihub2RlLmdldE5vZGVOYW1lKCkpKSB7CisJCQkJCWluc2VydEJlZm9yZU5vZGUgPSBub2RlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIGluc2VydEJlZm9yZU5vZGU7CisJfQorCisJLyoKKwkgKiBUcmF2ZXJzZXMgdGhlIHBhdGggdGhhdCA8bWFwPiBzcGVjaWZpZXMuIFJldHVybnMgdGhlIGxhc3Qgbm9kZSBvZiB0aGUgcGF0aCB0aGF0IHdhcyBhYmxlIHRvCisJICogYmUgdHJhdmVyc2VkIG9yIG51bGwgaWYgdGhlIHBhdGggY291bGQgbm90IGJlIHRyYXZlcnNlZC4gVGhlIDxhZGRBZGFwdGVycz4gYm9vbGVhbiBpcyB1c2VkIHRvCisJICogZGV0ZXJtaW5lIGlmIHRoZSByZWNlaXZlciBpcyBhZGRlZCBhcyBhbiBhZGFwdGVyIHRvIGV2ZXJ5IG5vZGUgZm91bmQgb24gdGhlIHBhdGguCisJICovCisJcHJvdGVjdGVkIE5vZGUgZmluZERPTVBhdGgoTm9kZSBwYXJlbnQsIFRyYW5zbGF0b3IgbWFwLCBib29sZWFuIGFkZEFkYXB0ZXJzKSB7CisKKwkJU3RyaW5nIHBhdGggPSBtYXAuZ2V0RE9NUGF0aCgpOworCQlOb2RlIGN1ck5vZGUgPSBwYXJlbnQ7CisJCUl0ZXJhdG9yIGl0ZXIgPSBET01VdGlsaXRpZXMuY3JlYXRlUGF0aEl0ZXJhdG9yKHBhdGgpOworCisJCXdoaWxlIChjdXJOb2RlICE9IG51bGwgJiYgaXRlci5oYXNOZXh0KCkpIHsKKwkJCVN0cmluZyBub2RlTmFtZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOworCQkJY3VyTm9kZSA9IERPTVV0aWxpdGllcy5nZXROb2RlQ2hpbGQoY3VyTm9kZSwgbm9kZU5hbWUpOworCQkJaWYgKGFkZEFkYXB0ZXJzICYmIGN1ck5vZGUgIT0gbnVsbCkgeworCQkJCWFkZERPTUFkYXB0ZXIoY3VyTm9kZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGN1ck5vZGU7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBsaXN0IG9mIERPTSBub2RlIGNoaWxkcmVuIHRoYXQgY3VycmVudGx5IGV4aXN0IHdpdGggdGhlIHNwZWNpZmllZCB0YWduYW1lLgorCSAqLworCXByb3RlY3RlZCBMaXN0IGdldERPTUNoaWxkcmVuKE5vZGUgbm9kZSwgVHJhbnNsYXRvciBtYXApIHsKKwkJTm9kZSBwYXJlbnQgPSBmaW5kRE9NUGF0aChub2RlLCBtYXAsIHRydWUpOworCQlpZiAocGFyZW50ICE9IG51bGwpCisJCQlyZXR1cm4gRE9NVXRpbGl0aWVzLmdldE5vZGVDaGlsZHJlbihwYXJlbnQsIG1hcC5nZXRET01OYW1lcygpKTsKKwkJcmV0dXJuIG5ldyBBcnJheUxpc3QoKTsKKwl9CisKKwlwcm90ZWN0ZWQgRU1GMkRPTUFkYXB0ZXIgZ2V0RXhpc3RpbmdBZGFwdGVyKEVPYmplY3QgcmVmT2JqZWN0KSB7CisJCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSAoRU1GMkRPTUFkYXB0ZXIpIEVjb3JlVXRpbC5nZXRFeGlzdGluZ0FkYXB0ZXIocmVmT2JqZWN0LCBFTUYyRE9NQWRhcHRlci5BREFQVEVSX0NMQVNTKTsKKwkJaWYgKGFkYXB0ZXIgIT0gbnVsbCAmJiBhZGFwdGVyLmlzTU9GUHJveHkoKSkgeworCQkJcmVtb3ZlRE9NQWRhcHRlcihhZGFwdGVyLmdldE5vZGUoKSwgYWRhcHRlcik7CisJCQlyZWZPYmplY3QuZUFkYXB0ZXJzKCkucmVtb3ZlKGFkYXB0ZXIpOworCQkJYWRhcHRlciA9IG51bGw7CisJCX0KKwkJcmV0dXJuIGFkYXB0ZXI7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcHJpbUFkZERPTUFkYXB0ZXIoTm9kZSBhTm9kZSwgRU1GMkRPTUFkYXB0ZXIgYW5BZGFwdGVyKSB7CisJCWZSZW5kZXJlci5yZWdpc3RlckRPTUFkYXB0ZXIoYU5vZGUsIGFuQWRhcHRlcik7CisJfQorCisJcHJvdGVjdGVkIEVNRjJET01BZGFwdGVyIHByaW1HZXRFeGlzdGluZ0FkYXB0ZXIoTm9kZSBhTm9kZSkgeworCQlyZXR1cm4gZlJlbmRlcmVyLmdldEV4aXN0aW5nRE9NQWRhcHRlcihhTm9kZSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRE9NQWRhcHRlcihOb2RlIGFOb2RlLCBFTUYyRE9NQWRhcHRlciBhbkFkYXB0ZXIpIHsKKwkJZlJlbmRlcmVyLnJlbW92ZURPTUFkYXB0ZXIoYU5vZGUsIGFuQWRhcHRlcik7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgYWRkRE9NQWRhcHRlcihOb2RlIGNoaWxkTm9kZSkgeworCisJCS8vIE9ubHkgYWRkIHRoZSBhZGFwdGVyIGlmIHRoaXMgaXMgYW4gY2hpbGQgbm9kZSB0aGF0IHdpbGwgbm90IGJlCisJCS8vIGFkYXB0ZWQuIEZvciBpbnN0YW5jZSBhIHN1YnRyZWUgdGhhdCBtYXBzIHRvIGEgTU9GIGF0dHJpYnV0ZQorCQkvLyBzZXR0aW5nLgorCQlpZiAoY2hpbGROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKKwkJCUVNRjJET01BZGFwdGVyIGF0dHJBZGFwdGVyID0gcHJpbUdldEV4aXN0aW5nQWRhcHRlcihjaGlsZE5vZGUpOworCisJCQlpZiAoYXR0ckFkYXB0ZXIgPT0gbnVsbCB8fCBhdHRyQWRhcHRlci5nZXROb2RlKCkgIT0gZ2V0Tm9kZSgpKSB7CisJCQkJLy8gSWYgdGhlIG5vZGUgaXMgYWRhcHRlZCwgYnV0IG5vdCBieSB0aGlzIGFkYXB0ZXIgdGhlbiByZW1vdmUKKwkJCQkvLyBpdC4gVGhpcyBoYXBwZW5zIHRvIG5vbi1vYmplY3QgY2hpbGRyZW4gd2hlbiB0aGUgcGFyZW50IHRhZworCQkJCS8vIG5hbWUgaXMgY2hhbmdlZC4KKwkJCQlyZW1vdmVET01BZGFwdGVyKGNoaWxkTm9kZSwgYXR0ckFkYXB0ZXIpOworCisJCQkJaWYgKGZEZWJ1ZykgeworCQkJCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJcdENISUxEOiBBZGRpbmcgRE9NIGFkYXB0ZXI6ICIgKyB0aGlzKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJcdFx0dG86ICIgKyBjaGlsZE5vZGUpOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJCXByaW1BZGRET01BZGFwdGVyKGNoaWxkTm9kZSwgdGhpcyk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZW9yZGVyIGEgY2hpbGQgYmVmb3JlIGEgZ2l2ZW4gbm9kZQorCSAqLworCXByb3RlY3RlZCB2b2lkIHJlb3JkZXJET01DaGlsZChOb2RlIHBhcmVudE5vZGUsIE5vZGUgY2hpbGROb2RlLCBOb2RlIGluc2VydEJlZm9yZU5vZGUsIFRyYW5zbGF0b3IgbWFwKSB7CisJCXRyeSB7CisJCQlyZW1vdmVET01DaGlsZChwYXJlbnROb2RlLCBjaGlsZE5vZGUsIGZhbHNlKTsKKwkJCXBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkTm9kZSwgaW5zZXJ0QmVmb3JlTm9kZSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBnZXROZXdsaW5lU3RyaW5nKE5vZGUgbm9kZSkgeworCQlyZXR1cm4gRE9NVXRpbGl0aWVzLk5FV0xJTkVfU1RSSU5HOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgcHJpbUdldEluZGVudFN0cmluZyhOb2RlIG5vZGUpIHsKKwkJcmV0dXJuIERPTVV0aWxpdGllcy5nZXRJbmRlbnRTdHJpbmcobm9kZSk7CisJfQorCisJLyoqCisJICogUmVtb3ZlIGEgY2hpbGQgbm9kZQorCSAqLworCXByb3RlY3RlZCB2b2lkIHJlbW92ZURPTUNoaWxkKE5vZGUgcGFyZW50Tm9kZSwgTm9kZSBjaGlsZE5vZGUpIHsKKwkJcmVtb3ZlRE9NQ2hpbGQocGFyZW50Tm9kZSwgY2hpbGROb2RlLCB0cnVlKTsKKwl9CisKKwkvKioKKwkgKiBSZW1vdmUgYSBjaGlsZCBub2RlCisJICovCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRE9NQ2hpbGQoTm9kZSBwYXJlbnROb2RlLCBOb2RlIGNoaWxkTm9kZSwgYm9vbGVhbiByZW1vdmVBZGFwdGVyKSB7CisJCXRyeSB7CisJCQlpZiAoY2hpbGROb2RlID09IG51bGwpCisJCQkJcmV0dXJuOworCQkJLy8gTG9vayBmb3IgYW55IHdoaXRlc3BhY2UgcHJlY2VlZGluZyB0aGUgbm9kZSBiZWluZworCQkJLy8gcmVtb3ZlZCBhbmQgcmVtb3ZlIGl0IGFzIHdlbGwuCisJCQlUZXh0IHByZXZUZXh0ID0gRE9NVXRpbGl0aWVzLmdldFByZXZpb3VzVGV4dFNpYmxpbmcoY2hpbGROb2RlKTsKKwkJCWlmIChwcmV2VGV4dCAhPSBudWxsICYmIERPTVV0aWxpdGllcy5pc1doaXRlc3BhY2UocHJldlRleHQpKSB7CisJCQkJcGFyZW50Tm9kZS5yZW1vdmVDaGlsZChwcmV2VGV4dCk7CisJCQl9CisJCQkvLyBSZW1vdmUgdGhlIG5vZGUuCisJCQlpZiAocmVtb3ZlQWRhcHRlcikKKwkJCQlyZW1vdmVBZGFwdGVycyhjaGlsZE5vZGUpOworCQkJcGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjaGlsZE5vZGUpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeyAKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZW1vdmUgdGhlIERPTSBhZGFwdGVycyBmcm9tIHRoZSBub2RlIEFORCBhbGwgaXRzIGNoaWxkIG5vZGVzLCByZWN1cnNpdmVseS4KKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVBZGFwdGVycyhOb2RlIG5vZGUpIHsKKwkJRU1GMkRPTUFkYXB0ZXIgYWRhcHRlciA9IHByaW1HZXRFeGlzdGluZ0FkYXB0ZXIobm9kZSk7CisJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKKwkJCS8vIFJlbW92ZSB0aGUgYWRhcHRlciBmcm9tIGJvdGggdGhlIERPTSBub2RlIGFuZCB0aGUgTU9GIE9iamVjdC4KKwkJCXJlbW92ZURPTUFkYXB0ZXIobm9kZSwgYWRhcHRlcik7CisJCQlpZiAoYWRhcHRlci5nZXROb2RlKCkgPT0gbm9kZSkgeworCQkJCU5vdGlmaWVyIGxvY2FsVGFyZ2V0ID0gYWRhcHRlci5nZXRUYXJnZXQoKTsKKwkJCQlpZiAobG9jYWxUYXJnZXQgIT0gbnVsbCkKKwkJCQkJbG9jYWxUYXJnZXQuZUFkYXB0ZXJzKCkucmVtb3ZlKGFkYXB0ZXIpOworCQkJfQorCQl9CisJCU5vZGVMaXN0IG5sID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbmwuZ2V0TGVuZ3RoKCk7IGkrKykgeworCQkJTm9kZSBuID0gbmwuaXRlbShpKTsKKwkJCXJlbW92ZUFkYXB0ZXJzKG4pOworCQl9CisJfQorCisJLyoqCisJICogQ3JlYXRlcyB0aGUgcGF0aCBzcGVjaWZpZWQgYnkgPG1hcD51bmRlciA8bm9kZT4uIE9ubHkgdGhlIHBvcnRpb24gb2YgdGhlIHBhdGggdGhhdCBkb2VzIG5vdAorCSAqIGV4aXN0IChpZiBhbnkpIGlzIGNyZWF0ZWQKKwkgKiAKKwkgKiBAcGFyYW0gbm9kZQorCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQorCSAqIEBwYXJhbSBtYXAKKwkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLm1vZjJkb20uVHJhbnNsYXRvcgorCSAqLworCXByb3RlY3RlZCBOb2RlIGNyZWF0ZURPTVBhdGgoTm9kZSBub2RlLCBUcmFuc2xhdG9yIG1hcCkgeworCQlJdGVyYXRvciBpID0gRE9NVXRpbGl0aWVzLmNyZWF0ZVBhdGhJdGVyYXRvcihtYXAuZ2V0RE9NUGF0aCgpKTsKKwkJTm9kZSBjdXJOb2RlID0gbm9kZTsKKwkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7CisJCQlTdHJpbmcgbm9kZU5hbWUgPSAoU3RyaW5nKSBpLm5leHQoKTsKKwkJCWN1ck5vZGUgPSBmaW5kT3JDcmVhdGVOb2RlKG5vZGUsIG1hcCwgbm9kZU5hbWUpOworCQl9CisJCXJldHVybiBjdXJOb2RlOworCX0KKworCXByb3RlY3RlZCBFbGVtZW50IGZpbmRPckNyZWF0ZU5vZGUoTm9kZSBwYXJlbnQsIFRyYW5zbGF0b3IgbWFwLCBTdHJpbmcgc2VnbWVudCkgeworCQlOb2RlIG5vZGUgPSBET01VdGlsaXRpZXMuZ2V0Tm9kZUNoaWxkKHBhcmVudCwgc2VnbWVudCk7CisJCWlmIChub2RlID09IG51bGwpIHsKKwkJCS8vIFRoZSBub2RlIGRpZCBub3QgYWxyZWFkeSBleGlzdCwgY3JlYXRlIGl0LgorCQkJRG9jdW1lbnQgZG9jID0gcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKTsKKwkJCW5vZGUgPSBkb2MuY3JlYXRlRWxlbWVudChzZWdtZW50KTsKKwkJCWlmIChtYXAuaXNFbXB0eVRhZygpKQorCQkJCXNldEVtcHR5VGFnKChFbGVtZW50KSBub2RlKTsKKworCQkJTm9kZSBpbnNlcnRCZWZvcmVOb2RlID0gZmluZEluaXRpYWxJbnNlcnRCZWZvcmVOb2RlKHBhcmVudCwgbWFwKTsKKwkJCURPTVV0aWxpdGllcy5pbnNlcnRCZWZvcmVOb2RlQW5kV2hpdGVzcGFjZShwYXJlbnQsIG5vZGUsIGluc2VydEJlZm9yZU5vZGUpOworCQkJaW5kZW50KG5vZGUsIG1hcCk7CisJCQlhZGRET01BZGFwdGVyKG5vZGUpOyAvLyBIb29rIHVwIGxpc3RlbmVycworCQl9CisJCXJldHVybiAoRWxlbWVudCkgbm9kZTsKKwl9CisKKwkvKioKKwkgKiBSZW1vdmUgdGhlIG5vZGUgcGFzc2VkIGluIGlmIGl0IGhhcyBvbmx5IHdoaXRlc3BhY2Ugbm9kZXMgYXMgY2hpbGRyZW4KKwkgKiAKKwkgKiBAcGFyYW0gbm9kZQorCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZSB0byBjaGVjaworCSAqLworCXByb3RlY3RlZCB2b2lkIHJlbW92ZUlmRW1wdHkoTm9kZSBub2RlKSB7CisJCU5vZGVMaXN0IG5sID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7CisKKwkJLy8gUnVuIHRocm91Z2ggYWxsIHRoZSBub2RlcyBjaGlsZHJlbi4gSWYgYSBub24td2hpdGVzcGFjZSBub2RlCisJCS8vIHBpcyBmb3VuZCwgYmFpbC4KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBubC5nZXRMZW5ndGgoKTsgaSsrKSB7CisJCQlOb2RlIGNoaWxkTm9kZSA9IG5sLml0ZW0oaSk7CisJCQlpZiAoIURPTVV0aWxpdGllcy5pc1doaXRlc3BhY2UoY2hpbGROb2RlKSkKKwkJCQlyZXR1cm47CisJCX0KKworCQkvLyBXZSBvbmx5IGdldCBoZXJlIGlmIHRoZXJlIGFyZSBubyBub24td2hpdGVzcGFjZSBjaGFycywgc28KKwkJLy8gc2ltcGx5IHJlbW92ZSB0aGUgbm9kZS4KKwkJcmVtb3ZlRE9NQ2hpbGQobm9kZS5nZXRQYXJlbnROb2RlKCksIG5vZGUpOworCX0KKworCS8qKgorCSAqIFJlbW92ZSB0aGUgRE9NIHBhdGggc3BlY2lmaWVkIGJ5IDxtYXA+ZnJvbSA8bm9kZT4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVET01QYXRoKE5vZGUgbm9kZSwgVHJhbnNsYXRvciBtYXApIHsKKwkJTm9kZSBjaGlsZE5vZGUgPSBmaW5kRE9NUGF0aChub2RlLCBtYXAsIGZhbHNlKTsKKwkJd2hpbGUgKGNoaWxkTm9kZSAhPSBudWxsICYmIGNoaWxkTm9kZSAhPSBub2RlKSB7CisJCQlyZW1vdmVJZkVtcHR5KGNoaWxkTm9kZSk7CisJCQljaGlsZE5vZGUgPSBjaGlsZE5vZGUuZ2V0UGFyZW50Tm9kZSgpOworCQl9CisJfQorCisJLyoqCisJICogQ3JlYXRlIGFuIGFkYXB0ZXIgZm9yIGEgY2hpbGQgRE9NIG5vZGUKKwkgKiAKKwkgKiBAcGFyYW0gbm9kZQorCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZSB0byBjcmVhdGUgdGhlIGFkYXB0ZXIgZm9yLgorCSAqLworCXByb3RlY3RlZCBFTUYyRE9NQWRhcHRlciBjcmVhdGVBZGFwdGVyKEVPYmplY3QgbW9mT2JqZWN0LCBUcmFuc2xhdG9yIGNoaWxkTWFwKSB7CisJCS8vCUFzc2VydC5pc05vdE51bGwoY2hpbGRNYXAuZ2V0Q2hpbGRBZGFwdGVyQ2xhc3MoKSk7CisJCUFzc2VydC5pc05vdE51bGwobW9mT2JqZWN0KTsKKworCQlFTUYyRE9NQWRhcHRlciBhZGFwdGVyID0gKEVNRjJET01BZGFwdGVyKSBFY29yZVV0aWwuZ2V0QWRhcHRlcihtb2ZPYmplY3QuZUFkYXB0ZXJzKCksIEVNRjJET01BZGFwdGVyLkFEQVBURVJfQ0xBU1MpOworCisJCWlmIChhZGFwdGVyICE9IG51bGwgJiYgYWRhcHRlci5pc01PRlByb3h5KCkpIHsKKwkJCXJlbW92ZUFkYXB0ZXJzKGFkYXB0ZXIuZ2V0Tm9kZSgpKTsKKwkJCW1vZk9iamVjdC5lQWRhcHRlcnMoKS5yZW1vdmUoYWRhcHRlcik7CisJCQlhZGFwdGVyID0gbnVsbDsKKwkJfQorCQlpZiAoYWRhcHRlciA9PSBudWxsKQorCQkJYWRhcHRlciA9IHByaW1DcmVhdGVBZGFwdGVyKG1vZk9iamVjdCwgY2hpbGRNYXApOworCQlyZXR1cm4gYWRhcHRlcjsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYW4gYWRhcHRlciBmb3IgYSBjaGlsZCBET00gbm9kZQorCSAqIAorCSAqIEBwYXJhbSBub2RlCisJICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIFRoZSBub2RlIHRvIGNyZWF0ZSB0aGUgYWRhcHRlciBmb3IuCisJICovCisJcHJvdGVjdGVkIEVNRjJET01BZGFwdGVyIHByaW1DcmVhdGVBZGFwdGVyKEVPYmplY3QgbW9mT2JqZWN0LCBUcmFuc2xhdG9yIGNoaWxkTWFwKSB7CisKKwkJRWxlbWVudCBuZXdOb2RlID0gY3JlYXRlTmV3Tm9kZShtb2ZPYmplY3QsIGNoaWxkTWFwKTsKKwkJcmV0dXJuIG5ldyBFTUYyRE9NQWRhcHRlckltcGwobW9mT2JqZWN0LCBuZXdOb2RlLCBmUmVuZGVyZXIsIGNoaWxkTWFwKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYW4gYWRhcHRlciBmb3IgYSBjaGlsZCBET00gbm9kZQorCSAqIAorCSAqIEBwYXJhbSBub2RlCisJICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIFRoZSBub2RlIHRvIGNyZWF0ZSB0aGUgYWRhcHRlciBmb3IuCisJICovCisJcHJvdGVjdGVkIEVNRjJET01BZGFwdGVyIHByaW1DcmVhdGVBZGFwdGVyKE5vZGUgbm9kZSwgVHJhbnNsYXRvciBjaGlsZE1hcCkgeworCQlyZXR1cm4gbmV3IEVNRjJET01BZGFwdGVySW1wbChub2RlLCBmUmVuZGVyZXIsIGNoaWxkTWFwKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYW4gYWRhcHRlciBmb3IgYSBjaGlsZCBET00gbm9kZQorCSAqIAorCSAqIEBwYXJhbSBub2RlCisJICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIFRoZSBub2RlIHRvIGNyZWF0ZSB0aGUgYWRhcHRlciBmb3IuCisJICovCisJcHJvdGVjdGVkIEVNRjJET01BZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm9kZSBub2RlLCBUcmFuc2xhdG9yIGNoaWxkTWFwKSB7CisKKwkJLy9Bc3NlcnQuaXNOb3ROdWxsKGNoaWxkTWFwLmdldENoaWxkQWRhcHRlckNsYXNzKCkpOworCQlBc3NlcnQuaXNOb3ROdWxsKG5vZGUpOworCisJCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSBwcmltR2V0RXhpc3RpbmdBZGFwdGVyKG5vZGUpOworCisJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKKwkJCWlmIChhZGFwdGVyLmlzTU9GUHJveHkoKSB8fCBhZGFwdGVyLmdldFRhcmdldCgpID09IG51bGwpIHsKKwkJCQlyZW1vdmVET01BZGFwdGVyKG5vZGUsIGFkYXB0ZXIpOworCQkJCWlmIChhZGFwdGVyLmdldFRhcmdldCgpICE9IG51bGwpIHsKKwkJCQkJYWRhcHRlci5nZXRUYXJnZXQoKS5lQWRhcHRlcnMoKS5yZW1vdmUoYWRhcHRlcik7CisJCQkJfQorCQkJCWFkYXB0ZXIgPSBudWxsOworCQkJfQorCQl9IGVsc2UgeworCQkJYWRhcHRlciA9IHByaW1DcmVhdGVBZGFwdGVyKG5vZGUsIGNoaWxkTWFwKTsKKwkJfQorCQlyZXR1cm4gYWRhcHRlcjsKKwl9CisKKwlwcm90ZWN0ZWQgRWxlbWVudCBjcmVhdGVOZXdOb2RlKEVPYmplY3QgbW9mT2JqZWN0LCBUcmFuc2xhdG9yIGNoaWxkTWFwKSB7CisJCU5vZGUgbm9kZSA9IGdldE5vZGUoKTsKKwkJRG9jdW1lbnQgZG9jID0gKG5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkgPyAoRG9jdW1lbnQpIG5vZGUgOiBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKKworCQlFbGVtZW50IGVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudChjaGlsZE1hcC5nZXRET01OYW1lKG1vZk9iamVjdCkpOworCQlpZiAoY2hpbGRNYXAuaXNFbXB0eVRhZygpKQorCQkJc2V0RW1wdHlUYWcoZWxlbWVudCk7CisKKwkJcmV0dXJuIGVsZW1lbnQ7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0RW1wdHlUYWcoRWxlbWVudCBlbGVtZW50KSB7CisJCVJldmlzaXQudG9EbygpOworCQkvL05lZWQgdG8gZmlndXJlIG91dCBob3cgdG8gZG8gdGhpcyB3aXRoIHB1cmUgRE9NIGFwaXMsIGlmIGl0IGlzCisJCS8vIHBvc3NpYmxlCisJfQorCisJLyoKKwkgKiBSZXR1cm4gdHJ1ZSBpZiBNT0Ygb2JqZWN0IGlzIGEgcHJveHkuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNNT0ZQcm94eSgpIHsKKwkJaWYgKGlzUm9vdCB8fCB0YXJnZXQgPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJcmV0dXJuICgoSW50ZXJuYWxFT2JqZWN0KSB0YXJnZXQpLmVJc1Byb3h5KCk7CisJfQorCisJcHVibGljIEVPYmplY3QgZ2V0RU9iamVjdCgpIHsKKwkJaWYgKGlzUm9vdCkKKwkJCXJldHVybiBudWxsOworCQlyZXR1cm4gKEVPYmplY3QpIHRhcmdldDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIERPTSBub2RlIHRoYXQgdGhlIHRhcmdldCBvZiB0aGlzIGFkYXB0ZXIgbWFwcyB0by4gSWYgdGhlIHRhcmdldCBNT0Ygb2JqZWN0IG1hcHMgdG8KKwkgKiBtb3JlIHRoYW4gb25lIERPTSBub2RlLCB0aGlzIG5vZGUgaXMgdGhlIHRvcC1tb3N0IG5vZGUuCisJICovCisJcHVibGljIE5vZGUgZ2V0Tm9kZSgpIHsKKwkJcmV0dXJuIGZOb2RlOworCX0KKworCXB1YmxpYyB2b2lkIHNldE5vZGUoTm9kZSBhTm9kZSkgeworCQlmTm9kZSA9IGFOb2RlOworCX0KKworCXB1YmxpYyB2b2lkIHVwZGF0ZURPTSgpIHsKKwkJaWYgKCFpc05vdGlmaWNhdGlvbkVuYWJsZWQoKSkKKwkJCXJldHVybjsKKwkJcHJpbVVwZGF0ZURPTSgpOworCX0KKworCXB1YmxpYyB2b2lkIHVwZGF0ZU1PRigpIHsKKwkJaWYgKCFpc05vdGlmaWNhdGlvbkVuYWJsZWQoKSkKKwkJCXJldHVybjsKKwkJcHJpbVVwZGF0ZU1PRigpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHByaW1VcGRhdGVET00oKSB7CisJCWlmIChpc1Jvb3QpCisJCQl1cGRhdGVET01Sb290RmVhdHVyZSgpOworCQllbHNlIHsKKwkJCVRyYW5zbGF0b3JbXSBtYXBzID0gZ2V0Q2hpbGRUcmFuc2xhdG9ycygpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBzLmxlbmd0aDsgaSsrKSB7CisJCQkJdXBkYXRlRE9NRmVhdHVyZShtYXBzW2ldLCBnZXROb2RlKCksIGdldEVPYmplY3QoKSk7CisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBwcmltVXBkYXRlTU9GKCkgeworCQlpZiAoaXNSb290KQorCQkJdXBkYXRlTU9GUm9vdEZlYXR1cmUoKTsKKwkJZWxzZSB7CisJCQlUcmFuc2xhdG9yW10gbWFwcyA9IGdldENoaWxkVHJhbnNsYXRvcnMoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFwcy5sZW5ndGg7IGkrKykgeworCQkJCXVwZGF0ZU1PRkZlYXR1cmUobWFwc1tpXSwgZ2V0Tm9kZSgpLCBnZXRFT2JqZWN0KCkpOworCQkJfQorCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlRE9NUm9vdEZlYXR1cmUoKSB7CisJCWJvb2xlYW4gbm90aWZpY2F0aW9uRmxhZyA9IGlzTm90aWZpY2F0aW9uRW5hYmxlZCgpOworCQl0cnkgeworCQkJc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChmYWxzZSk7CisJCQlwcmltVXBkYXRlRE9NTXVsdGlGZWF0dXJlKGZUcmFuc2xhdG9yLCBmTm9kZSwgZ2V0UmVzb3VyY2VDb250ZW50cygpLCBnZXRET01DaGlsZHJlbihmTm9kZSwgZlRyYW5zbGF0b3IpLCBudWxsKTsKKwkJCXVwZGF0ZURPTURvY3VtZW50VHlwZSgpOworCQl9IGZpbmFsbHkgeworCQkJc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChub3RpZmljYXRpb25GbGFnKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU1PRlJvb3RGZWF0dXJlKCkgeworCQlib29sZWFuIG5vdGlmaWNhdGlvbkZsYWcgPSBpc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKKwkJdHJ5IHsKKwkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOworCQkJdXBkYXRlTU9GRG9jdW1lbnRUeXBlKCk7CisJCQlwcmltVXBkYXRlTU9GTXVsdGlGZWF0dXJlKGZUcmFuc2xhdG9yLCBmTm9kZSwgZ2V0UmVzb3VyY2VDb250ZW50cygpLCBnZXRET01DaGlsZHJlbihmTm9kZSwgZlRyYW5zbGF0b3IpKTsKKwkJfSBmaW5hbGx5IHsKKwkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQobm90aWZpY2F0aW9uRmxhZyk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgRG9jdW1lbnRUeXBlIGdldERvY3VtZW50VHlwZSgpIHsKKwkJcmV0dXJuICgoRG9jdW1lbnQpIGZOb2RlKS5nZXREb2N0eXBlKCk7CisJfQorCisJcHJvdGVjdGVkIFRyYW5zbGF0b3JSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKKwkJcmV0dXJuIChUcmFuc2xhdG9yUmVzb3VyY2UpIGdldFRhcmdldCgpOworCX0KKworCXByb3RlY3RlZCBFTGlzdCBnZXRSZXNvdXJjZUNvbnRlbnRzKCkgeworCQlpZiAoIWlzUm9vdCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKwkJcmV0dXJuICgoUmVzb3VyY2UpIGdldFRhcmdldCgpKS5nZXRDb250ZW50cygpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURPTURvY3VtZW50VHlwZSgpIHsKKworCQlEb2N1bWVudFR5cGUgZG9jVHlwZSA9IGdldERvY3VtZW50VHlwZSgpOworCQlTdHJpbmcgcHVibGljSWQgPSBudWxsLCBzeXN0ZW1JZCA9IG51bGwsIG9sZFB1YmxpY0lkLCBvbGRTeXN0ZW1JZDsKKwkJb2xkUHVibGljSWQgPSBkb2NUeXBlID09IG51bGwgPyBudWxsIDogZG9jVHlwZS5nZXRQdWJsaWNJZCgpOworCQlvbGRTeXN0ZW1JZCA9IGRvY1R5cGUgPT0gbnVsbCA/IG51bGwgOiBkb2NUeXBlLmdldFN5c3RlbUlkKCk7CisJCVRyYW5zbGF0b3JSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKCk7CisJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7CisJCQlwdWJsaWNJZCA9IHJlc291cmNlLmdldFB1YmxpY0lkKCk7CisJCQlzeXN0ZW1JZCA9IHJlc291cmNlLmdldFN5c3RlbUlkKCk7CisJCX0KKwkJaWYgKCEoU3RyaW5nVXRpbC5zdHJpbmdzRXF1YWwocHVibGljSWQsIG9sZFB1YmxpY0lkKSAmJiBTdHJpbmdVdGlsLnN0cmluZ3NFcXVhbChzeXN0ZW1JZCwgb2xkU3lzdGVtSWQpKSkKKwkJCWZSZW5kZXJlci5yZXBsYWNlRG9jdW1lbnRUeXBlKHJlc291cmNlLmdldERvY3R5cGUoKSwgcHVibGljSWQsIHN5c3RlbUlkKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVET01Eb2N1bWVudFR5cGUoTm90aWZpY2F0aW9uIG1zZykgeworCQlpZiAobXNnLmdldEZlYXR1cmUoKSA9PSBUcmFuc2xhdG9yUmVzb3VyY2UuRE9DX1RZUEVfRkVBVFVSRSkKKwkJCXVwZGF0ZURPTURvY3VtZW50VHlwZSgpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU1PRkRvY3VtZW50VHlwZSgpIHsKKworCQlUcmFuc2xhdG9yUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZSgpOworCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkKKwkJCXJldHVybjsKKworCQlTdHJpbmcgcHVibGljSWQgPSBudWxsLCBzeXN0ZW1JZCA9IG51bGw7CisJCURvY3VtZW50VHlwZSBkb2NUeXBlID0gZ2V0RG9jdW1lbnRUeXBlKCk7CisKKwkJaWYgKGRvY1R5cGUgIT0gbnVsbCkgeworCQkJcHVibGljSWQgPSBkb2NUeXBlLmdldFB1YmxpY0lkKCk7CisJCQlzeXN0ZW1JZCA9IGRvY1R5cGUuZ2V0U3lzdGVtSWQoKTsKKwkJfQorCQlpZiAoKCEoU3RyaW5nVXRpbC5zdHJpbmdzRXF1YWwocHVibGljSWQsIHJlc291cmNlLmdldFB1YmxpY0lkKCkpICYmIFN0cmluZ1V0aWwuc3RyaW5nc0VxdWFsKHN5c3RlbUlkLCByZXNvdXJjZS5nZXRTeXN0ZW1JZCgpKSkpIHx8IAorCQkJCSgocmVzb3VyY2UuZ2V0UHVibGljSWQoKSA9PSBudWxsKSB8fCByZXNvdXJjZS5nZXRTeXN0ZW1JZCgpID09IG51bGwpKQorCQkJcmVzb3VyY2Uuc2V0RG9jdHlwZVZhbHVlcyhwdWJsaWNJZCwgc3lzdGVtSWQpOworCX0KKworCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgeworCisJCWlmIChpc1Jvb3QpIHsKKwkJCW5vdGlmeUNoYW5nZWRGb3JSb290KG1zZyk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKGlzRGVwZW5kZW5jeUZlYXR1cmUobXNnKSkKKwkJCWhhbmRsZURlcGVuZGVuY3lGZWF0dXJlKG1zZyk7CisKKwkJaWYgKCFpc05vdGlmaWNhdGlvbkVuYWJsZWQoKSkKKwkJCXJldHVybjsKKworCQlkZWJ1Z01PRk5vdGlmeShtc2cpOworCisJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7CisJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQgOgorCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFIDoKKwkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZIDoKKwkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZIDoKKwkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVCA6CisJCQljYXNlIE5vdGlmaWNhdGlvbi5VTlNFVCA6CisJCQljYXNlIE5vdGlmaWNhdGlvbi5NT1ZFIDoKKwkJCQlUcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSBmaW5kVHJhbnNsYXRvcihtc2cpOworCQkJCWlmICh0cmFuc2xhdG9yID09IG51bGwpCisJCQkJCXRyYW5zbGF0b3IgPSBhZGRWYXJpYWJsZVRyYW5zbGF0b3JJZk5lY2Vzc2FyeShtc2cpOworCQkJCWlmICh0cmFuc2xhdG9yICE9IG51bGwpCisJCQkJCXVwZGF0ZURPTUZlYXR1cmUodHJhbnNsYXRvciwgZ2V0Tm9kZSgpLCBnZXRFT2JqZWN0KCkpOworCQkJCWJyZWFrOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgbm90aWZ5Q2hhbmdlZEZvclJvb3QoTm90aWZpY2F0aW9uIG1zZykgeworCQlpZiAoIWlzTm90aWZpY2F0aW9uRW5hYmxlZCgpKQorCQkJcmV0dXJuOworCisJCWRlYnVnTU9GTm90aWZ5KG1zZyk7CisKKwkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKKwkJCWNhc2UgTm90aWZpY2F0aW9uLkFERCA6CisJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkUgOgorCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlkgOgorCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlkgOgorCQkJCXByaW1VcGRhdGVET00oKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVCA6CisJCQkJdXBkYXRlRE9NRG9jdW1lbnRUeXBlKG1zZyk7CisJCQkJYnJlYWs7CisJCQljYXNlIEV0b29sc0NvcHlTZXNzaW9uLlJFU09VUkNFX0NPUElFRCA6CisJCQkJdXBkYXRlRE9NKCk7CisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhZGREZXBlbmRlbmN5QWRhcHRlcihFT2JqZWN0IGNoaWxkKSB7CisJCUFkYXB0ZXIgZXhpc3RpbmcgPSBFY29yZVV0aWwuZ2V0RXhpc3RpbmdBZGFwdGVyKGNoaWxkLCBEZXBlbmRlbmN5QWRhcHRlci5LRVkpOworCQlpZiAoZXhpc3RpbmcgIT0gbnVsbCkKKwkJCXJldHVybjsKKwkJRGVwZW5kZW5jeUFkYXB0ZXIgZm9yd2FyZGVyID0gbmV3IERlcGVuZGVuY3lBZGFwdGVyKCk7CisJCWNoaWxkLmVBZGFwdGVycygpLmFkZChmb3J3YXJkZXIpOworCQlmb3J3YXJkZXIuc2V0VGFyZ2V0KGNoaWxkKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhZGRET01BZGFwdGVyKCkgeworCisJCXByaW1BZGRET01BZGFwdGVyKGZOb2RlLCB0aGlzKTsKKwkJaWYgKGZEZWJ1ZykgeworCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiQWRkaW5nIERPTSBhZGFwdGVyOiAiICsgdGhpcyk7IC8vJE5PTi1OTFMtMSQKKwkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlx0dG86ICIgKyBmTm9kZSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCisJCS8vIEdvIHRocm91Z2ggdGhlIG1hcHMuIEFsbCBvZiB0aGUgRE9NIG5vZGVzIHRoYXQgYXJlIG5vdCBsaXN0ZW5lZAorCQkvLyB0byBieSBhbm90aGVyIERPTSBOb2RlIGFkYXB0ZXIsIG11c3QgYmUgbGlzdGVuZWQgdG8gYnkgdGhpcyBhZGFwdGVyLgorCQlOb2RlTGlzdCBjaGlsZE5vZGVzID0gZk5vZGUuZ2V0Q2hpbGROb2RlcygpOworCQlmb3IgKGludCBqID0gMDsgaiA8IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCk7IGorKykgeworCQkJTm9kZSBjaGlsZE5vZGUgPSBjaGlsZE5vZGVzLml0ZW0oaik7CisJCQlpbnQgbm9kZVR5cGUgPSBjaGlsZE5vZGUuZ2V0Tm9kZVR5cGUoKTsKKwkJCWlmICghRE9NVXRpbGl0aWVzLmlzVGV4dE5vZGUoY2hpbGROb2RlKSAmJiBub2RlVHlwZSAhPSBOb2RlLkNPTU1FTlRfTk9ERSkgeworCQkJCVRyYW5zbGF0b3IgbWFwID0gZmluZFRyYW5zbGF0b3IoY2hpbGROb2RlLmdldE5vZGVOYW1lKCksIGZhbHNlKTsKKwkJCQlpZiAobWFwICE9IG51bGwgJiYgbWFwLmlzTWFuYWdlZEJ5UGFyZW50KCkpCisJCQkJCWFkZERPTUFkYXB0ZXIoY2hpbGROb2RlKTsKKwkJCX0KKwkJfQorCX0KKworCXByb3RlY3RlZCBUcmFuc2xhdG9yIGFkZFZhcmlhYmxlVHJhbnNsYXRvcklmTmVjZXNzYXJ5KE5vdGlmaWNhdGlvbiBtc2cpIHsKKwkJVmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeSBmYWN0ID0gZlRyYW5zbGF0b3IuZ2V0VmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeSgpOworCQlUcmFuc2xhdG9yIHRyYW5zID0gbnVsbDsKKwkJaWYgKGZhY3QgIT0gbnVsbCAmJiBmYWN0LmFjY2VwdHMobXNnKSkgeworCQkJdHJhbnMgPSBmYWN0LmNyZWF0ZShtc2cpOworCQkJaWYgKHRyYW5zICE9IG51bGwpCisJCQkJY2hpbGRUcmFuc2xhdG9ycyA9IChUcmFuc2xhdG9yW10pIFRyYW5zbGF0b3IuY29uY2F0KGNoaWxkVHJhbnNsYXRvcnMsIHRyYW5zKTsKKwkJfQorCQlyZXR1cm4gdHJhbnM7CisJfQorCisJcHJvdGVjdGVkIFRleHQgY3JlYXRlVGV4dE5vZGUoRG9jdW1lbnQgZG9jLCBUcmFuc2xhdG9yIG1hcCwgU3RyaW5nIHRleHQpIHsKKwkJU3RyaW5nIG5vbm51bGx0ZXh0ID0gKHRleHQgIT0gbnVsbCkgPyB0ZXh0IDogIiI7IC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIG1hcC5pc0NEQVRBQ29udGVudCgpID8gZG9jLmNyZWF0ZUNEQVRBU2VjdGlvbihub25udWxsdGV4dCkgOiBkb2MuY3JlYXRlVGV4dE5vZGUobm9ubnVsbHRleHQpOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgZXh0cmFjdFJlYWRBaGVhZE5hbWUoKSB7CisJCWlmICghZlRyYW5zbGF0b3IuaGFzUmVhZEFoZWFkTmFtZXMoKSkKKwkJCXJldHVybiBudWxsOworCQlTdHJpbmcgcmVhZEFoZWFkTmFtZSA9IG51bGw7CisKKwkJUmVhZEFoZWFkSGVscGVyIGhlbHBlciA9IGZUcmFuc2xhdG9yLmdldFJlYWRBaGVhZEhlbHBlcihmTm9kZS5nZXROb2RlTmFtZSgpKTsKKwkJaWYgKGhlbHBlciA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisKKwkJTm9kZSBjaGlsZCA9IG51bGw7CisJCVN0cmluZ1tdIG5hbWVzID0gaGVscGVyLmdldFZhbHVlcygpOworCQlpZiAoaGVscGVyLmdldENoaWxkRE9NTmFtZSgpID09IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKKwkJCQljaGlsZCA9IERPTVV0aWxpdGllcy5nZXROb2RlQ2hpbGQoZk5vZGUsIG5hbWVzW2ldKTsKKwkJCQlpZiAoY2hpbGQgIT0gbnVsbCkgeworCQkJCQlyZWFkQWhlYWROYW1lID0gbmFtZXNbaV07CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWNoaWxkID0gRE9NVXRpbGl0aWVzLmdldE5vZGVDaGlsZChmTm9kZSwgaGVscGVyLmdldENoaWxkRE9NTmFtZSgpKTsKKwkJCWlmIChjaGlsZCAhPSBudWxsKQorCQkJCXJlYWRBaGVhZE5hbWUgPSBET01VdGlsaXRpZXMuZ2V0Q2hpbGRUZXh0KGNoaWxkKTsKKwkJfQorCQlpZiAocmVhZEFoZWFkTmFtZSA9PSBudWxsKQorCQkJcmVhZEFoZWFkTmFtZSA9IG5hbWVzWzBdOworCQlyZXR1cm4gcmVhZEFoZWFkTmFtZTsKKwl9CisKKwkvKioKKwkgKiBFeHRyYWN0cyB0aGUgdGV4dCBmcm9tIDxub2RlPmFuZCBjb252ZXJ0cyBpdCB0byBhbiBvYmplY3Qgc3VpdGFibGUgZm9yIHNldHRpbmcgaW50byA8ZmVhdHVyZT4KKwkgKi8KKwlwcm90ZWN0ZWQgT2JqZWN0IGV4dHJhY3RWYWx1ZShOb2RlIG5vZGUsIFRyYW5zbGF0b3IgbWFwLCBFT2JqZWN0IGVtZk9iamVjdCkgeworCisJCS8vIEV4dHJhY3QgdGhlIHZhbHVlIGZyb20gdGhlIHRleHQgY2hpbGQKKwkJTm9kZSB0ZXh0Tm9kZSA9IERPTVV0aWxpdGllcy5nZXRDaGlsZFRleHROb2RlKG5vZGUpOworCQlTdHJpbmcgdHJpbW1lZFZhbHVlID0gbnVsbDsKKwkJaWYgKHRleHROb2RlICE9IG51bGwpCisJCQl0cmltbWVkVmFsdWUgPSB0ZXh0Tm9kZS5nZXROb2RlVmFsdWUoKTsKKwkJdHJ5IHsKKwkJCXJldHVybiBtYXAuY29udmVydFN0cmluZ1RvVmFsdWUodHJpbW1lZFZhbHVlLCBlbWZPYmplY3QpOworCQl9IGNhdGNoIChGZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uIGV4KSB7CisJCQloYW5kbGVGZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uKGV4KTsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJLyoqCisJICogQHBhcmFtIGV4CisJICovCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbihGZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uIGV4KSB7CisJCXRocm93IGV4OworCisJfQorCisJLyoKKwkgKiBGaW5kcyB0aGUgY2hpbGQgbm9kZSB0aGF0IDxtYXA+IHNwZWNpZmllcy4gSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBjaGlsZCB0aGF0IHNhdGlzZmllcworCSAqIDxtYXA+IHRoZW4gdGhlIGZpcnN0IG9uZSBpcyByZXR1cm5lZC4KKwkgKiAKKwkgKiBUaGlzIG1ldGhvZCB0cmF2ZXJzZXMgcGFzdCB0aGUgZG9tUGF0aCBpZiBvbmUgaXMgc3BlY2lmaWVkIGluIHRoZSA8bWFwPi4KKwkgKi8KKwlwcm90ZWN0ZWQgTm9kZSBmaW5kRE9NTm9kZShOb2RlIHBhcmVudCwgVHJhbnNsYXRvciBtYXApIHsKKwkJcmV0dXJuIGZpbmRET01Ob2RlKHBhcmVudCwgbWFwLCBmYWxzZSk7CisJfQorCisJLyoKKwkgKiBGaW5kcyB0aGUgY2hpbGQgbm9kZSB0aGF0IDxtYXA+IHNwZWNpZmllcy4gSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBjaGlsZCB0aGF0IHNhdGlzZmllcworCSAqIDxtYXA+IHRoZW4gdGhlIGZpcnN0IG9uZSBpcyByZXR1cm5lZC4gVGhlIDxhZGRBZGFwdGVycz4gYm9vbGVhbiBpcyB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUKKwkgKiByZWNlaXZlciBpcyBhZGRlZCBhcyBhbiBhZGFwdGVyIHRvIGV2ZXJ5IG5vZGUgZm91bmQgb24gdGhlIHBhdGguCisJICogCisJICogVGhpcyBtZXRob2QgdHJhdmVyc2VzIHBhc3QgdGhlIGRvbVBhdGggaWYgb25lIGlzIHNwZWNpZmllZCBpbiB0aGUgPG1hcD4uCisJICovCisJcHJvdGVjdGVkIE5vZGUgZmluZERPTU5vZGUoTm9kZSBwYXJlbnQsIFRyYW5zbGF0b3IgbWFwLCBib29sZWFuIGFkZEFkYXB0ZXJzKSB7CisKKwkJLy8gRmlyc3QsIHRyYWNlIGRvd24gdGhlIHBhdGgKKwkJTm9kZSBjdXJOb2RlID0gZmluZERPTVBhdGgocGFyZW50LCBtYXAsIGFkZEFkYXB0ZXJzKTsKKwkJaWYgKG1hcC5pc0RPTVRleHRWYWx1ZSgpIHx8IG1hcC5pc0RPTUF0dHJpYnV0ZSgpIHx8IGN1ck5vZGUgPT0gbnVsbCkKKwkJCXJldHVybiBjdXJOb2RlOworCisJCS8vIE5vdyBsb29rIGZvciB0aGUgZmlyc3QgRE9NIG5hbWUgd2UgY2FuIGZpbmQKKwkJU3RyaW5nW10gZG9tTmFtZXMgPSBtYXAuZ2V0RE9NTmFtZXMoKTsKKwkJTm9kZSBub2RlID0gbnVsbDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBkb21OYW1lcy5sZW5ndGg7IGkrKykgeworCQkJU3RyaW5nIG5vZGVOYW1lID0gZG9tTmFtZXNbaV07CisJCQlMaXN0IG5vZGVzID0gRE9NVXRpbGl0aWVzLmdldE5vZGVDaGlsZHJlbihjdXJOb2RlLCBub2RlTmFtZSk7CisJCQlpZiAobm9kZXMgIT0gbnVsbCAmJiAhbm9kZXMuaXNFbXB0eSgpKSB7CisJCQkJaWYgKG5vZGVzLnNpemUoKSA+IDEpCisJCQkJCWhhbmRsZUludmFsaWRNdWx0aU5vZGVzKG5vZGVOYW1lKTsKKwkJCQlub2RlID0gKE5vZGUpIG5vZGVzLmdldCgwKTsKKwkJCQlpZiAobm9kZSAhPSBudWxsKSB7CisJCQkJCWlmIChhZGRBZGFwdGVycyAmJiAobWFwICE9IG51bGwgfHwgbWFwLmlzTWFuYWdlZEJ5UGFyZW50KCkpKQorCQkJCQkJYWRkRE9NQWRhcHRlcihjdXJOb2RlKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBub2RlOworCX0KKworCXByb3RlY3RlZCB2b2lkIGhhbmRsZUludmFsaWRNdWx0aU5vZGVzKFN0cmluZyBub2RlTmFtZSkgeworCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5FTUYyRE9NQWRhcHRlckltcGxfRVJST1JfMCwgbmV3IE9iamVjdFtde25vZGVOYW1lfSkpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIHBhdGggc3BlY2lmaWVkIGJ5IDxtYXA+dW5kZXIgPG5vZGU+LiBPbmx5IHRoZSBwb3J0aW9uIG9mIHRoZSBwYXRoIHRoYXQgZG9lcyBub3QKKwkgKiBleGlzdCAoaWYgYW55KSBpcyBjcmVhdGVkCisJICogCisJICogQHBhcmFtIG5vZGUKKwkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKKwkgKiBAcGFyYW0gbWFwCisJICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5tb2YyZG9tLlRyYW5zbGF0b3IKKwkgKi8KKwlwcm90ZWN0ZWQgVGV4dCBmaW5kT3JDcmVhdGVUZXh0Tm9kZShOb2RlIHBhcmVudCwgVHJhbnNsYXRvciBtYXAsIFN0cmluZyB0ZXh0KSB7CisJCVRleHQgdGV4dE5vZGUgPSBET01VdGlsaXRpZXMuZ2V0Q2hpbGRUZXh0Tm9kZShwYXJlbnQpOworCQlpZiAodGV4dE5vZGUgIT0gbnVsbCkgeworCQkJdGV4dE5vZGUuc2V0RGF0YSh0ZXh0KTsKKwkJfSBlbHNlIHsKKwkJCWlmICghaXNFbXB0eVRhZygoRWxlbWVudCkgcGFyZW50KSkgeworCQkJCVRleHQgbmV3Tm9kZSA9IGNyZWF0ZVRleHROb2RlKHBhcmVudC5nZXRPd25lckRvY3VtZW50KCksIG1hcCwgdGV4dCk7CisJCQkJRE9NVXRpbGl0aWVzLmluc2VydEJlZm9yZU5vZGUocGFyZW50LCBuZXdOb2RlLCBudWxsKTsKKwkJCQlyZXR1cm4gbmV3Tm9kZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdGV4dE5vZGU7CisJfQorCisJcHJvdGVjdGVkIFRyYW5zbGF0b3IgZmluZFRyYW5zbGF0b3IoU3RyaW5nIHRhZ05hbWUsIGJvb2xlYW4gYXR0cmlidXRlTWFwKSB7CisJCVRyYW5zbGF0b3JbXSBtYXBzID0gZ2V0Q2hpbGRUcmFuc2xhdG9ycygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcHMubGVuZ3RoOyBpKyspIHsKKwkJCVRyYW5zbGF0b3IgbWFwID0gbWFwc1tpXTsKKwkJCWlmIChtYXAuaXNNYXBGb3IodGFnTmFtZSkgJiYgYXR0cmlidXRlTWFwID09IG1hcC5pc0RPTUF0dHJpYnV0ZSgpKQorCQkJCXJldHVybiBtYXBzW2ldOworCQl9CisKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHJvdGVjdGVkIEVNRjJET01BZGFwdGVyIGdldEV4aXN0aW5nQWRhcHRlcihOb2RlIGFOb2RlKSB7CisJCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSBwcmltR2V0RXhpc3RpbmdBZGFwdGVyKGFOb2RlKTsKKwkJaWYgKGFkYXB0ZXIgIT0gbnVsbCAmJiBhZGFwdGVyLmlzTU9GUHJveHkoKSkgeworCQkJcmVtb3ZlRE9NQWRhcHRlcihhTm9kZSwgYWRhcHRlcik7CisJCQlhZGFwdGVyLmdldFRhcmdldCgpLmVBZGFwdGVycygpLnJlbW92ZShhZGFwdGVyKTsKKwkJCWFkYXB0ZXIgPSBudWxsOworCQl9CisJCXJldHVybiBhZGFwdGVyOworCX0KKworCXByb3RlY3RlZCB2b2lkIGhhbmRsZURlcGVuZGVuY3lGZWF0dXJlKE5vdGlmaWNhdGlvbiBtc2cpIHsKKwkJaWYgKG1zZy5nZXRPbGRWYWx1ZSgpICE9IG51bGwpCisJCQlyZW1vdmVEZXBlbmRlbmN5QWRhcHRlcigoRU9iamVjdCkgbXNnLmdldE9sZFZhbHVlKCkpOworCQlpZiAobXNnLmdldE5ld1ZhbHVlKCkgIT0gbnVsbCkKKwkJCWFkZERlcGVuZGVuY3lBZGFwdGVyKChFT2JqZWN0KSBtc2cuZ2V0TmV3VmFsdWUoKSk7CisJfQorCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNEZXBlbmRlbmN5RmVhdHVyZShOb3RpZmljYXRpb24gbXNnKSB7CisJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7CisJCQljYXNlIE5vdGlmaWNhdGlvbi5TRVQgOgorCQkJCXJldHVybiBmVHJhbnNsYXRvci5pc0RlcGVuZGVuY3lQYXJlbnQoKSAmJiBmVHJhbnNsYXRvci5nZXREZXBlbmRlbmN5RmVhdHVyZSgpID09IG1zZy5nZXRGZWF0dXJlKCk7CisJCQlkZWZhdWx0IDoKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VtcHR5VGFnKEVsZW1lbnQgcGFyZW50KSB7CisJCVJldmlzaXQudG9EbygpOworCQkvL0RldGVybWluZSBob3cgdG8gaW1wbGVtZW50IHRoaXMgd2l0aCBwdXJlIERPTSBhcGlzLCBpZiBwb3NzaWJsZS4KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXByb3RlY3RlZCB2b2lkIHBvc3RVcGRhdGVET01GZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcHJlVXBkYXRlRE9NRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgeworCX0KKworCS8qKgorCSAqIFVwZGF0ZSBhbiBhdHRyaWJ1dGUgb2YgdGhlIHRhcmdldCBET00gb2JqZWN0IGZyb20gd2l0aCB0aGUgdmFsdWVzIGN1cnJlbnRseSBzdG9yZWQgaW4gdGhlIE1PRgorCSAqIG9iamVjdC4gVGhlCisJICogCisJICogQG1hcCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIE1PRiBhdHRyaWJ1dGUgdG8gdXBkYXRlIGFuZCB0aGUgbmFtZSBvZiB0aGUgRE9NIG5vZGUuCisJICogCisJICogQHBhcmFtIG1hcAorCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMubW9mMmRvbS5BdHRyaWJ1dGVUcmFuc2xhdG9yCisJICovCisJcHJvdGVjdGVkIHZvaWQgcHJpbVVwZGF0ZURPTUZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKKwkJT2JqZWN0IGF0dHJWYWx1ZSA9IG51bGw7CisJCWJvb2xlYW4gaXNTZXQgPSBmYWxzZTsKKwkJaWYgKG1hcC5pc0lETWFwKCkpIHsKKwkJCXRyeSB7CisJCQkJYXR0clZhbHVlID0gbWFwLmdldE1PRlZhbHVlKG1vZk9iamVjdCk7CisJCQl9IGNhdGNoIChJRFRyYW5zbGF0b3IuTm9SZXNvdXJjZUV4Y2VwdGlvbiBleCkgeworCQkJCS8vSWYgdGhlIG9iamVjdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHJlc291cmNlLAorCQkJCS8vTm8gbmVlZCB0byB1cGRhdGUKKwkJCQlyZXR1cm47CisJCQl9CisJCQlpc1NldCA9IGF0dHJWYWx1ZSAhPSBudWxsOworCQl9IGVsc2UgeworCQkJYXR0clZhbHVlID0gbWFwLmdldE1PRlZhbHVlKG1vZk9iamVjdCk7CisJCQlpc1NldCA9IG1hcC5pc1NldE1PRlZhbHVlKG1vZk9iamVjdCk7CisJCX0KKworCQlpZiAobWFwLmlzRE9NQXR0cmlidXRlKCkpIHsKKwkJCS8vIEFuIGF0dHJpYnV0ZSBvZiB0aGUgTU9GIG9iamVjdCBtYXBzIHRvIGFuIGF0dHJpYnV0ZSBvZiB0aGUKKwkJCS8vIERPTSBub2RlLiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBNT0YgYXR0cmlidXRlIGFuZCBzZXQgaXQKKwkJCS8vIGludG8gRE9NIG5vZGUuCisJCQlFbGVtZW50IGUgPSAoRWxlbWVudCkgY3JlYXRlRE9NUGF0aChub2RlLCBtYXApOworCQkJaWYgKGF0dHJWYWx1ZSAhPSBudWxsICYmIGlzU2V0KQorCQkJCWUuc2V0QXR0cmlidXRlKG1hcC5nZXRET01OYW1lKG1vZk9iamVjdCksIG1hcC5jb252ZXJ0VmFsdWVUb1N0cmluZyhhdHRyVmFsdWUsIG1vZk9iamVjdCkpOworCQkJZWxzZQorCQkJCWUucmVtb3ZlQXR0cmlidXRlKG1hcC5nZXRET01OYW1lKG1vZk9iamVjdCkpOworCQl9IGVsc2UgeworCQkJdXBkYXRlRE9NU3VidHJlZShtYXAsIG5vZGUsIG1vZk9iamVjdCwgYXR0clZhbHVlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFVwZGF0ZSBhbiBhdHRyaWJ1dGUgb2YgdGhlIHRhcmdldCBET00gb2JqZWN0IGZyb20gd2l0aCB0aGUgdmFsdWVzIGN1cnJlbnRseSBzdG9yZWQgaW4gdGhlIE1PRgorCSAqIG9iamVjdC4gVGhlCisJICogCisJICogQG1hcCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIE1PRiBhdHRyaWJ1dGUgdG8gdXBkYXRlIGFuZCB0aGUgbmFtZSBvZiB0aGUgRE9NIG5vZGUuCisJICovCisJcHJvdGVjdGVkIHZvaWQgcHJpbVVwZGF0ZURPTUxpbmtGZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7CisJCUxpbmtVcGRhdGVyVGFyZ2V0LklOU1RBTkNFLnVwZGF0ZURPTShtYXAsIG5vZGUsIG1vZk9iamVjdCk7CisKKwl9CisKKwkvKioKKwkgKiBVcGRhdGUgYWxsIHRoZSBjaGlsZHJlbiBvZiB0aGUgdGFyZ2V0IE1PRiBvYmplY3QgaW4gdGhlIHJlbGF0aW9uc2hpcCBkZXNjcmliZWQgYnkKKwkgKiAKKwkgKiBAbWFwLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHByaW1VcGRhdGVET01NdWx0aUZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKKworCQlMaXN0IG1vZkNoaWxkcmVuID0gbWFwLmdldE1PRkNoaWxkcmVuKG1vZk9iamVjdCk7CisJCUxpc3QgZG9tQ2hpbGRyZW4gPSBnZXRET01DaGlsZHJlbihub2RlLCBtYXApOworCisJCXByaW1VcGRhdGVET01NdWx0aUZlYXR1cmUobWFwLCBub2RlLCBtb2ZDaGlsZHJlbiwgZG9tQ2hpbGRyZW4sIG1vZk9iamVjdCk7CisJfQorCisJLyoqCisJICogVXBkYXRlIGFuIGF0dHJpYnV0ZSBvZiB0aGUgdGFyZ2V0IE1PRiBvYmplY3QgZnJvbSB0aGUgRE9NIG5vZGUgc3VidHJlZS4gVGhlCisJICogCisJICogQG1hcCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIE1PRiBhdHRyaWJ1dGUgdG8gdXBkYXRlIGFuZCB0aGUgbmFtZSBvZiB0aGUgRE9NIG5vZGUuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gcHJpbVVwZGF0ZU1PRkZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKKwkJaWYgKCFtYXAuZmVhdHVyZUV4aXN0cyhtb2ZPYmplY3QpKQorCQkJcmV0dXJuIGZhbHNlOworCQlPYmplY3QgZG9tVmFsdWUgPSBudWxsOworCQlib29sZWFuIHVwZGF0ZU1PRkF0dEFkYXB0ZXIgPSBmYWxzZTsKKwkJYm9vbGVhbiBpc1Vuc2V0ID0gZmFsc2U7CisJCUVNRjJET01BZGFwdGVyIGF0dHJBZGFwdGVyID0gbnVsbDsKKworCQlOb2RlIGNoaWxkID0gZmluZERPTU5vZGUobm9kZSwgbWFwLCB0cnVlKTsKKworCQlpZiAobWFwLmlzRE9NQXR0cmlidXRlKCkgJiYgY2hpbGQgIT0gbnVsbCkgeworCQkJLy8gQW4gYXR0cmlidXRlIG9mIHRoZSBNT0Ygb2JqZWN0IG1hcHMgdG8gYW4gYXR0cmlidXRlIG9mIHRoZQorCQkJLy8gRE9NIG5vZGUuIEdldCB0aGUgdmFsdWUgb2YgdGhlIERPTSBhdHRyaWJ1dGUgYW5kIHNldCBpdAorCQkJLy8gaW50byB0aGUgTU9GIG9iamVjdC4KKworCQkJQXR0ciBkb21BdHRyID0gKEF0dHIpIGNoaWxkLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0obWFwLmdldERPTU5hbWUobW9mT2JqZWN0KSk7CisJCQlpZiAoZG9tQXR0ciAhPSBudWxsKSB7CisJCQkJZG9tVmFsdWUgPSBkb21BdHRyLmdldFZhbHVlKCk7CisJCQkJZG9tVmFsdWUgPSBtYXAuY29udmVydFN0cmluZ1RvVmFsdWUoKFN0cmluZykgZG9tVmFsdWUsIG1vZk9iamVjdCk7CisJCQl9IGVsc2UKKwkJCQlpc1Vuc2V0ID0gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCS8vIEFuIGF0dHJpYnV0ZSBvZiB0aGUgTU9GIG9iamVjdCBpcyBhY3R1YWxseSBhIHN1Yi1lbGVtZW50CisJCQkvLyBvZiB0aGUgRE9NIG5vZGUuIFNlYXJjaCBmb3IgdGhlIGZpcnN0IHN1Yi1lbGVtZW50IHdpdGgKKwkJCS8vIHRoZSBjb3JyZWN0IG5hbWUgdG8gdXNlIGFzIGFuIGF0dHJpYnV0ZS4KKwkJCWlmIChjaGlsZCAhPSBudWxsKSB7CisJCQkJLy8gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYSBzaW5nbGUgdmFsdWVkIGF0dHJpYnV0ZSB0aGF0IGhhcworCQkJCS8vIGEgTU9GIG9iamVjdCBhcyBpdHMgdmFsdWUKKwkJCQlpZiAoIW1hcC5pc01hbmFnZWRCeVBhcmVudCgpKSB7CisJCQkJCWF0dHJBZGFwdGVyID0gY3JlYXRlQWRhcHRlcihjaGlsZCwgbWFwKTsKKwkJCQkJdXBkYXRlTU9GQXR0QWRhcHRlciA9IHRydWU7CisJCQkJCWRvbVZhbHVlID0gYXR0ckFkYXB0ZXIuZ2V0VGFyZ2V0KCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjaGlsZCBpcyBhZGFwdGVkLiBJZiBub3QsIGFkYXB0CisJCQkJCS8vIGl0LgorCQkJCQlhZGRET01BZGFwdGVyKGNoaWxkKTsKKworCQkJCQkvLyBFeHRyYWN0IHRoZSB2YWx1ZSBmcm9tIHRoZSB0ZXh0IGNoaWxkCisJCQkJCWRvbVZhbHVlID0gZXh0cmFjdFZhbHVlKGNoaWxkLCBtYXAsIG1vZk9iamVjdCk7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJaXNVbnNldCA9IHRydWU7CisJCX0KKworCQkvLyBTZXQgdGhlIGF0dHJpYnV0ZSBleHRyYWN0ZWQgZnJvbSB0aGUgRE9NIHRvIHRoZSBNT0Ygb2JqZWN0LgorCQlib29sZWFuIGhhc0NoYW5nZWQgPSB0cnVlOworCQl0cnkgeworCQkJaWYgKG1hcC5pc0lETWFwKCkpCisJCQkJbWFwLnNldE1PRlZhbHVlKG1vZk9iamVjdCwgZG9tVmFsdWUpOworCQkJZWxzZSB7CisJCQkJT2JqZWN0IG9sZFZhbHVlID0gbnVsbDsKKwkJCQlvbGRWYWx1ZSA9IG1hcC5nZXRNT0ZWYWx1ZShtb2ZPYmplY3QpOworCQkJCWJvb2xlYW4gaXNTZXQgPSBtYXAuaXNTZXRNT0ZWYWx1ZShtb2ZPYmplY3QpOworCQkJCS8vSW4gdGhlIGNhc2Ugb2YgZW51bXMgd2l0aCBkZWZhdWx0IHZhbHVlcywgd2UgbmVlZCB0byB0cmlwCisJCQkJLy8gdGhlIGF0dHJpYnV0ZSBmcm9tCisJCQkJLy9kZWZhdWx0IHRvIGEgc2V0IHZhbHVlCisJCQkJaWYgKG9sZFZhbHVlID09IGRvbVZhbHVlKSB7CisJCQkJCWlmIChvbGRWYWx1ZSA9PSBudWxsIHx8IGlzU2V0KQorCQkJCQkJaGFzQ2hhbmdlZCA9IGZhbHNlOworCQkJCX0gZWxzZSBpZiAoZG9tVmFsdWUgPT0gbnVsbCAmJiAhaXNTZXQpCisJCQkJCS8vSWYgdGhlIGRvbVZhbHVlIGlzIG51bGwgYW5kIHRoZSBmZWF0dXJlIGlzIG5vdCBzZXQsIHRoZW4KKwkJCQkJLy8gd2UgZG9uJ3QgbmVlZAorCQkJCQkvL3RvIGRvIGFueXRoaW5nCisJCQkJCWhhc0NoYW5nZWQgPSBmYWxzZTsKKwkJCQllbHNlIGlmIChvbGRWYWx1ZSAhPSBudWxsICYmIG9sZFZhbHVlLmVxdWFscyhkb21WYWx1ZSkgJiYgaXNTZXQpCisJCQkJCWhhc0NoYW5nZWQgPSBmYWxzZTsKKwkJCQlpZiAob2xkVmFsdWUgPT0gbnVsbCAmJiBkb21WYWx1ZSA9PSBudWxsICYmIG1hcC5pc1NldE1PRlZhbHVlKG1vZk9iamVjdCkgPT0gaXNVbnNldCkKKwkJCQkJaGFzQ2hhbmdlZCA9IHRydWU7CisJCQkJaWYgKGhhc0NoYW5nZWQpIHsKKwkJCQkJaWYgKCEobWFwLmlzRGF0YVR5cGUoKSkgJiYgIW1hcC5pc1NoYXJlZCgpKQorCQkJCQkJcmVtb3ZlTU9GVmFsdWUoKEVPYmplY3QpIG9sZFZhbHVlLCBtYXApOworCQkJCQlpZiAoZG9tVmFsdWUgPT0gbnVsbCkKKwkJCQkJCW1hcC51blNldE1PRlZhbHVlKG1vZk9iamVjdCk7CisJCQkJCWVsc2UKKwkJCQkJCW1hcC5zZXRNT0ZWYWx1ZShtb2ZPYmplY3QsIGRvbVZhbHVlKTsKKworCQkJCQlpZiAoKGRvbVZhbHVlID09IG51bGwgJiYgIShtYXAuaXNFbnVtRmVhdHVyZSgpKSkgfHwgaXNVbnNldCkKKwkJCQkJCW1hcC51blNldE1PRlZhbHVlKG1vZk9iamVjdCk7IC8vdW5zZXQKKwkJCQkJLy8gbnVsbAorCQkJCQkvLyBmb3IKKwkJCQkJLy8gbm9uCisJCQkJCS8vIGVudW0KKwkJCQkJLy8gZmVhdHVyZXMKKworCQkJCQlpZiAodXBkYXRlTU9GQXR0QWRhcHRlcikKKwkJCQkJCWF0dHJBZGFwdGVyLnVwZGF0ZU1PRigpOworCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbiBleCkgeworCQkJaGFuZGxlRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbihleCk7CisJCQltYXAudW5TZXRNT0ZWYWx1ZShtb2ZPYmplY3QpOworCQl9CisJCXJldHVybiBoYXNDaGFuZ2VkOworCX0KKworCS8qKgorCSAqIFVwZGF0ZSBhbiBhdHRyaWJ1dGUgb2YgdGhlIHRhcmdldCBNT0Ygb2JqZWN0IGZyb20gdGhlIERPTSBub2RlIHN1YnRyZWUuIFRoaXMgbWV0aG9kIGlzIG9ubHkKKwkgKiBjYWxsZWQgaWYgdGhlIERPTSBub2RlIGNoYW5nZXMgYW5kIHRoZSBtYXAgaXMgYW4gb2JqZWN0IGxpbmsgbWFwLiBUaGUKKwkgKiAKKwkgKiBAbWFwIHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgTU9GIGF0dHJpYnV0ZSB0byB1cGRhdGUgYW5kIHRoZSBuYW1lIG9mIHRoZSBET00gbm9kZS4KKwkgKiAKKwkgKiBAcGFyYW0gbWFwCisJICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5tb2YyZG9tLkF0dHJpYnV0ZVRyYW5zbGF0b3IKKwkgKiBAcmV0dXJuIFJldHVybiB0cnVlIGlmIHRoZSBNT0YgZmVhdHVyZSB3YXMgdXBkYXRlZCwgZmFsc2UgaWYgbm8gdXBkYXRlIHdhcyBkb25lLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHByaW1VcGRhdGVNT0ZMaW5rRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgeworCQlMaW5rVXBkYXRlclRhcmdldC5JTlNUQU5DRS51cGRhdGVNT0YobWFwLCBub2RlLCBtb2ZPYmplY3QpOworCX0KKworCS8qKgorCSAqIFVwZGF0ZSBhbGwgdGhlIGNoaWxkcmVuIG9mIHRoZSB0YXJnZXQgTU9GIG9iamVjdCBpbiB0aGUgcmVsYXRpb25zaGlwIGRlc2NyaWJlZCBieQorCSAqIAorCSAqIEBtYXAuCisJICogCisJICogQHBhcmFtIG1hcAorCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMubW9mMmRvbS5BdHRyaWJ1dGVUcmFuc2xhdG9yIERlc2NyaWJlcyB0aGUgbWFwcGluZyBmcm9tIHRoZSBNT0YKKwkgKiAgICAgICAgICAgIGF0dHJpYnV0ZSBuYW1lIHRvIHRoZSBET00gbm9kZSBuYW1lCisJICovCisJcHJvdGVjdGVkIHZvaWQgcHJpbVVwZGF0ZU1PRk11bHRpRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgeworCQkvLyBJZiB0aGUgZmVhdHVyZSBpcyBhIGNvbGxlY3Rpb24gb2Ygc3RyaW5ncyBvciBpbnRzLCBjYWxsIGEgc3BlY2lhbAorCQkvLyBtZXRob2QKKwkJLy8gdGhhdCBoYW5kbGVzIHRoaXMuCisJCWlmIChtYXAuaXNNYW5hZ2VkQnlQYXJlbnQoKSkgeworCQkJdXBkYXRlTU9GTXVsdGlQcmltaXRpdmVGZWF0dXJlKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKKwkJCXJldHVybjsKKwkJfQorCisJCUxpc3Qgbm9kZUNoaWxkcmVuID0gZ2V0RE9NQ2hpbGRyZW4obm9kZSwgbWFwKTsKKwkJTGlzdCBtb2ZDaGlsZHJlbiA9IG1hcC5nZXRNT0ZDaGlsZHJlbihtb2ZPYmplY3QpOworCisJCXByaW1VcGRhdGVNT0ZNdWx0aUZlYXR1cmUobWFwLCBub2RlLCBtb2ZDaGlsZHJlbiwgbm9kZUNoaWxkcmVuKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVEZXBlbmRlbmN5QWRhcHRlcihFT2JqZWN0IG9iaikgeworCQlBZGFwdGVyIGV4aXN0aW5nID0gRWNvcmVVdGlsLmdldEV4aXN0aW5nQWRhcHRlcihvYmosIERlcGVuZGVuY3lBZGFwdGVyLktFWSk7CisJCWlmIChleGlzdGluZyAhPSBudWxsKQorCQkJb2JqLmVBZGFwdGVycygpLnJlbW92ZShleGlzdGluZyk7CisJfQorCisJLyoqCisJICogUmVtb3ZlcyBhbGwgdGhlIERPTSBjaGlsZHJlbiBmcm9tIDxwYXJlbnQ+dGhhdCBhcmUgcmVwcmVzZW50ZWQgYnkgPG1hcD4uCisJICovCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRE9NQ2hpbGRyZW4oTm9kZSBwYXJlbnQsIFRyYW5zbGF0b3IgbWFwKSB7CisJCVN0cmluZ1tdIGRvbU5hbWVzID0gbWFwLmdldERPTU5hbWVzKCk7CisJCUhhc2hTZXQgZG9tTmFtZXNTZXQgPSBuZXcgSGFzaFNldChkb21OYW1lcy5sZW5ndGgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGRvbU5hbWVzLmxlbmd0aDsgaSsrKQorCQkJZG9tTmFtZXNTZXQuYWRkKGRvbU5hbWVzW2ldKTsKKworCQkvLyBXYWxrIHRocm91Z2ggYWxsIHRoZSBjaGlsZHJlbiBhbmQgZmluZCBhbnkgdGhhdCBtYXRjaCB0aGUgbWFwLgorCQlOb2RlTGlzdCBubCA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7CisJCUxpc3QgdG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0KCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbmwuZ2V0TGVuZ3RoKCk7IGkrKykgeworCQkJTm9kZSBjaGlsZE5vZGUgPSBubC5pdGVtKGkpOworCQkJaWYgKGRvbU5hbWVzU2V0LmNvbnRhaW5zKGNoaWxkTm9kZS5nZXROb2RlTmFtZSgpKSkKKwkJCQl0b1JlbW92ZS5hZGQoY2hpbGROb2RlKTsKKwkJfQorCisJCS8vIFJlbW92ZSBhbnkgY2hpbGRyZW4gdGhhdCB3ZXJlIGZvdW5kLgorCQlmb3IgKGludCBpID0gMDsgaSA8IHRvUmVtb3ZlLnNpemUoKTsgaSsrKSB7CisJCQlOb2RlIGNoaWxkTm9kZSA9IChOb2RlKSB0b1JlbW92ZS5nZXQoaSk7CisJCQlyZW1vdmVET01DaGlsZChwYXJlbnQsIGNoaWxkTm9kZSwgdHJ1ZSk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRUYXJnZXRGcm9tTm9kZSgpIHsKKwkJc2V0VGFyZ2V0KGZUcmFuc2xhdG9yLmNyZWF0ZUVNRk9iamVjdChmTm9kZS5nZXROb2RlTmFtZSgpLCBleHRyYWN0UmVhZEFoZWFkTmFtZSgpKSk7CisJfQorCisJLyoqCisJICogVXBkYXRlIGFuIGF0dHJpYnV0ZSBvZiB0aGUgdGFyZ2V0IERPTSBvYmplY3QgZnJvbSB3aXRoIHRoZSB2YWx1ZXMgY3VycmVudGx5IHN0b3JlZCBpbiB0aGUgTU9GCisJICogb2JqZWN0LiBUaGUKKwkgKiAKKwkgKiBAbWFwIHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgTU9GIGF0dHJpYnV0ZSB0byB1cGRhdGUgYW5kIHRoZSBuYW1lIG9mIHRoZSBET00gbm9kZS4KKwkgKiAKKwkgKiBAcGFyYW0gbWFwCisJICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5tb2YyZG9tLkF0dHJpYnV0ZVRyYW5zbGF0b3IKKwkgKi8KKwlmaW5hbCBwdWJsaWMgdm9pZCB1cGRhdGVET01GZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7CisJCWlmICghaXNOb3RpZmljYXRpb25FbmFibGVkKCkpCisJCQlyZXR1cm47CisJCXRyeSB7CisJCQlwcmVVcGRhdGVET01GZWF0dXJlKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKKwkJCWlmIChtYXAuaXNNdWx0aVZhbHVlZCgpKSB7CisJCQkJdXBkYXRlRE9NTXVsdGlGZWF0dXJlKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCWlmIChmRGVidWcpIHsKKwkJCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJVcGRhdGluZyBET00gTm9kZTogIiArIG5vZGUpOyAvLyROT04tTkxTLTEkCisJCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiXHRmcm9tOiAiICsgbW9mT2JqZWN0KTsgLy8kTk9OLU5MUy0xJAorCQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlx0bWFwIDogIiArIG1hcCk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCWJvb2xlYW4gbm90aWZpY2F0aW9uRmxhZyA9IGlzTm90aWZpY2F0aW9uRW5hYmxlZCgpOworCQkJdHJ5IHsKKwkJCQlzZXROb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKKwkJCQlwcmltVXBkYXRlRE9NRmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7CisJCQl9IGZpbmFsbHkgeworCQkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQobm90aWZpY2F0aW9uRmxhZyk7CisJCQl9CisKKwkJCWlmIChtYXAuaXNUYXJnZXRMaW5rTWFwKCkpIHsKKwkJCQl1cGRhdGVET01MaW5rRmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7CisJCQl9CisJCX0gZmluYWxseSB7CisJCQlwb3N0VXBkYXRlRE9NRmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBVcGRhdGUgYW4gYXR0cmlidXRlIG9mIHRoZSB0YXJnZXQgRE9NIG9iamVjdCBmcm9tIHRoZSB2YWx1ZXMgY3VycmVudGx5IHN0b3JlZCBpbiB0aGUgTU9GCisJICogb2JqZWN0LiBUaGUKKwkgKiAKKwkgKiBAbWFwIHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgTU9GIGF0dHJpYnV0ZSB0byB1cGRhdGUgYW5kIHRoZSBuYW1lIG9mIHRoZSBET00gbm9kZS4KKwkgKiAKKwkgKiBAcGFyYW0gbWFwCisJICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5tb2YyZG9tLkF0dHJpYnV0ZVRyYW5zbGF0b3IKKwkgKi8KKwlmaW5hbCBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVET01MaW5rRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgeworCQlpZiAoZkRlYnVnKSB7CisJCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJVcGRhdGluZyBET00gTm9kZSAobGluayk6ICIgKyBub2RlKTsgLy8kTk9OLU5MUy0xJAorCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiXHRmcm9tOiAiICsgbW9mT2JqZWN0KTsgLy8kTk9OLU5MUy0xJAorCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiXHRtYXAgOiAiICsgbWFwKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCXByaW1VcGRhdGVET01MaW5rRmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7CisJfQorCisJLyoqCisJICogVXBkYXRlIGFsbCB0aGUgY2hpbGRyZW4gb2YgdGhlIHRhcmdldCBNT0Ygb2JqZWN0IGluIHRoZSByZWxhdGlvbnNoaXAgZGVzY3JpYmVkIGJ5CisJICogCisJICogQG1hcC4KKwkgKiAKKwkgKiBAcGFyYW0gbWFwCisJICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5tb2YyZG9tLkF0dHJpYnV0ZVRyYW5zbGF0b3IgRGVzY3JpYmVzIHRoZSBtYXBwaW5nIGZyb20gdGhlIE1PRgorCSAqICAgICAgICAgICAgYXR0cmlidXRlIG5hbWUgdG8gdGhlIERPTSBub2RlIG5hbWUKKwkgKi8KKwlmaW5hbCBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVET01NdWx0aUZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKKwkJaWYgKGZEZWJ1ZykgeworCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiVXBkYXRpbmcgRE9NIE5vZGUgKG11bHRpKTogIiArIG5vZGUpOyAvLyROT04tTkxTLTEkCisJCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJcdGZyb206ICIgKyBtb2ZPYmplY3QpOyAvLyROT04tTkxTLTEkCisJCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJcdG1hcCA6ICIgKyBtYXApOyAvLyROT04tTkxTLTEkCisJCX0KKwkJYm9vbGVhbiBub3RpZmljYXRpb25GbGFnID0gaXNOb3RpZmljYXRpb25FbmFibGVkKCk7CisJCXRyeSB7CisJCQlzZXROb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKKwkJCXByaW1VcGRhdGVET01NdWx0aUZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOworCQl9IGZpbmFsbHkgeworCQkJc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChub3RpZmljYXRpb25GbGFnKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFVwZGF0ZSBhIERPTSBzdWJ0cmVlIHRvIHJlZmxlY3QgdGhlIG1vZk9iamVjdCBhbmQgbWFwIHBhc3NlZCBpbi4gVGhlIHN1YnRyZWUgaXMgb2YgPG5vZGU+aXMKKwkgKiB1cGRhdGVkLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURPTVN1YnRyZWUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QsIE9iamVjdCBhdHRyVmFsdWUpIHsKKworCQlpZiAobWFwLmZlYXR1cmVFeGlzdHMobW9mT2JqZWN0KSkgeworCQkJaWYgKChtYXAuaXNFbnVtRmVhdHVyZSgpIHx8IG1hcC5pc0Jvb2xlYW5GZWF0dXJlKCkpICYmIChtYXAuaXNVbnNldHRhYmxlKCkgJiYgIW1hcC5pc1NldE1PRlZhbHVlKG1vZk9iamVjdCkpKQorCQkJCWF0dHJWYWx1ZSA9IG51bGw7CisJCX0gZWxzZQorCQkJYXR0clZhbHVlID0gbWFwLmV4dHJhY3RTdHJpbmdWYWx1ZShtb2ZPYmplY3QpOworCisJCS8vIENyZWF0ZSBhbmQvb3IgdXBkYXRlIHRoZSBET00gc3VidHJlZQorCQlpZiAoYXR0clZhbHVlICE9IG51bGwpIHsKKwkJCU5vZGUgcGFyZW50ID0gY3JlYXRlRE9NUGF0aChub2RlLCBtYXApOworCQkJaWYgKG1hcC5pc01hbmFnZWRCeVBhcmVudCgpKSB7CisJCQkJLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBtb2YgdmFsdWUgaXMgbm90IGFub3RoZXIKKwkJCQkvLyBtb2Ygb2JqZWN0IChwcmltaXRpdmUpCisJCQkJaWYgKG1hcC5nZXRET01OYW1lKG1vZk9iamVjdCkgIT0gbnVsbCAmJiBtYXAuZ2V0RE9NTmFtZShtb2ZPYmplY3QpLnN0YXJ0c1dpdGgoIiMiKSkgLy8kTk9OLU5MUy0xJAorCQkJCQlyZXR1cm47CisKKwkJCQlFbGVtZW50IGNoaWxkID0gbWFwLmlzRE9NVGV4dFZhbHVlKCkgPyAoRWxlbWVudCkgcGFyZW50IDogZmluZE9yQ3JlYXRlTm9kZShwYXJlbnQsIG1hcCwgbWFwLmdldERPTU5hbWUobW9mT2JqZWN0KSk7CisKKwkJCQlmaW5kT3JDcmVhdGVUZXh0Tm9kZShjaGlsZCwgbWFwLCBtYXAuY29udmVydFZhbHVlVG9TdHJpbmcoYXR0clZhbHVlLCBtb2ZPYmplY3QpKTsKKwkJCX0gZWxzZSB7CisJCQkJLy8gSGFuZGxlIHRoZSBjYXNlIHdlcmUgdGhlIG1vZiB2YWx1ZSBpcyBhIG1vZiBvYmplY3QuCisJCQkJRU9iamVjdCBtb2ZWYWx1ZSA9IChFT2JqZWN0KSBhdHRyVmFsdWU7CisJCQkJRU1GMkRPTUFkYXB0ZXIgdmFsdWVBZGFwdGVyID0gKEVNRjJET01BZGFwdGVyKSBFY29yZVV0aWwuZ2V0RXhpc3RpbmdBZGFwdGVyKG1vZlZhbHVlLCBFTUYyRE9NQWRhcHRlci5BREFQVEVSX0NMQVNTKTsKKwkJCQlpZiAodmFsdWVBZGFwdGVyICE9IG51bGwpCisJCQkJCXZhbHVlQWRhcHRlci51cGRhdGVET00oKTsKKwkJCQllbHNlIHsKKwkJCQkJcmVtb3ZlRE9NQ2hpbGRyZW4ocGFyZW50LCBtYXApOworCQkJCQlFTUYyRE9NQWRhcHRlciBhZGFwdGVyID0gY3JlYXRlQWRhcHRlcihtb2ZWYWx1ZSwgbWFwKTsKKwkJCQkJTGlzdCBtb2ZDaGlsZHJlbiA9IG1hcC5nZXRNT0ZDaGlsZHJlbihtb2ZPYmplY3QpOworCQkJCQlMaXN0IGRvbUNoaWxkcmVuID0gZ2V0RE9NQ2hpbGRyZW4ocGFyZW50LCBtYXApOworCisJCQkJCU5vZGUgaW5zZXJ0QmVmb3JlTm9kZSA9IGZpbmRJbnNlcnRCZWZvcmVOb2RlKHBhcmVudCwgbWFwLCBtb2ZDaGlsZHJlbiwgMCwgZG9tQ2hpbGRyZW4pOworCQkJCQlET01VdGlsaXRpZXMuaW5zZXJ0QmVmb3JlTm9kZUFuZFdoaXRlc3BhY2UocGFyZW50LCBhZGFwdGVyLmdldE5vZGUoKSwgaW5zZXJ0QmVmb3JlTm9kZSk7CisJCQkJCWJvb2xlYW4gbm90aWZpY2F0aW9uRmxhZyA9IGFkYXB0ZXIuaXNOb3RpZmljYXRpb25FbmFibGVkKCk7CisJCQkJCWFkYXB0ZXIuc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChmYWxzZSk7CisJCQkJCXRyeSB7CisJCQkJCQlpbmRlbnQoYWRhcHRlci5nZXROb2RlKCksIG1hcCk7CisJCQkJCX0gZmluYWxseSB7CisJCQkJCQlhZGFwdGVyLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQobm90aWZpY2F0aW9uRmxhZyk7CisJCQkJCX0KKwkJCQkJYWRhcHRlci51cGRhdGVET00oKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQkvLyBUaGUgYXR0cmlidXRlIHZhbHVlIHdhcyBzZXQgdG8gbnVsbCBvciB1bnNldC4gUmVtb3ZlIGFueQorCQkJLy8gZXhpc3RpbmcgRE9NIG5vZGVzLgorCQkJTm9kZSBjaGlsZCA9IGZpbmRET01Ob2RlKG5vZGUsIG1hcCk7CisJCQlpZiAoY2hpbGQgIT0gbnVsbCkKKwkJCQlyZW1vdmVET01DaGlsZChjaGlsZC5nZXRQYXJlbnROb2RlKCksIGNoaWxkKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFVwZGF0ZSBhIGZlYXR1cmUgdGhhdCBpcyBzZXQgYnkgbGlua2luZyB0byBhbm90aGVyIGV4aXN0aW5nIG9iamVjdC4gVGhpcyBtZXRob2QgaXMgY2FsbGVkCisJICogd2hlbiB0aGUgTU9GIG9iamVjdCBpcyB1cGRhdGVkIGluIG9yZGVyIHRvIHVwZGF0ZSBET00gbm9kZXMuCisJICovCisJZmluYWwgcHJvdGVjdGVkIHZvaWQgdXBkYXRlTU9GTGlua0ZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKKwkJaWYgKGZEZWJ1ZykgeworCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiVXBkYXRpbmcgTU9GT2JqZWN0IChsaW5rKTogIiArIG1vZk9iamVjdCk7IC8vJE5PTi1OTFMtMSQKKwkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlx0ZnJvbTogIiArIG5vZGUpOyAvLyROT04tTkxTLTEkCisJCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJcdG1hcCA6ICIgKyBtYXApOyAvLyROT04tTkxTLTEkCisJCX0KKwkJYm9vbGVhbiBub3RpZmljYXRpb25GbGFnID0gaXNOb3RpZmljYXRpb25FbmFibGVkKCk7CisJCXRyeSB7CisJCQlzZXROb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKKwkJCXByaW1VcGRhdGVNT0ZMaW5rRmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7CisJCX0gZmluYWxseSB7CisJCQlzZXROb3RpZmljYXRpb25FbmFibGVkKG5vdGlmaWNhdGlvbkZsYWcpOworCQl9CisJfQorCisJLyoqCisJICogVXBkYXRlIGFsbCB0aGUgY2hpbGRyZW4gb2YgdGhlIHRhcmdldCBNT0Ygb2JqZWN0IGluIHRoZSByZWxhdGlvbnNoaXAgZGVzY3JpYmVkIGJ5CisJICogCisJICogQG1hcC4KKwkgKiAKKwkgKiBAcGFyYW0gbWFwCisJICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5tb2YyZG9tLkF0dHJpYnV0ZVRyYW5zbGF0b3IgRGVzY3JpYmVzIHRoZSBtYXBwaW5nIGZyb20gdGhlIE1PRgorCSAqICAgICAgICAgICAgYXR0cmlidXRlIG5hbWUgdG8gdGhlIERPTSBub2RlIG5hbWUKKwkgKi8KKwlmaW5hbCBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVNT0ZNdWx0aUZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKKwkJaWYgKGZEZWJ1ZykgeworCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiVXBkYXRpbmcgTU9GT2JqZWN0IChtdWx0aSk6ICIgKyBtb2ZPYmplY3QpOyAvLyROT04tTkxTLTEkCisJCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJcdGZyb206ICIgKyBub2RlKTsgLy8kTk9OLU5MUy0xJAorCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiXHRtYXAgOiAiICsgbWFwKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWJvb2xlYW4gbm90aWZpY2F0aW9uRmxhZyA9IGlzTm90aWZpY2F0aW9uRW5hYmxlZCgpOworCQl0cnkgeworCQkJc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChmYWxzZSk7CisJCQlwcmltVXBkYXRlTU9GTXVsdGlGZWF0dXJlKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKKwkJfSBmaW5hbGx5IHsKKwkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQobm90aWZpY2F0aW9uRmxhZyk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBVcGRhdGUgYWxsIHRoZSBjaGlsZHJlbiBvZiB0aGUgdGFyZ2V0IE1PRiBvYmplY3QgaW4gdGhlIHJlbGF0aW9uc2hpcCBkZXNjcmliZWQgYnkKKwkgKiAKKwkgKiBAbWFwLiBUaGUgcmVsYXRpb25zaGlwIE1VU1QgQkUgYSBjb2xsZWN0aW9uIG9mIHN0cmluZyBmb3IgdGhpcyBtZXRob2QgdG8gd29yay4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVNT0ZNdWx0aVByaW1pdGl2ZUZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKKwkJTGlzdCBub2RlQ2hpbGRyZW4gPSBnZXRET01DaGlsZHJlbihub2RlLCBtYXApOworCisJCW1hcC5jbGVhckxpc3QobW9mT2JqZWN0KTsKKworCQkvLyBHbyB0aHJvdWdoIHRoZSBsaXN0IG9mIG5vZGVzIGFuZCB1cGRhdGUgdGhlIE1PRiBjb2xsZWN0aW9uCisJCWludCBhZGRJbmRleCA9IDA7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUNoaWxkcmVuLnNpemUoKTsgaSsrKSB7CisJCQlOb2RlIGNoaWxkID0gKE5vZGUpIG5vZGVDaGlsZHJlbi5nZXQoaSk7CisJCQlPYmplY3QgYXR0cmlidXRlVmFsdWUgPSBleHRyYWN0VmFsdWUoY2hpbGQsIG1hcCwgbW9mT2JqZWN0KTsKKwkJCWJvb2xlYW4gYWR2YW5jZUFkZEluZGV4ID0gdHJ1ZTsKKwkJCWlmIChhdHRyaWJ1dGVWYWx1ZSAhPSBudWxsKXsKKwkJCQlpZihtYXAuZ2V0RmVhdHVyZSgpICE9IG51bGwgJiYgbWFwLmdldEZlYXR1cmUoKS5pc1VuaXF1ZSgpICYmIG1vZk9iamVjdC5lR2V0KG1hcC5nZXRGZWF0dXJlKCkpICE9IG51bGwgJiYgbW9mT2JqZWN0LmVHZXQobWFwLmdldEZlYXR1cmUoKSkgaW5zdGFuY2VvZiBMaXN0ICYmICgoTGlzdCkgbW9mT2JqZWN0LmVHZXQobWFwLmdldEZlYXR1cmUoKSkpLmNvbnRhaW5zKGF0dHJpYnV0ZVZhbHVlKSl7CisJCQkJCWFkdmFuY2VBZGRJbmRleCA9IGZhbHNlOworCQkJCQlTdHJpbmcgZG9tTmFtZSA9IG1hcC5kb21OYW1lQW5kUGF0aCAhPSBudWxsID8gbWFwLmRvbU5hbWVBbmRQYXRoIDogImF0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQKKwkJCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgJ25vIGR1cGxpY2F0ZXMnIGNvbnN0cmFpbnQgaXMgdmlvbGF0ZWQgYnkgIitkb21OYW1lKyIgPSAiK2F0dHJpYnV0ZVZhbHVlKSk7CisJCQkJCWhhbmRsZUludmFsaWRNdWx0aU5vZGVzKGNoaWxkLmdldE5vZGVOYW1lKCkpOworCQkJCX0gZWxzZSB7CisJCQkJCW1hcC5zZXRNT0ZWYWx1ZShtb2ZPYmplY3QsIGF0dHJpYnV0ZVZhbHVlLCBhZGRJbmRleCk7CisJCQkJfQorCQkJCWlmKGFkdmFuY2VBZGRJbmRleCl7CisJCQkJCWFkZEluZGV4ICsrOworCQkJCX0KKwkJCX0KKwkJCQorCQkJLy8gQWRhcHQgdGhlIG5vZGUgc28gdXBkYXRlIHdpbGwgb2NjdXIuCisJCQlhZGRET01BZGFwdGVyKGNoaWxkKTsKKwkJfQorCQlpZiAobWFwLmhhc0RPTVBhdGgoKSAmJiBub2RlQ2hpbGRyZW4uaXNFbXB0eSgpICYmIGZpbmRET01QYXRoKG5vZGUsIG1hcCwgZmFsc2UpICE9IG51bGwpCisJCQltYXAuc2V0TU9GVmFsdWVGcm9tRW1wdHlET01QYXRoKG1vZk9iamVjdCk7CisJfQorCisJLyoqCisJICogVXBkYXRlIGFuIGF0dHJpYnV0ZSBvZiB0aGUgdGFyZ2V0IE1PRiBvYmplY3QgZnJvbSB0aGUgRE9NIG5vZGUgc3VidHJlZS4gVGhlCisJICogCisJICogQG1hcCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIE1PRiBhdHRyaWJ1dGUgdG8gdXBkYXRlIGFuZCB0aGUgbmFtZSBvZiB0aGUgRE9NIG5vZGUuCisJICogCisJICogQHBhcmFtIG1hcAorCSAqICAgICAgICAgICAgY29tLmlibS5ldG9vbHMubW9mMmRvbS5BdHRyaWJ1dGVUcmFuc2xhdG9yCisJICovCisJcHVibGljIHZvaWQgdXBkYXRlTU9GRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgeworCQlpZiAoIWlzTm90aWZpY2F0aW9uRW5hYmxlZCgpKQorCQkJcmV0dXJuOworCQlpZiAobWFwLmlzTXVsdGlWYWx1ZWQoKSkgeworCQkJdXBkYXRlTU9GTXVsdGlGZWF0dXJlKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIGlmIChtYXAuaXNDb21tZW50KCkpIHsKKwkJCXVwZGF0ZU1PRkNvbW1lbnRGZWF0dXJlKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIFRPRE8gTURFIEFkZCBhIG1hcC5pc0NvbW1lbnQoKSBhbmQgdXBkYXRlTU9GQ29tbWVudEZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOworCisJCWlmIChmRGVidWcpIHsKKwkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlVwZGF0aW5nIE1PRk9iamVjdDogIiArIG1vZk9iamVjdCk7IC8vJE5PTi1OTFMtMSQKKwkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlx0ZnJvbTogIiArIG5vZGUpOyAvLyROT04tTkxTLTEkCisJCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJcdG1hcCA6ICIgKyBtYXApOyAvLyROT04tTkxTLTEkCisJCX0KKwkJYm9vbGVhbiBub3RpZmljYXRpb25GbGFnID0gaXNOb3RpZmljYXRpb25FbmFibGVkKCk7CisJCWJvb2xlYW4gaGFzQ2hhbmdlZCA9IGZhbHNlOworCQl0cnkgeworCQkJc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChmYWxzZSk7CisJCQloYXNDaGFuZ2VkID0gcHJpbVVwZGF0ZU1PRkZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOworCQl9IGZpbmFsbHkgeworCQkJc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChub3RpZmljYXRpb25GbGFnKTsKKwkJfQorCisJCWlmIChtYXAuaXNUYXJnZXRMaW5rTWFwKCkgJiYgaGFzQ2hhbmdlZCkKKwkJCXVwZGF0ZU1PRkxpbmtGZWF0dXJlKG1hcCwgbm9kZSwgbW9mT2JqZWN0KTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gbWFwCisJICogQHBhcmFtIG5vZGUKKwkgKiBAcGFyYW0gbW9mT2JqZWN0CisJICovCisJcHVibGljIHZvaWQgdXBkYXRlTU9GQ29tbWVudEZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKKwkJTm9kZSBjb21tZW50Tm9kZSA9IG5vZGU7CisJCS8qIHNjYW4gdXAgdGhlIGRvbSB0byBmaW5kIHRoZSBmaXJzdCBjb21tZW50IG5vZGUgYmVmb3JlIHRoaXMgbm9kZSAqLworCQl3aGlsZSAoKGNvbW1lbnROb2RlID0gY29tbWVudE5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCkpICE9IG51bGwgJiYgY29tbWVudE5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkNPTU1FTlRfTk9ERSkgeworCQkJLyogbm8gY29tbWVudCBhdmFpbGFibGUgKi8KKwkJCWlmIChjb21tZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQorCQkJCXJldHVybjsKKwkJfQorCQlpZiAoY29tbWVudE5vZGUgIT0gbnVsbCkKKwkJCW1hcC5zZXRNT0ZWYWx1ZShtb2ZPYmplY3QsIGNvbW1lbnROb2RlLmdldE5vZGVWYWx1ZSgpKTsKKworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTVJlbmRlcmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyRE9NUmVuZGVyZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2ZiZGM3Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTVJlbmRlcmVyLmphdmEKQEAgLTAsMCArMSwyNjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRE9NTG9hZE9wdGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkRPTVV0aWxpdGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuUmV2aXNpdDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKKworCisKK3B1YmxpYyBjbGFzcyBFTUYyRE9NUmVuZGVyZXIgZXh0ZW5kcyBBYnN0cmFjdFJlbmRlcmVySW1wbCBpbXBsZW1lbnRzIFJlbmRlcmVyIHsKKworCXByb3RlY3RlZCBNYXAgZG9tQWRhcHRlclJlZ2lzdHJ5OworCXByb3RlY3RlZCBib29sZWFuIG5lZWRzVG9DcmVhdGVET00gPSB0cnVlOworCXByb3RlY3RlZCBEb2N1bWVudCBkb2N1bWVudDsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yIGZvciBET01SZW5kZXJlckltcGwuCisJICovCisJcHVibGljIEVNRjJET01SZW5kZXJlcigpIHsKKwkJc3VwZXIoKTsKKwkJaWYgKG1hbmFnZXNET01BZGFwdGVycygpKQorCQkJaW5pdERPTUFkYXB0ZXJSZWdpc3RyeSgpOworCX0KKworCS8qKgorCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNkb0xvYWQoSW5wdXRTdHJlYW0sIE1hcCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBkb0xvYWQoSW5wdXRTdHJlYW0gaW4sIE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAoKGluICE9IG51bGwpIHx8ICF1c2VTdHJlYW1zRm9ySU8oKSkgeworCQkJbG9hZERvY3VtZW50KGluLCBvcHRpb25zKTsKKwkJCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSBjcmVhdGVSb290RE9NQWRhcHRlcigpOworCQkJYWRhcHRlci51cGRhdGVNT0YoKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIGxvYWREb2N1bWVudChJbnB1dFN0cmVhbSBpbiwgTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlET01Mb2FkT3B0aW9ucyBkb21PcHRzID0gbmV3IERPTUxvYWRPcHRpb25zKCk7CisJCQlkb21PcHRzLnNldEFsbG93SmF2YUVuY29kaW5ncyh0cnVlKTsKKwkJCWRvbU9wdHMuc2V0RXhwYW5kRW50aXR5UmVmZXJlcmVuY2VzKHRydWUpOworCQkJZG9tT3B0cy5zZXRWYWxpZGF0ZShpc1ZhbGlkYXRpbmcoKSk7CisJCQlkb2N1bWVudCA9IERPTVV0aWxpdGllcy5sb2FkRG9jdW1lbnQoaW4sIGRvbU9wdHMsIGdldFJlc291cmNlKCkuZ2V0RW50aXR5UmVzb2x2ZXIoKSk7CisJCQluZWVkc1RvQ3JlYXRlRE9NID0gZmFsc2U7CisJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gdF9yZXgpIHsKKwkJCXRocm93IHRfcmV4OworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKKwkJCXRocm93IGlveDsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisJCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihleCk7CisJCX0KKwl9CisKKworCS8qKgorCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNkb1NhdmUoT3V0cHV0U3RyZWFtLCBNYXApCisJICovCisJcHVibGljIHZvaWQgZG9TYXZlKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQljcmVhdGVET01UcmVlSWZOZWNlc3NhcnkoKTsKKwkJc2VyaWFsaXplRG9jdW1lbnQob3V0cHV0U3RyZWFtKTsKKwl9CisKKwkvKioKKwkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBpZiBhZGFwdGVycyBhcmUgbm90IGNhY2hlZCB3aXRoaW4gdGhpcyByZW5kZXJlciwgZS5nLiwgdGhleSBhcmUKKwkgKiBzdG9yZWQgaW4gbm90aWZ5aW5nIE5vZGVzCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gbWFuYWdlc0RPTUFkYXB0ZXJzKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBpbml0RE9NQWRhcHRlclJlZ2lzdHJ5KCkgeworCQlpZiAoZG9tQWRhcHRlclJlZ2lzdHJ5ID09IG51bGwpCisJCQlkb21BZGFwdGVyUmVnaXN0cnkgPSBuZXcgSGFzaE1hcCgpOworCX0KKworCXB1YmxpYyB2b2lkIHJlZ2lzdGVyRE9NQWRhcHRlcihOb2RlIG5vZGUsIEVNRjJET01BZGFwdGVyIGFkYXB0ZXIpIHsKKwkJZG9tQWRhcHRlclJlZ2lzdHJ5LnB1dChub2RlLCBhZGFwdGVyKTsKKwl9CisKKwlwdWJsaWMgRU1GMkRPTUFkYXB0ZXIgZ2V0RXhpc3RpbmdET01BZGFwdGVyKE5vZGUgbm9kZSkgeworCQlyZXR1cm4gKEVNRjJET01BZGFwdGVyKSBkb21BZGFwdGVyUmVnaXN0cnkuZ2V0KG5vZGUpOworCX0KKworCXB1YmxpYyB2b2lkIHJlbW92ZURPTUFkYXB0ZXIoTm9kZSBhTm9kZSwgRU1GMkRPTUFkYXB0ZXIgYW5BZGFwdGVyKSB7CisJCWRvbUFkYXB0ZXJSZWdpc3RyeS5yZW1vdmUoYU5vZGUpOworCX0KKworCS8qKgorCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlciNwcmVwYXJlVG9BZGRDb250ZW50cygpCisJICovCisJcHVibGljIHZvaWQgcHJlcGFyZVRvQWRkQ29udGVudHMoKSB7CisJCS8vIGNyZWF0ZURPTVRyZWVJZk5lY2Vzc2FyeSgpOworCX0KKworCXByb3RlY3RlZCBOb2RlIGNyZWF0ZURPTVRyZWUoKSB7CisJCWNyZWF0ZURvY3VtZW50KCk7CisJCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSBjcmVhdGVSb290RE9NQWRhcHRlcigpOworCQlhZGFwdGVyLnVwZGF0ZURPTSgpOworCQluZWVkc1RvQ3JlYXRlRE9NID0gZmFsc2U7CisJCXJldHVybiBkb2N1bWVudDsKKwl9CisKKworCXByb3RlY3RlZCBFTUYyRE9NQWRhcHRlciBjcmVhdGVSb290RE9NQWRhcHRlcigpIHsKKwkJRU1GMkRPTUFkYXB0ZXIgcm9vdCA9IG5ldyBFTUYyRE9NQWRhcHRlckltcGwoZ2V0UmVzb3VyY2UoKSwgZG9jdW1lbnQsIHRoaXMsIGdldFJlc291cmNlKCkuZ2V0Um9vdFRyYW5zbGF0b3IoKSk7CisJCXJlZ2lzdGVyRE9NQWRhcHRlcihkb2N1bWVudCwgcm9vdCk7CisJCXJldHVybiByb290OworCX0KKworCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRE9NVHJlZUlmTmVjZXNzYXJ5KCkgeworCQlpZiAobmVlZHNUb0NyZWF0ZURPTSkKKwkJCWNyZWF0ZURPTVRyZWUoKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgRG9jdW1lbnQgZ2l2ZW4KKwkgKiAKKwkgKiBAYVJlc291cmNlLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURvY3VtZW50KCkgeworCQlUcmFuc2xhdG9yUmVzb3VyY2UgcmVzID0gZ2V0UmVzb3VyY2UoKTsKKwkJcmVzLnNldERlZmF1bHRzKCk7CisJCXRyeSB7CisJCQlkb2N1bWVudCA9IERPTVV0aWxpdGllcy5jcmVhdGVOZXdEb2N1bWVudChyZXMuZ2V0RG9jdHlwZSgpLCByZXMuZ2V0UHVibGljSWQoKSwgcmVzLmdldFN5c3RlbUlkKCkpOworCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGUpOworCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZSk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGUpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgc2VyaWFsaXplRG9jdW1lbnQoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJLyoKKwkJICogT3V0cHV0Rm9ybWF0IGZvcm1hdCA9IGNyZWF0ZU91dHB1dEZvcm1hdCgpOyBTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPQorCQkgKiBTZXJpYWxpemVyRmFjdG9yeS5nZXRTZXJpYWxpemVyRmFjdG9yeShNZXRob2QuWE1MKS5tYWtlU2VyaWFsaXplcihvdXQsIGZvcm1hdCk7CisJCSAqIHNlcmlhbGl6ZXIuYXNET01TZXJpYWxpemVyKCkuc2VyaWFsaXplKGRvY3VtZW50KTsKKwkJICovCisJCXRyeSB7CisJCQlUcmFuc2Zvcm1lckZhY3RvcnkgZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworCQkJLyoKKwkJCSAqIHRyeSB7IGZhY3Rvcnkuc2V0QXR0cmlidXRlKEpBWFBfU0NIRU1BX0xBTkdVQUdFLCBXM0NfWE1MX1NDSEVNQSk7IH0gY2F0Y2gKKwkJCSAqIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geCkgeyB9CisJCQkgKi8KKwkJCVRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gZmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOworCisJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkVOQ09ESU5HLCBnZXRSZXNvdXJjZSgpLmdldEVuY29kaW5nKCkpOworCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5WRVJTSU9OLCBnZXRSZXNvdXJjZSgpLmdldFhNTFZlcnNpb24oKSk7CisJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk1FVEhPRCwgInhtbCIpOyAvLyROT04tTkxTLTEkCisJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk9NSVRfWE1MX0RFQ0xBUkFUSU9OLCAibm8iKTsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKGdldFJlc291cmNlKCkuZ2V0UHVibGljSWQoKSAhPSBudWxsKQorCQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRE9DVFlQRV9QVUJMSUMsIGdldFJlc291cmNlKCkuZ2V0UHVibGljSWQoKSk7CisJCQlpZiAoZ2V0UmVzb3VyY2UoKS5nZXRTeXN0ZW1JZCgpICE9IG51bGwpCisJCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5ET0NUWVBFX1NZU1RFTSwgZ2V0UmVzb3VyY2UoKS5nZXRTeXN0ZW1JZCgpKTsKKwkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7IC8vJE5PTi1OTFMtMSQgICAgICAgICAgICAKKwkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHR9aW5kZW50LWFtb3VudCIsICI0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJRE9NU291cmNlIHNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkpOworCQkJLyogc291cmNlLnNldFN5c3RlbUlkKGdldFJlc291cmNlKCkuZ2V0U3lzdGVtSWQoKSk7ICovCisJCQl0cmFuc2Zvcm1lci50cmFuc2Zvcm0oc291cmNlLCBuZXcgU3RyZWFtUmVzdWx0KG91dCkpOworCQl9IGNhdGNoIChUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgeworCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOworCQl9IGNhdGNoIChUcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZSkgeworCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOworCQl9IGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKSB7CisJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CisJCX0gZmluYWxseSB7CisJCX0KKwl9CisKKwkvKgorCSAqIHByb3RlY3RlZCBPdXRwdXRGb3JtYXQgY3JlYXRlT3V0cHV0Rm9ybWF0KCkgeyBPdXRwdXRGb3JtYXQgZm9ybWF0ID0gbmV3IE91dHB1dEZvcm1hdCgpOworCSAqIGZvcm1hdC5zZXRJbmRlbnRpbmcodHJ1ZSk7IGZvcm1hdC5zZXRMaW5lU2VwYXJhdG9yKERPTVV0aWxpdGllcy5ORVdMSU5FX1NUUklORyk7CisJICogLy8kTk9OLU5MUy0xJCBmb3JtYXQuc2V0RW5jb2RpbmcoZ2V0UmVzb3VyY2UoKS5nZXRFbmNvZGluZygpKTsKKwkgKiBmb3JtYXQuc2V0VmVyc2lvbihnZXRSZXNvdXJjZSgpLmdldFhNTFZlcnNpb24oKSk7IHJldHVybiBmb3JtYXQ7IH0KKwkgKi8KKworCXB1YmxpYyB2b2lkIHJlcGxhY2VEb2N1bWVudFR5cGUoU3RyaW5nIGRvY1R5cGVOYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgeworCQlSZXZpc2l0LnJldmlzaXQoKTsKKwkJRG9jdW1lbnQgbmV3RG9jID0gbnVsbDsKKwkJLy8gTmVlZCBiZSBhYmxlIHRvIHVwZGF0ZSB0aGUgZG9jdHlwZSBkaXJlY3RseSBvbiB0aGUgZXhpc3RpbmcgZG9jdW1lbnQ7IHJpZ2h0IG5vdyBjYW4ndAorCQkvLyBiZWNhdXNlCisJCS8vIG9mIGxpbWl0YXRpb25zIG9uIHBhcnNlciBuZXV0cmFsIGFwaXMKKworCQl0cnkgeworCQkJbmV3RG9jID0gRE9NVXRpbGl0aWVzLmNyZWF0ZU5ld0RvY3VtZW50KGRvY1R5cGVOYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpOworCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGUpOworCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZSk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGUpOworCQl9CisKKworCQlyZXBsYWNlTm9kZShkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKSwgbmV3RG9jLCBuZXdEb2MpOworCQlyZWFkYXB0KGRvY3VtZW50LCBuZXdEb2MpOworCQlkb2N1bWVudCA9IG5ld0RvYzsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCByZXBsYWNlTm9kZShOb2RlIG9sZENoaWxkLCBOb2RlIG5ld1BhcmVudCwgRG9jdW1lbnQgbmV3RG9jKSB7CisJCU5vZGUgbmV3Q2hpbGQgPSBuZXdEb2MuaW1wb3J0Tm9kZShvbGRDaGlsZCwgZmFsc2UpOworCQluZXdQYXJlbnQuYXBwZW5kQ2hpbGQobmV3Q2hpbGQpOworCQlyZWFkYXB0KG9sZENoaWxkLCBuZXdDaGlsZCk7CisJCU5vZGVMaXN0IGNoaWxkcmVuID0gb2xkQ2hpbGQuZ2V0Q2hpbGROb2RlcygpOworCQlpbnQgbGVuZ3RoID0gY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJCXJlcGxhY2VOb2RlKGNoaWxkcmVuLml0ZW0oaSksIG5ld0NoaWxkLCBuZXdEb2MpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgcHJlVW5sb2FkKCkgeworCQlFTUYyRE9NQWRhcHRlciBhZGFwdGVyID0gKEVNRjJET01BZGFwdGVyKSBFY29yZVV0aWwuZ2V0QWRhcHRlcihyZXNvdXJjZS5lQWRhcHRlcnMoKSwgRU1GMkRPTUFkYXB0ZXIuQURBUFRFUl9DTEFTUyk7CisJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKKwkJCWFkYXB0ZXIucmVtb3ZlQWRhcHRlcnMoYWRhcHRlci5nZXROb2RlKCkpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcmVhZGFwdChOb2RlIG9sZENoaWxkLCBOb2RlIG5ld0NoaWxkKSB7CisJCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSBnZXRFeGlzdGluZ0RPTUFkYXB0ZXIob2xkQ2hpbGQpOworCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7CisJCQlyZWdpc3RlckRPTUFkYXB0ZXIobmV3Q2hpbGQsIGFkYXB0ZXIpOworCQkJLy8gU29tZSBub2RlcyBhcmUgbWFuYWdlZCBieSB0aGUgcGFyZW50IGFuZCB0aHVzIHRoZQorCQkJLy8gbm9kZSBzaG91bGQgbm90IGJlIHNldCBvbiB0aGUgcGFyZW50IGFkYXB0ZXIKKwkJCWlmIChhZGFwdGVyLmdldE5vZGUoKSA9PSBvbGRDaGlsZCkKKwkJCQlhZGFwdGVyLnNldE5vZGUobmV3Q2hpbGQpOworCQl9CisJfQorCisJcHVibGljIGludCBnZXRWZXJzaW9uSUQoKSB7CisJCXJldHVybiBnZXRSZXNvdXJjZSgpLmdldFZlcnNpb25JRCgpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTVJlbmRlcmVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTVJlbmRlcmVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZTU2MDMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyRE9NUmVuZGVyZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQorICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKKworCitwdWJsaWMgY2xhc3MgRU1GMkRPTVJlbmRlcmVyRmFjdG9yeSBleHRlbmRzIFJlbmRlcmVyRmFjdG9yeSB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEVNRjJET01SZW5kZXJlckZhY3RvcnkgSU5TVEFOQ0UgPSBuZXcgRU1GMkRPTVJlbmRlcmVyRmFjdG9yeSgpOworCisJcHVibGljIEVNRjJET01SZW5kZXJlckZhY3RvcnkoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyRmFjdG9yeSNjcmVhdGVSZW5kZXJlcigpCisJICovCisJcHVibGljIFJlbmRlcmVyIGNyZWF0ZVJlbmRlcmVyKCkgeworCQlFTUYyRE9NUmVuZGVyZXIgcmVuZGVyZXIgPSBuZXcgRU1GMkRPTVJlbmRlcmVyKCk7CisJCXJlbmRlcmVyLnNldFZhbGlkYXRpbmcoaXNWYWxpZGF0aW5nKCkpOworCQlyZXR1cm4gcmVuZGVyZXI7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTVJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyRE9NUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjU3YTA2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMkRPTVJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQ3JlYXRlZCBvbiBEZWMgMSwgMjAwMworICoKKyAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KKyAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cworICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOworCisKKy8qKgorICogQGF1dGhvciBzY2hhY2hlcgorICogCisgKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KKyAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cworICovCitwdWJsaWMgY2xhc3MgRU1GMkRPTVJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyIGltcGxlbWVudHMgUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIgeworCisJcHVibGljIHN0YXRpYyBmaW5hbCBFTUYyRE9NUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIgSU5TVEFOQ0UgPSBuZXcgRU1GMkRPTVJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyKCk7CisKKwkvKioKKwkgKiAgCisJICovCisJcHJvdGVjdGVkIEVNRjJET01SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlcigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXJGYWN0b3J5RGVmYXVsdEhhbmRsZXIjZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpCisJICovCisJcHVibGljIFJlbmRlcmVyRmFjdG9yeSBnZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkgeworCQlyZXR1cm4gRU1GMkRPTVJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRTsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyU0FYRG9jdW1lbnRIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyU0FYRG9jdW1lbnRIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI1YmI2MwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJTQVhEb2N1bWVudEhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDIxMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7CisKKy8qKgorICogVGhlIEVNRjJTQVhEb2N1bWVudEhhbmRsZXIgaXMgdXRpbGl6ZWQgYnkgdGhlIFNBWCBwYXJzZXIgdG8gYW5ub3VuY2UgWE1MIEV2ZW50cywgc3VjaCBhcworICogYmVnaW5uaW5nIGFuZCBlbmQgb2YgWE1MIGVsZW1lbnRzIGFuZCB0aGUgY29udGVudHMgb2YgdGhvc2UgZWxlbWVudHMuCisgKiAKKyAqIEBhdXRob3IgbWRlbGRlcgorICovCitwdWJsaWMgY2xhc3MgRU1GMlNBWERvY3VtZW50SGFuZGxlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIHsKKworCXByaXZhdGUgVHJhbnNsYXRvclJlc291cmNlIHJlc291cmNlID0gbnVsbDsKKwlwcml2YXRlIGZpbmFsIENhY2hlRXZlbnRTdGFjayBldmVudFN0YWNrID0gbmV3IENhY2hlRXZlbnRTdGFjaygpOworCXByaXZhdGUgQ2FjaGVFdmVudFBvb2wgYXZhaWxhYmxlRXZlbnRQb29sID0gbmV3IENhY2hlRXZlbnRQb29sKCk7CisKKwkvKioKKwkgKiBDcmVhdGUgYW4gRU1GMlNBWERvY3VtZW50SGFuZGxlciB0byBwb3B1bGF0ZSB0aGUgZ2l2ZW4gcmVzb3VyY2UuCisJICogIAorCSAqLworCXB1YmxpYyBFTUYyU0FYRG9jdW1lbnRIYW5kbGVyKFRyYW5zbGF0b3JSZXNvdXJjZSByZXNvdXJjZSkgeworCQl0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyI3Jlc29sdmVFbnRpdHkoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisJCUlucHV0U291cmNlIHJlc3VsdCA9IG51bGw7CisJCXRoaXMucmVzb3VyY2Uuc2V0RG9jdHlwZVZhbHVlcyhwdWJsaWNJZCwgc3lzdGVtSWQpOworCisJCXRyeSB7CisJCQlFbnRpdHlSZXNvbHZlciBlbnRpdHlSZXNvbHZlciA9IHRoaXMucmVzb3VyY2UuZ2V0RW50aXR5UmVzb2x2ZXIoKTsKKworCQkJaWYgKGVudGl0eVJlc29sdmVyICE9IG51bGwpCisJCQkJcmVzdWx0ID0gZW50aXR5UmVzb2x2ZXIucmVzb2x2ZUVudGl0eShwdWJsaWNJZCwgc3lzdGVtSWQpOworCQkJZWxzZQorCQkJCXJlc3VsdCA9IHN1cGVyLnJlc29sdmVFbnRpdHkocHVibGljSWQsIHN5c3RlbUlkKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisJCQl0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKGlvZSk7CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjc3RhcnREb2N1bWVudCgpCisJICovCisJcHVibGljIHZvaWQgc3RhcnREb2N1bWVudCgpIHRocm93cyBTQVhFeGNlcHRpb24geworCQkvKgorCQkgKiBUaGUgZW5kRG9jdW1lbnQoKSBtZXRob2Qgc2hvdWxkIGhhdmUgZnJvemVuIHRoZSBwb29sLCBvciBpdCBtYXkgbm90IGJlIHdhcm1lZCB5ZXQuIEluCisJCSAqIGVpdGhlciBjYXNlLCB0aGlzIG1ldGhvZCBjYWxsIHdpbGwgZG8gYXMgbGl0dGxlIHdvcmsgYXMgbmVjZXNzYXJ5CisJCSAqLworCQlhdmFpbGFibGVFdmVudFBvb2wud2FybVBvb2woKTsKKworCQkvKiBUaGlzIGxpbmUgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnksIGJ1dCBpcyBsZWZ0IGZvciBzYWZ0eSAqLworCQlldmVudFN0YWNrLmNsZWFyKCk7CisJCXRoaXMuY3JlYXRlUm9vdCh0aGlzLnJlc291cmNlKTsKKworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjc3RhcnRFbGVtZW50KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsCisJICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzKQorCSAqLworCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisJCWFkZFRvU3RhY2socU5hbWUsIGF0dHJpYnV0ZXMpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjY2hhcmFjdGVycyhjaGFyW10sIGludCwgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGRhdGEsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisKKwkJQ2FjaGVFdmVudE5vZGUgY3VycmVudFJlY29yZCA9IGdldEN1cnJlbnRSZWNvcmQoKTsKKwkJaWYgKGN1cnJlbnRSZWNvcmQgIT0gbnVsbCkgeworCQkJY3VycmVudFJlY29yZC5hcHBlbmRUb0J1ZmZlcihkYXRhLCBzdGFydCwgbGVuZ3RoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjZW5kRWxlbWVudChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLAorCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisKKwkJQ2FjaGVFdmVudE5vZGUgY3VycmVudFJlY29yZCA9IG51bGw7CisKKwkJLyoKKwkJICogVGhpcyBzaG91bGQgb25seSBoYXBwZW4gaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIERPTVBhdGggd2FzIGlnbm9yZWQgc28gdGhlIHN0YWNrIGRvZXMgbm90CisJCSAqIHF1aXRlIG1hdGNoIHdpdGggdGhlIFhNTCBkYXRhIHN0cnVjdHVyZS4gSW4gdGhpcyBjYXNlIHdlIGRvIG5vdGhpbmcKKwkJICovCisJCWlmIChxTmFtZS5lcXVhbHModGhpcy5nZXRDdXJyZW50UmVjb3JkKCkuZ2V0Tm9kZU5hbWUoKSkpIHsKKwkJCWN1cnJlbnRSZWNvcmQgPSB0aGlzLnJlbW92ZUN1cnJlbnRSZWNvcmQoKTsKKwkJCWlmIChjdXJyZW50UmVjb3JkICE9IG51bGwpIHsKKwkJCQljdXJyZW50UmVjb3JkLmNvbW1pdCgpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNlbmREb2N1bWVudCgpCisJICovCisJcHVibGljIHZvaWQgZW5kRG9jdW1lbnQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKwkJQ2FjaGVFdmVudE5vZGUgbGFzdFJlY29yZCA9IHRoaXMucmVtb3ZlQ3VycmVudFJlY29yZCgpOworCQlsYXN0UmVjb3JkLmNvbW1pdCgpOworCQlhdmFpbGFibGVFdmVudFBvb2wuZnJlZXplUG9vbCgpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI2Vycm9yKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQorCSAqLworCXB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4KSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKwkJdGhyb3cgZXg7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjZmF0YWxFcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKKwkgKi8KKwlwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4KSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKwkJdGhyb3cgZXg7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjd2FybmluZyhvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKKwkgKi8KKwlwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4KSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKwkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ1dhcm5pbmcoZXgpOworCX0KKworCS8qKgorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgVHJhbnNsYXRvclJlc291cmNlIGdldFJlc291cmNlKCkgeworCQlyZXR1cm4gcmVzb3VyY2U7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlUm9vdChUcmFuc2xhdG9yUmVzb3VyY2UgcmVzb3VyY2VBcmcpIHsKKwkJdGhpcy5ldmVudFN0YWNrLnB1c2goYXZhaWxhYmxlRXZlbnRQb29sLmNyZWF0ZUNhY2hlRXZlbnROb2RlKHJlc291cmNlQXJnKSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgYWRkVG9TdGFjayhTdHJpbmcgbm9kZU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgeworCQlDYWNoZUV2ZW50Tm9kZSBwYXJlbnQgPSB0aGlzLmdldEN1cnJlbnRSZWNvcmQoKTsKKwkJaWYgKCFwYXJlbnQuaXNDaGlsZElnbm9yYWJsZShub2RlTmFtZSkpIHsKKwkJCXRoaXMuZXZlbnRTdGFjay5wdXNoKGF2YWlsYWJsZUV2ZW50UG9vbC5jcmVhdGVDYWNoZUV2ZW50Tm9kZShwYXJlbnQsIG5vZGVOYW1lLCBhdHRyaWJ1dGVzKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgQ0VOTyB3aXRob3V0IHJlbW92aW5nIGl0IGZyb20gdGhlIGV2ZW50IHN0YWNrLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgQ0VOTyB3aXRob3V0IHJlbW92aW5nIGl0CisJICovCisJcHJvdGVjdGVkIENhY2hlRXZlbnROb2RlIGdldEN1cnJlbnRSZWNvcmQoKSB7CisJCUNhY2hlRXZlbnROb2RlIHJlc3VsdCA9IG51bGw7CisJCWlmICghdGhpcy5ldmVudFN0YWNrLmlzRW1wdHkoKSkgeworCQkJcmVzdWx0ID0gdGhpcy5ldmVudFN0YWNrLnBlZWsoKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgY3VycmVudCBDRU5PIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgZXZlbnQgc3RhY2suCisJICogCisJICogQHJldHVybiB0aGUgY3VycmVudCBDRU5PIGFuZCByZW1vdmUgaXQKKwkgKi8KKwlwcm90ZWN0ZWQgQ2FjaGVFdmVudE5vZGUgcmVtb3ZlQ3VycmVudFJlY29yZCgpIHsKKwkJQ2FjaGVFdmVudE5vZGUgcmVzdWx0ID0gbnVsbDsKKwkJaWYgKCF0aGlzLmV2ZW50U3RhY2suaXNFbXB0eSgpKSB7CisJCQlyZXN1bHQgPSB0aGlzLmV2ZW50U3RhY2sucG9wKCk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvLwlwcml2YXRlIGZpbmFsIHZvaWQgcHJpbnRTdGFjaygpIHsKKwkvLwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJQcmludGluZyBzdGFjayAuLi4iKTsKKwkvLwkJLy8gZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmV2ZW50U3RhY2suc2l6ZSgpOyBpKyspIHsKKwkvLwkJLy8gZGVidWcoInN0YWNrWyIgKyBpICsgIl06ICIgKyBldmVudFN0YWNrLmdldChpKSk7CisJLy8JCS8vIH0KKwkvLwkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIuLi4gUHJpbnRlZCBzdGFjayIpOworCS8vCX0KKwkvLworCS8vCXByaXZhdGUgZmluYWwgc3RhdGljIHZvaWQgZGVidWcoT2JqZWN0IG9iaikgeworCS8vCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4ob2JqKTsKKwkvLwl9CisJLy8KKwkvLwlwcml2YXRlIGZpbmFsIHN0YXRpYyB2b2lkIHdhcm4oT2JqZWN0IG9iaikgeworCS8vCQkvL1N5c3RlbS5lcnIucHJpbnRsbihvYmopOworCS8vCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMlNBWFJlbmRlcmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyU0FYUmVuZGVyZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmY3MjFmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMlNBWFJlbmRlcmVyLmphdmEKQEAgLTAsMCArMSwxNzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhUcmFuc2Zvcm1lckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguVHJhbnNmb3JtZXJIYW5kbGVyOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOworCisvKioKKyAqIEBhdXRob3IgbWRlbGRlcgorICovCitwdWJsaWMgY2xhc3MgRU1GMlNBWFJlbmRlcmVyIGV4dGVuZHMgQWJzdHJhY3RSZW5kZXJlckltcGwgeworCisJLyoqCisJICogIAorCSAqLworCXB1YmxpYyBFTUYyU0FYUmVuZGVyZXIoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI2RvTG9hZChqYXZhLmlvLklucHV0U3RyZWFtLCBqYXZhLnV0aWwuTWFwKQorCSAqLworCXB1YmxpYyB2b2lkIGRvTG9hZChJbnB1dFN0cmVhbSBpbiwgTWFwIG9wdGlvbnMpIHsKKwkJdHJ5IHsKKwkJCVNBWFBhcnNlckZhY3RvcnkgZmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKwkJCWZhY3Rvcnkuc2V0VmFsaWRhdGluZyhpc1ZhbGlkYXRpbmcoKSk7CisJCQlmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworCQkJLyoKKwkJCSAqIENhdXNlcyBlcnJvcnMgaW4gSUJNIEpESyB0cnkgeyBmYWN0b3J5LnNldEF0dHJpYnV0ZShKQVhQX1NDSEVNQV9MQU5HVUFHRSwKKwkJCSAqIFczQ19YTUxfU0NIRU1BKTsgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHgpIHsgfQorCQkJICovCisJCQlTQVhQYXJzZXIgcGFyc2VyID0gZmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKKwkJCVhNTFJlYWRlciByZWFkZXIgPSBwYXJzZXIuZ2V0WE1MUmVhZGVyKCk7CisJCQlFTUYyU0FYRG9jdW1lbnRIYW5kbGVyIGhhbmRsZXIgPSBuZXcgRU1GMlNBWERvY3VtZW50SGFuZGxlcih0aGlzLmdldFJlc291cmNlKCkpOworCQkJdHJ5IHsKKwkJCQlyZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL3ZhbGlkYXRpb24iLCBpc1ZhbGlkYXRpbmcoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0gY2F0Y2ggKFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gc25yZSkgeworCQkJfQorCQkJdHJ5IHsKKwkJCQlyZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZS1wcmVmaXhlcyIsIHRydWUpOyAvLyROT04tTkxTLTEkCisJCQl9IGNhdGNoIChTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIHNucmUpIHsKKwkJCX0KKwkJCXRyeSB7CisJCQkJcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYSIsIGlzVmFsaWRhdGluZygpKTsgLy8kTk9OLU5MUy0xJAorCQkJfSBjYXRjaCAoU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiBlKSB7CisJCQkJcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCisJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZygiV2FybmluZzogUGFyc2VyIGRvZXMgbm90IHN1cHBvcnQgXCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvdmFsaWRhdGlvbi9zY2hlbWFcIi4gVmFsaWRhdGlvbiB3aWxsIGJlIGRpc2FibGVkLiIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQl0cnkgeworCQkJCXJlYWRlci5zZXRGZWF0dXJlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvYWxsb3ctamF2YS1lbmNvZGluZ3MiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAorCQkJfSBjYXRjaCAoU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiBlKSB7CisJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZygiV2FybmluZzogUGFyc2VyIGRvZXMgbm90IHN1cHBvcnQgXCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvYWxsb3ctamF2YS1lbmNvZGluZ3NcIi4iKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJLyoKKwkJCSAqIHRyeSB7IHJlYWRlci5zZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvbGV4aWNhbC1oYW5kbGVyIiwgaGFuZGxlcik7IH0KKwkJCSAqIGNhdGNoIChTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIGUpIHsgfQorCQkJICovCisJCQlyZWFkZXIuc2V0Q29udGVudEhhbmRsZXIoaGFuZGxlcik7CisJCQlyZWFkZXIuc2V0RXJyb3JIYW5kbGVyKGhhbmRsZXIpOworCQkJLy9yZWFkZXIuc2V0RFRESGFuZGxlcihoYW5kbGVyKTsKKwkJCXJlYWRlci5zZXRFbnRpdHlSZXNvbHZlcihoYW5kbGVyKTsKKwkJCUlucHV0U291cmNlIHRlc3Rzb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UoaW4pOworCQkJcmVhZGVyLnBhcnNlKHRlc3Rzb3VyY2UpOworCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHRfcmV4KSB7CisJCQl0aHJvdyB0X3JleDsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisJCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihleCk7CisJCX0KKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIjZG9TYXZlKGphdmEuaW8uT3V0cHV0U3RyZWFtLCBqYXZhLnV0aWwuTWFwKQorCSAqLworCXB1YmxpYyB2b2lkIGRvU2F2ZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQkvKgorCQkgKiB0cnkgeyBTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPQorCQkgKiBTZXJpYWxpemVyRmFjdG9yeS5nZXRTZXJpYWxpemVyRmFjdG9yeShNZXRob2QuWE1MKS5tYWtlU2VyaWFsaXplcihvdXRwdXRTdHJlYW0sCisJCSAqIGNyZWF0ZU91dHB1dEZvcm1hdCgpKTsgc2VyaWFsaXplci5zZXRPdXRwdXRCeXRlU3RyZWFtKG91dHB1dFN0cmVhbSk7IENvbnRlbnRIYW5kbGVyCisJCSAqIGhhbmRsZXIgPSBzZXJpYWxpemVyLmFzQ29udGVudEhhbmRsZXIoKTsKKwkJICovCisKKwkJVHJhbnNmb3JtZXJIYW5kbGVyIGhhbmRsZXIgPSBudWxsOworCQl0cnkgeworCQkJdHJ5IHsKKwkJCQlTQVhUcmFuc2Zvcm1lckZhY3RvcnkgZmFjdG9yeSA9IChTQVhUcmFuc2Zvcm1lckZhY3RvcnkpIFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworCQkJCWhhbmRsZXIgPSBmYWN0b3J5Lm5ld1RyYW5zZm9ybWVySGFuZGxlcigpOworCisJCQkJaGFuZGxlci5zZXRSZXN1bHQobmV3IFN0cmVhbVJlc3VsdChvdXRwdXRTdHJlYW0pKTsKKwkJCQlUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IGhhbmRsZXIuZ2V0VHJhbnNmb3JtZXIoKTsKKwkJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOyAvLyROT04tTkxTLTEkCisJCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5FTkNPRElORywgZ2V0UmVzb3VyY2UoKS5nZXRFbmNvZGluZygpKTsKKwkJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLlZFUlNJT04sIGdldFJlc291cmNlKCkuZ2V0WE1MVmVyc2lvbigpKTsKKwkJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk1FVEhPRCwgInhtbCIpOyAvLyROT04tTkxTLTEkCisJCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5PTUlUX1hNTF9ERUNMQVJBVElPTiwgIm5vIik7IC8vJE5PTi1OTFMtMSQgICAgICAgICAgICAgICAgCisJCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoIntodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdH1pbmRlbnQtYW1vdW50IiwgIjQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJCQlpZiAoZ2V0UmVzb3VyY2UoKS5nZXRQdWJsaWNJZCgpICE9IG51bGwpCisJCQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRE9DVFlQRV9QVUJMSUMsIGdldFJlc291cmNlKCkuZ2V0UHVibGljSWQoKSk7CisJCQkJaWYgKGdldFJlc291cmNlKCkuZ2V0U3lzdGVtSWQoKSAhPSBudWxsKQorCQkJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkRPQ1RZUEVfU1lTVEVNLCBnZXRSZXNvdXJjZSgpLmdldFN5c3RlbUlkKCkpOworCisJCQl9IGNhdGNoIChUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgeworCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCX0gY2F0Y2ggKFRyYW5zZm9ybWVyRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBlKSB7CisJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOworCQkJfQorCQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkgeworCQkJCUxvZ2dlci5nZXRMb2dnZXIoIlNBWCBXcml0ZXIgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCisJCQkJcmV0dXJuOworCQkJfQorCQkJRU1GMlNBWFdyaXRlciB3cml0ZXIgPSBuZXcgRU1GMlNBWFdyaXRlcigpOworCQkJd3JpdGVyLnNlcmlhbGl6ZSh0aGlzLnJlc291cmNlLCBoYW5kbGVyKTsKKwkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIHNheGUpIHsKKwkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKHNheGUpOworCQl9CisJfQorCisJLyoKKwkgKiBwcm90ZWN0ZWQgT3V0cHV0Rm9ybWF0IGNyZWF0ZU91dHB1dEZvcm1hdCgpIHsgT3V0cHV0Rm9ybWF0IGZvcm1hdCA9IG5ldyBPdXRwdXRGb3JtYXQoKTsKKwkgKiBmb3JtYXQuc2V0SW5kZW50aW5nKHRydWUpOyBmb3JtYXQuc2V0TGluZVNlcGFyYXRvcihET01VdGlsaXRpZXMuTkVXTElORV9TVFJJTkcpOworCSAqIC8vJE5PTi1OTFMtMSQgZm9ybWF0LnNldEVuY29kaW5nKGdldFJlc291cmNlKCkuZ2V0RW5jb2RpbmcoKSk7CisJICogZm9ybWF0LnNldFZlcnNpb24oZ2V0UmVzb3VyY2UoKS5nZXRYTUxWZXJzaW9uKCkpOyBpZiAodGhpcy5yZXNvdXJjZSAhPSBudWxsKQorCSAqIGZvcm1hdC5zZXREb2N0eXBlKHRoaXMucmVzb3VyY2UuZ2V0UHVibGljSWQoKSwgdGhpcy5yZXNvdXJjZS5nZXRTeXN0ZW1JZCgpKTsgcmV0dXJuIGZvcm1hdDsgfQorCSAqLworCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyI3ByZXBhcmVUb0FkZENvbnRlbnRzKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBwcmVwYXJlVG9BZGRDb250ZW50cygpIHsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIjZ2V0VmVyc2lvbklEKCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldFZlcnNpb25JRCgpIHsKKwkJcmV0dXJuIGdldFJlc291cmNlKCkuZ2V0VmVyc2lvbklEKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMlNBWFJlbmRlcmVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMlNBWFJlbmRlcmVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZmQ1ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9FTUYyU0FYUmVuZGVyZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQ3JlYXRlZCBvbiBBdWcgMTksIDIwMDMKKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7CisKKworLyoqCisgKiBVc2VkIHRvIGNyZWF0ZSBpbnN0YW5jZXMgb2YgdGhlIEVNRjJTQVhSZW5kZXJlcgorICogCisgKiBAYXV0aG9yIG1kZWxkZXIKKyAqLworcHVibGljIGNsYXNzIEVNRjJTQVhSZW5kZXJlckZhY3RvcnkgZXh0ZW5kcyBSZW5kZXJlckZhY3RvcnkgeworCisJcHVibGljIHN0YXRpYyBmaW5hbCBFTUYyU0FYUmVuZGVyZXJGYWN0b3J5IElOU1RBTkNFID0gbmV3IEVNRjJTQVhSZW5kZXJlckZhY3RvcnkoKTsKKworCXByb3RlY3RlZCBFTUYyU0FYUmVuZGVyZXJGYWN0b3J5KCkgeworCQlzdXBlcigpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlckZhY3RvcnkjY3JlYXRlUmVuZGVyZXIoKQorCSAqLworCXB1YmxpYyBSZW5kZXJlciBjcmVhdGVSZW5kZXJlcigpIHsKKwkJRU1GMlNBWFJlbmRlcmVyIHJlbmRlcmVyID0gbmV3IEVNRjJTQVhSZW5kZXJlcigpOworCQlyZW5kZXJlci5zZXRWYWxpZGF0aW5nKGlzVmFsaWRhdGluZygpKTsKKwkJcmV0dXJuIHJlbmRlcmVyOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJTQVhXcml0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0VNRjJTQVhXcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTU1NzM0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRU1GMlNBWFdyaXRlci5qYXZhCkBAIC0wLDAgKzEsMzg3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7CisKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOworaW1wb3J0IG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkF0dHJpYnV0ZXNJbXBsOworCisvKioKKyAqIFRoZSBFTUYyU0FYV3JpdGVyIGhhbmRsZXMgdGhlIHNlcmlhbGl6YXRpb24gb2YgRU1GIFJlc291cmNlcyB1c2luZyBTQVggZXZlbnRzLiBTQVggZXZlbnRzIGFyZQorICogdHJpZ2dlcmVkIHRvIHRoZSBjb250ZW50IGhhbmRsZXIgYXMgdGhlIHRyZWUgaXMgYmVpbmcgcGFyc2VkLiBUaGVzZSBldmVudHMgY2FuIHRoZW4gYmUgd3JpdHRlbgorICogaW50byBhbnkgc3RyZWFtIHdyYXBwZWQgYnkgdGhlIENvbnRlbnRIYW5kbGVyLgorICogCisgKiBAYXV0aG9yIG1kZWxkZXIKKyAqLworcHVibGljIGNsYXNzIEVNRjJTQVhXcml0ZXIgeworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFID0gIiI7Ly8iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qIFVzZWQgaW4gdGhvc2UgY2FzZXMgd2hlcmUgbm8gQXR0cmlidXRlcyBhcmUgbmVjZXNzYXJ5ICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXR0cmlidXRlcyBFTVBUWV9BVFRSSUJVVEVTID0gbmV3IEF0dHJpYnV0ZXNJbXBsKCk7CisKKwkvKioKKwkgKiBTZXJpYWxpemUgYW4gRU1GIHJlc291cmNlIGludG8gYW4gWE1MIFN0cmVhbSB1c2luZyB0aGUgZ2l2ZW4gQ29udGVudEhhbmRsZXIuIE5vdGUgdGhhdCB0aGlzCisJICogbWV0aG9kIGNhbiBhbHNvIGJlIHVzZWQgdG8gY29weSBhIGdpdmVuIEVNRiBSZXNvdXJjZSBpZiB0aGUgRU1GMlNBWERvY3VtZW50SGFuZGxlciBpcyB1c2VkIGFzCisJICogdGhlIGdpdmVuIENvbnRlbnRIYW5kbGVyLgorCSAqIAorCSAqIEBwYXJhbSByZXNvdXJjZQorCSAqIEBwYXJhbSBoYW5kbGVyCisJICovCisJcHVibGljIHZvaWQgc2VyaWFsaXplKFRyYW5zbGF0b3JSZXNvdXJjZSByZXNvdXJjZSwgQ29udGVudEhhbmRsZXIgaGFuZGxlcikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisKKwkJVHJhbnNsYXRvciByb290VHJhbnNsYXRvciA9IHJlc291cmNlLmdldFJvb3RUcmFuc2xhdG9yKCk7CisJCUVMaXN0IGNvbnRlbnRzID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKTsKKworCQlpZiAoY29udGVudHMuc2l6ZSgpICE9IDEpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBjb250ZW50cyBvZiBhIHJlc291cmNlIG1heSBvbmx5IGNvbnRhaW4gb25lIEVNRiBNb2RlbCBPYmplY3QuIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQloYW5kbGVyLnN0YXJ0RG9jdW1lbnQoKTsKKwkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGNvbnRlbnRzLmdldCgwKTsKKwkJc2VyaWFsaXplKGhhbmRsZXIsIGVsZW1lbnQsIHJvb3RUcmFuc2xhdG9yLCBuZXcgV3JpdGVySGludHMocmVzb3VyY2UpKTsKKwkJaGFuZGxlci5lbmREb2N1bWVudCgpOworCisJfQorCisJcHJpdmF0ZSB2b2lkIHNlcmlhbGl6ZShDb250ZW50SGFuZGxlciBoYW5kbGVyLCBFT2JqZWN0IHRhcmdldCwgVHJhbnNsYXRvciB0cmFuc2xhdG9yLCBXcml0ZXJIaW50cyBoaW50cykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisKKwkJTGlzdCBtb2ZDaGlsZHJlbiA9IG51bGw7CisJCU9iamVjdCByYXdWYWx1ZSA9IG51bGw7CisJCUVPYmplY3QgbmV3VGFyZ2V0ID0gbnVsbDsKKwkJVHJhbnNsYXRvciBjdXJyZW50Q2hpbGRUcmFuc2xhdG9yID0gbnVsbDsKKwkJVHJhbnNsYXRvciBuZXh0VHJhbnNsYXRvciA9IG51bGw7CisJCWNoYXJbXSBjaGFyYWN0ZXJEYXRhID0gbnVsbDsKKwkJU3RyaW5nIGNvbnZlcnRlZFZhbHVlID0gbnVsbDsKKwkJQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gbnVsbDsKKwkJU3RyaW5nIGNoaWxkRG9tTmFtZSA9IG51bGw7CisJCWZpbmFsIGludCB2ZXJzaW9uID0gaGludHMuZ2V0VmVyc2lvbigpOworCisJCS8qCisJCSAqIFByb2Nlc3NpbmcgaGludHMgYXJlIHVzZWQgdG8gcmVtZW1iZXIgd2hlcmUgYXJlIGluIHRoZSBpdGVyYXRpb24gb2YgdGhlIHRyYW5zbGF0b3IncworCQkgKiBjaGlsZHJlbi4gc2VlIHRoZSBUcmFuc2xhdG9yRmlsdGVyIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0aGlzIGFycmF5IGlzIHVzZWQuCisJCSAqLworCQlpbnRbXSBwcm9jZXNzaW5nSGludHMgPSBUcmFuc2xhdG9yRmlsdGVyLmNyZWF0ZVByb2Nlc3NpbmdIaW50cygpOworCisJCVN0cmluZyB0YXJnZXREb21OYW1lID0gdHJhbnNsYXRvci5nZXRET01OYW1lKHRhcmdldCk7CisKKwkJYXR0cmlidXRlcyA9IGdldEF0dHJpYnV0ZXModHJhbnNsYXRvciwgdGFyZ2V0LCBoaW50cyk7CisKKwkJaGFuZGxlci5zdGFydEVsZW1lbnQoTkFNRVNQQUNFLCB0YXJnZXREb21OYW1lLCB0YXJnZXREb21OYW1lLCBhdHRyaWJ1dGVzKTsKKworCQljdXJyZW50Q2hpbGRUcmFuc2xhdG9yID0gVHJhbnNsYXRvckZpbHRlci5nZXROZXh0T2JqZWN0VHJhbnNsYXRvcih0cmFuc2xhdG9yLCBwcm9jZXNzaW5nSGludHNbVHJhbnNsYXRvckZpbHRlci5ORVhUX1NUQVJUX0hJTlRfSU5EWF0sIHByb2Nlc3NpbmdIaW50cywgdGFyZ2V0LCB2ZXJzaW9uKTsKKwkJd2hpbGUgKGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IgIT0gbnVsbCkgeworCQkJLyogRm9yIGVhY2ggQ2hpbGQgVHJhbnNsYXRvciBvZiB0aGUgVHJhbnNsYXRvciBwYXJhbWV0ZXIgcGFzc2VkIGludG8gdGhlIG1ldGhvZCAqLworCisJCQkvKiBEb2VzIHRoZSBUcmFuc2xhdG9yIGhhdmUgYW55IE1PRiBDaGlsZHJlbj8gKi8KKwkJCW1vZkNoaWxkcmVuID0gY3VycmVudENoaWxkVHJhbnNsYXRvci5nZXRNT0ZDaGlsZHJlbih0YXJnZXQpOworCQkJb3BlbkRvbVBhdGhJZk5lY2Vzc2FyeShoYW5kbGVyLCBoaW50cywgY3VycmVudENoaWxkVHJhbnNsYXRvciwgdGFyZ2V0LCBtb2ZDaGlsZHJlbik7CisKKwkJCWlmIChjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLmlzTWFuYWdlZEJ5UGFyZW50KCkpIHsKKwkJCQkvKgorCQkJCSAqIFRyYW5zbGF0b3JzIHdoaWNoIGFyZSBtYW5hZ2VkIGJ5IHRoZWlyIHBhcmVudHMgcmVxdWlyZSBsZXNzIHByb2Nlc3NpbmcgLS0ganVzdAorCQkJCSAqIGNvbnZlcnQgdGhlaXIgdmFsdWUgdG8gYSBzdHJpbmcgYW5kIHdyaXRlIGl0IG91dCBhcyB0aGUgY29udGVudCBvZiBhbiBYTUwgZWxlbWVudAorCQkJCSAqLworCQkJCWNoaWxkRG9tTmFtZSA9IGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IuZ2V0RE9NTmFtZSh0YXJnZXQpOworCQkJCWlmICghY3VycmVudENoaWxkVHJhbnNsYXRvci5pc0VtcHR5VGFnKCkpIHsKKwkJCQkJLyogVGhlIFRyYW5zbGF0b3IgaXMgbm90IGFuIEVtcHR5IHRhZy4gSXRzIHRleHQgY29udGVudCBpcyBzaWduaWZpY2FudCAqLworCisJCQkJCWlmIChtb2ZDaGlsZHJlbi5zaXplKCkgPiAwKSB7CisJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG1vZkNoaWxkcmVuLnNpemUoKTsgaisrKSB7CisKKwkJCQkJCQkvKiBUZXh0IG9ubHkgdHJhbnNsYXRvcnMgd2lsbCBub3QgaGF2ZSBvcGVuIGFuZCBjbG9zZSBYTUwgZWxlbWVudHMgKi8KKwkJCQkJCQlpZiAoIWN1cnJlbnRDaGlsZFRyYW5zbGF0b3IuaXNET01UZXh0VmFsdWUoKSkKKwkJCQkJCQkJaGFuZGxlci5zdGFydEVsZW1lbnQoTkFNRVNQQUNFLCBjaGlsZERvbU5hbWUsIGNoaWxkRG9tTmFtZSwgRU1QVFlfQVRUUklCVVRFUyk7CisKKwkJCQkJCQlyYXdWYWx1ZSA9IG1vZkNoaWxkcmVuLmdldChqKTsKKwkJCQkJCQkvKiBjb252ZXJ0VmFsdWVUb1N0cmluZyBzaG91bGQgYWx3YXlzIHJldHVybiBhIG5vbi1udWxsIFN0cmluZyAqLworCQkJCQkJCWNvbnZlcnRlZFZhbHVlID0gY3VycmVudENoaWxkVHJhbnNsYXRvci5jb252ZXJ0VmFsdWVUb1N0cmluZyhyYXdWYWx1ZSwgdGFyZ2V0KTsKKwkJCQkJCQljaGFyYWN0ZXJEYXRhID0gWE1MRW5jb2RlckRlY29kZXIuZXNjYXBlKGNvbnZlcnRlZFZhbHVlKS50b0NoYXJBcnJheSgpOworCQkJCQkJCWhhbmRsZXIuY2hhcmFjdGVycyhjaGFyYWN0ZXJEYXRhLCAwLCBjaGFyYWN0ZXJEYXRhLmxlbmd0aCk7CisKKwkJCQkJCQlpZiAoIWN1cnJlbnRDaGlsZFRyYW5zbGF0b3IuaXNET01UZXh0VmFsdWUoKSkKKwkJCQkJCQkJaGFuZGxlci5lbmRFbGVtZW50KE5BTUVTUEFDRSwgY2hpbGREb21OYW1lLCBjaGlsZERvbU5hbWUpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJLyoKKwkJCQkJICogVGhlIFRyYW5zbGF0b3IgaXMgYW4gRW1wdHkgRWxlbWVudCAoaXRzIG1lcmUgcHJlc2VuY2UgaGFzIHNpZ25pZmljYW5jZSkgKGUuZy4KKwkJCQkJICogPGNhc2NhZGUtZGVsZXRlLz4KKwkJCQkJICovCisKKwkJCQkJaWYgKGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IuaXNCb29sZWFuRmVhdHVyZSgpKSB7CisJCQkJCQkvKiBCb29sZWFuIGZlYXR1cmVzIG1heSBvciBtYXkgbm90IGJlIHJlbmRlcmVkICovCisJCQkJCQlyYXdWYWx1ZSA9IG1vZkNoaWxkcmVuLmdldCgwKTsKKwkJCQkJCWlmIChyYXdWYWx1ZSAhPSBudWxsICYmICgoQm9vbGVhbikgcmF3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKSB7CisJCQkJCQkJaGFuZGxlci5zdGFydEVsZW1lbnQoTkFNRVNQQUNFLCBjaGlsZERvbU5hbWUsIGNoaWxkRG9tTmFtZSwgRU1QVFlfQVRUUklCVVRFUyk7CisJCQkJCQkJaGFuZGxlci5lbmRFbGVtZW50KE5BTUVTUEFDRSwgY2hpbGREb21OYW1lLCBjaGlsZERvbU5hbWUpOworCQkJCQkJfQorCisJCQkJCX0gZWxzZSB7CisJCQkJCQkvKiBBbHdheXMgcmVuZGVyIGFueSBvdGhlciBFbXB0eSBlbGVtZW50cyAqLworCQkJCQkJaGFuZGxlci5zdGFydEVsZW1lbnQoTkFNRVNQQUNFLCBjaGlsZERvbU5hbWUsIGNoaWxkRG9tTmFtZSwgRU1QVFlfQVRUUklCVVRFUyk7CisJCQkJCQloYW5kbGVyLmVuZEVsZW1lbnQoTkFNRVNQQUNFLCBjaGlsZERvbU5hbWUsIGNoaWxkRG9tTmFtZSk7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCisJCQkJLyogVGhlIFRyYW5zbGF0b3IgaXMgYSBtb3JlIGNvbXBsZXggZmVhdHVyZSwgaGFuZGxlIGl0cyBwcm9jZXNzaW5nIHJlY3Vyc2l2ZWx5ICovCisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBtb2ZDaGlsZHJlbi5zaXplKCk7IGorKykgeworCQkJCQluZXdUYXJnZXQgPSAoRU9iamVjdCkgbW9mQ2hpbGRyZW4uZ2V0KGopOworCQkJCQlzZXJpYWxpemUoaGFuZGxlciwgbmV3VGFyZ2V0LCBjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLCBoaW50cyk7CisJCQkJfQorCQkJfQorCisJCQkvKiBGZXRjaCB0aGUgbmV4dCBwZWVyIHRyYW5zbGF0b3IgKi8KKwkJCW5leHRUcmFuc2xhdG9yID0gVHJhbnNsYXRvckZpbHRlci5nZXROZXh0T2JqZWN0VHJhbnNsYXRvcih0cmFuc2xhdG9yLCBwcm9jZXNzaW5nSGludHNbVHJhbnNsYXRvckZpbHRlci5ORVhUX1NUQVJUX0hJTlRfSU5EWF0sIHByb2Nlc3NpbmdIaW50cywgdGFyZ2V0LCB2ZXJzaW9uKTsKKworCQkJY2xvc2VEb21QYXRoSWZOZWNlc3NhcnkoaGFuZGxlciwgaGludHMsIGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IsIG5leHRUcmFuc2xhdG9yLCB0YXJnZXQsIG1vZkNoaWxkcmVuKTsKKworCQkJLyoKKwkJCSAqIFdlIG5lZWRlZCB0byBpbnZva2UgY2xvc2VEb21QYXRoSWZOZWNlc3NhcnkoKSB3aXRoIHRoZSBwZWVyLCBub3cgd2UgbW92ZSBvbiB0bworCQkJICogcHJvY2VzcyB0aGF0IHBlZXIKKwkJCSAqLworCQkJY3VycmVudENoaWxkVHJhbnNsYXRvciA9IG5leHRUcmFuc2xhdG9yOworCisJCX0KKwkJaGFuZGxlci5lbmRFbGVtZW50KE5BTUVTUEFDRSwgdGFyZ2V0RG9tTmFtZSwgdGFyZ2V0RG9tTmFtZSk7CisJfQorCisJLyoqCisJICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBhIERPTSBQYXRoIHNob3VsZCBiZSByZW5kZXJlZC4gVGhpcyBtZXRob2QgaXMgcGFydGljdWxhcmx5IHVzZWZ1bAorCSAqIGZvciBkZXRlcm1pbmluZyB3aGV0aGVyIEVtcHR5IFhNTCBlbGVtZW50cyBhcmUgcmVsZXZhbnQgYW5kIHNob3VsZCBiZSB3cml0dGVuIHRvIHRoZSBYTUwKKwkgKiBzdHJlYW0uCisJICogCisJICogQHBhcmFtIHRhcmdldAorCSAqICAgICAgICAgICAgVGhlIEVNRiBUYXJnZXQgb2YgdGhlIFRyYW5zbGF0aW9uCisJICogQHBhcmFtIGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IKKwkgKiAgICAgICAgICAgIFRoZSBjdXJyZW50IFRyYW5zbGF0b3IKKwkgKiBAcGFyYW0gbW9mQ2hpbGRyZW4KKwkgKiAgICAgICAgICAgIFRoZSBtb2ZDaGlsZHJlbiB0aGF0IHdlcmUgZm91bmQgZm9yIHRoZSBUcmFuc2xhdG9yIG9uIHRoZSBUYXJnZXQKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBib29sZWFuIHNob3VsZFJlbmRlckRvbVBhdGgoRU9iamVjdCB0YXJnZXQsIFRyYW5zbGF0b3IgY3VycmVudENoaWxkVHJhbnNsYXRvciwgTGlzdCBtb2ZDaGlsZHJlbikgeworCQlyZXR1cm4gIChjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLnNob3VsZFJlbmRlckVtcHR5RE9NUGF0aCh0YXJnZXQpIHx8IG1vZkNoaWxkcmVuLnNpemUoKSA+IDApOworCX0KKworCS8qKgorCSAqIG9wZW5Eb21QYXRoSWZOZWNlc3Nhcnkgd2lsbCB3cml0ZSB0aGUgY3VycmVudCBET00gUGF0aCB0byB0aGUgc2VyaWFsaXphdGlvbiBzdHJlYW0gaWYgaXQgaGFzCisJICogbm90IGJlZW4gd3JpdHRlbiBieSBhIHByZXZpb3VzIHBlZXIgdHJhbnNsYXRvci4gVGhlIHByb2Nlc3NpbmcgcmVzdWx0cyBpbiB0aGUgY29sbGFwc2Ugb2YKKwkgKiBQZWVyIFRyYW5zbGF0b3JzIHdpdGggbWF0Y2hpbmcgRE9NIFBhdGhzIGludG8gYSBzaW5nbGUgWE1MIHBhcmVudCBlbGVtZW50LgorCSAqIAorCSAqIEBwYXJhbSBoYW5kbGVyCisJICogICAgICAgICAgICBUaGUgQ29udGVudEhhbmRsZXIgd2hpY2ggaXMgd3JpdGluZyB0aGUgWE1MIHJlc3VsdAorCSAqIEBwYXJhbSBoaW50cworCSAqICAgICAgICAgICAgQSBHbG9iYWwgY29udGFpbmVyIGZvciBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byBhIHNpbmdsZSBYTUwgZG9jdW1lbnQKKwkgKiBAcGFyYW0gY3VycmVudENoaWxkVHJhbnNsYXRvcgorCSAqICAgICAgICAgICAgVGhlIGFjdGl2ZSBUcmFuc2xhdG9yIGJlaW5nIHByb2Nlc3NlZAorCSAqIEBwYXJhbSB0YXJnZXQKKwkgKiAgICAgICAgICAgIFRoZSBFTUYgVGFyZ2V0IG9mIHRoZSBUcmFuc2xhdGlvbgorCSAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uCisJICovCisJcHJpdmF0ZSB2b2lkIG9wZW5Eb21QYXRoSWZOZWNlc3NhcnkoQ29udGVudEhhbmRsZXIgaGFuZGxlciwgV3JpdGVySGludHMgaGludHMsIFRyYW5zbGF0b3IgY3VycmVudENoaWxkVHJhbnNsYXRvciwgRU9iamVjdCB0YXJnZXQsIExpc3QgbW9mQ2hpbGRyZW4pIHRocm93cyBTQVhFeGNlcHRpb24geworCisJCS8qIElmIHRoZSB0cmFuc2xhdG9yIGRvZXMgbm90IGhhdmUgYSBET00gUGF0aCwgdGhlbiB3ZSBkbyBub3RoaW5nICovCisJCWlmIChjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLmhhc0RPTVBhdGgoKSAmJiBzaG91bGRSZW5kZXJEb21QYXRoKHRhcmdldCwgY3VycmVudENoaWxkVHJhbnNsYXRvciwgbW9mQ2hpbGRyZW4pKSB7CisKKwkJCVN0cmluZyBjaGlsZERvbVBhdGggPSBjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLmdldERPTVBhdGgoKTsKKworCQkJLyoKKwkJCSAqIElzRG9tUGF0aEFjdGl2ZSgpIHdpbGwgdmVyaWZ5IHdoZXRoZXIgdGhpcyBET00gUGF0aCBoYXMgYWxyZWFkeSBiZWVuIHdyaXR0ZW4gdG8gdGhlCisJCQkgKiBYTUwgc3RyZWFtCisJCQkgKi8KKwkJCWlmICghaGludHMuaXNEb21QYXRoQWN0aXZlKGNoaWxkRG9tUGF0aCkpIHsKKworCQkJCS8qCisJCQkJICogV3JpdGUgYW4gb3BlbiBlbGVtZW50IGZvciB0aGUgRE9NIFBhdGggYW5kICJyZW1lbWJlciIgdGhhdCB3ZSBoYXZlIHdyaXR0ZW4gaXQKKwkJCQkgKi8KKwkJCQloYW5kbGVyLnN0YXJ0RWxlbWVudChOQU1FU1BBQ0UsIGNoaWxkRG9tUGF0aCwgY2hpbGREb21QYXRoLCBFTVBUWV9BVFRSSUJVVEVTKTsKKwkJCQloaW50cy5wdXNoRG9tUGF0aChjaGlsZERvbVBhdGgpOworCQkJfQorCisJCX0KKwl9CisKKwkvKioKKwkgKiBjbG9zZURvbVBhdGhJZk5lY2Vzc2FyeSB3aWxsIGRldGVybWluZSB3aGV0aGVyIHRoZSBuZXh0IHBlZXIgVHJhbnNsYXRvciBzaGFyZXMgdGhlIGFjdGl2ZSBET00KKwkgKiBQYXRoIG9mIHRoZSBjdXJyZW50IFRyYW5zbGF0b3IuIElmIHRoZSBuZXh0IHBlZXIgVHJhbnNsYXRvciBoYXMgdGhlIHNhbWUgRE9NIFBhdGgsIG5vIGFjdGlvbgorCSAqIHdpbGwgYmUgdGFrZW4gKGhlbmNlIGNvbmRlbnNpbmcgdGhlIGVsZW1lbnRzIGludG8gYSBzaW5nbGUgWE1MIHBhcmVudCkuIEhvd2V2ZXIsIGlmIHRoZSBET00KKwkgKiBQYXRoIGRpZmZlcnMgKGluY2x1ZGluZyB0aGUgTmV4dCBQZWVyIFRyYW5zbGF0b3IgaGFzIG5vIERPTSBQYXRoKSB0aGVuIHRoZSBjdXJyZW50IERPTSBQYXRoCisJICogd2lsbCBiZSBjbG9zZWQgKGEgY2xvc2UgWE1MIGVsZW1lbnQgaXMgZ2VuZXJhdGVkLgorCSAqIAorCSAqIEBwYXJhbSBoYW5kbGVyCisJICogICAgICAgICAgICBUaGUgQ29udGVudEhhbmRsZXIgd2hpY2ggaXMgd3JpdGluZyB0aGUgWE1MIHJlc3VsdAorCSAqIEBwYXJhbSBoaW50cworCSAqICAgICAgICAgICAgQSBHbG9iYWwgY29udGFpbmVyIGZvciBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byBhIHNpbmdsZSBYTUwgZG9jdW1lbnQKKwkgKiBAcGFyYW0gY3VycmVudENoaWxkVHJhbnNsYXRvcgorCSAqICAgICAgICAgICAgVGhlIGxhc3QgVHJhbnNsYXRvciB0byBoYXZlIGNvbXBsZXRlZCBwcm9jZXNzaW5nCisJICogQHBhcmFtIG5leHRUcmFuc2xhdG9yCisJICogICAgICAgICAgICBUaGUgbmV4dCBwZWVyIFRyYW5zbGF0b3IgdGhhdCB3aWxsIGJlY29tZSBhY3RpdmUKKwkgKiBAcGFyYW0gdGFyZ2V0CisJICogICAgICAgICAgICBUaGUgRU1GIFRhcmdldCBvZiB0aGUgVHJhbnNsYXRpb24KKwkgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbgorCSAqLworCXByaXZhdGUgdm9pZCBjbG9zZURvbVBhdGhJZk5lY2Vzc2FyeShDb250ZW50SGFuZGxlciBoYW5kbGVyLCBXcml0ZXJIaW50cyBoaW50cywgVHJhbnNsYXRvciBjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLCBUcmFuc2xhdG9yIG5leHRUcmFuc2xhdG9yLCBFT2JqZWN0IHRhcmdldCwgTGlzdCBtb2ZDaGlsZHJlbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisKKwkJaWYgKGN1cnJlbnRDaGlsZFRyYW5zbGF0b3IuaGFzRE9NUGF0aCgpICYmIHNob3VsZFJlbmRlckRvbVBhdGgodGFyZ2V0LCBjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLCBtb2ZDaGlsZHJlbikpIHsKKwkJCVN0cmluZyBjaGlsZERvbVBhdGggPSBjdXJyZW50Q2hpbGRUcmFuc2xhdG9yLmdldERPTVBhdGgoKTsKKwkJCWlmIChuZXh0VHJhbnNsYXRvciAhPSBudWxsKSB7IC8qCisJCQkJCQkJCQkJICAgKiBUaGVyZSBhcmUgbW9yZSBwZWVycyBhZnRlciB0aGlzIGVsZW1lbnQsIHdlIGNhbiBwZWVrCisJCQkJCQkJCQkJICAgKiBhaGVhZAorCQkJCQkJCQkJCSAgICovCisJCQkJU3RyaW5nIG5leHRQZWVyRG9tUGF0aCA9IG5leHRUcmFuc2xhdG9yLmdldERPTVBhdGgoKTsKKwkJCQlpZiAobmV4dFBlZXJEb21QYXRoID09IG51bGwgfHwgIW5leHRQZWVyRG9tUGF0aC5lcXVhbHMoY2hpbGREb21QYXRoKSkgeworCQkJCQloYW5kbGVyLmVuZEVsZW1lbnQoTkFNRVNQQUNFLCBjaGlsZERvbVBhdGgsIGNoaWxkRG9tUGF0aCk7CisJCQkJCWhpbnRzLnBvcERvbVBhdGgoKTsKKwkJCQl9CisKKwkJCX0gZWxzZSB7IC8qIFRoaXMgd2FzIHRoZSBsYXN0IGNoaWxkIGVsZW1lbnQsIHdlIG11c3QgY2xvc2UgdGhlIGRvbXBhdGggKi8KKwkJCQloYW5kbGVyLmVuZEVsZW1lbnQoTkFNRVNQQUNFLCBjaGlsZERvbVBhdGgsIGNoaWxkRG9tUGF0aCk7CisJCQkJaGludHMucG9wRG9tUGF0aCgpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogQWdncmVnYXRlIHRoZSBBdHRyaWJ1dGUgdHJhbnNsYXRvciBjaGlsZHJlbiBmcm9tIGEgZ2l2ZW4gdHJhbnNsYXRvci4gVGhpcyBtZXRob2Qgd2lsbCByZXF1ZXN0CisJICogdGhlIEF0dHJpYnV0ZXNJbXBsIG9iamVjdCBmcm9tIHRoZSBXcml0ZXJIaW50cyBvYmplY3QuIFRoZSBXcml0ZXJIaW50cyBtYWludGFpbnMgdGhpcworCSAqIHJldXNhYmxlIGNvbGxlY3Rpb24gdG8gbGltaXQgdGhlIHJlcXVpcmVtZW50IGZvciBuZXcgb2JqZWN0IGNyZWF0aW9uLgorCSAqIAorCSAqIEBwYXJhbSB0cmFuc2xhdG9yCisJICogQHBhcmFtIHRhcmdldAorCSAqIEBwYXJhbSBoaW50cworCSAqIEByZXR1cm4gYW4gaW5pdGlhbGl6ZWQgc2V0IG9mIEF0dHJpYnV0ZXMgZm9yIHRoZSBnaXZlbiBUcmFuc2xhdG9yIGFuZCBFTUYgVGFyZ2V0CisJICovCisJcHJpdmF0ZSBBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoVHJhbnNsYXRvciB0cmFuc2xhdG9yLCBFT2JqZWN0IHRhcmdldCwgV3JpdGVySGludHMgaGludHMpIHsKKworCQlBdHRyaWJ1dGVzSW1wbCBhdHRyaWJ1dGVzID0gaGludHMuZ2V0QXR0cmlidXRlSG9sZGVyKCk7CisJCWludCB2ZXJzaW9uID0gaGludHMuZ2V0VmVyc2lvbigpOworCQlPYmplY3QgcmF3VmFsdWUgPSBudWxsOworCQlTdHJpbmcgY29udmVydGVkVmFsdWUgPSBudWxsOworCQlTdHJpbmcgY2hpbGREb21OYW1lID0gbnVsbDsKKwkJVHJhbnNsYXRvciBhdHRyaWJ1dGVUcmFuc2xhdG9yID0gbnVsbDsKKwkJaW50W10gcHJvY2Vzc2luZ0hpbnRzID0gVHJhbnNsYXRvckZpbHRlci5jcmVhdGVQcm9jZXNzaW5nSGludHMoKTsKKworCQl3aGlsZSAoKGF0dHJpYnV0ZVRyYW5zbGF0b3IgPSBUcmFuc2xhdG9yRmlsdGVyLmdldE5leHRBdHRyaWJ1dGVUcmFuc2xhdG9yKHRyYW5zbGF0b3IsIHByb2Nlc3NpbmdIaW50c1tUcmFuc2xhdG9yRmlsdGVyLk5FWFRfU1RBUlRfSElOVF9JTkRYXSwgcHJvY2Vzc2luZ0hpbnRzLCB0YXJnZXQsIHZlcnNpb24pKSAhPSBudWxsKSB7CisKKwkJCUxpc3QgbW9mQ2hpbGRyZW4gPSBhdHRyaWJ1dGVUcmFuc2xhdG9yLmdldE1PRkNoaWxkcmVuKHRhcmdldCk7CisJCQlpZiAobW9mQ2hpbGRyZW4uc2l6ZSgpID4gMCkgeworCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbW9mQ2hpbGRyZW4uc2l6ZSgpOyBqKyspIHsKKworCQkJCQljaGlsZERvbU5hbWUgPSBhdHRyaWJ1dGVUcmFuc2xhdG9yLmdldERPTU5hbWUodGFyZ2V0KTsKKwkJCQkJcmF3VmFsdWUgPSBtb2ZDaGlsZHJlbi5nZXQoaik7CisJCQkJCWNvbnZlcnRlZFZhbHVlID0gYXR0cmlidXRlVHJhbnNsYXRvci5jb252ZXJ0VmFsdWVUb1N0cmluZyhyYXdWYWx1ZSwgdGFyZ2V0KTsKKwkJCQkJY29udmVydGVkVmFsdWUgPSBYTUxFbmNvZGVyRGVjb2Rlci5lc2NhcGUoY29udmVydGVkVmFsdWUpOworCQkJCQlhdHRyaWJ1dGVzLmFkZEF0dHJpYnV0ZShOQU1FU1BBQ0UsIGNoaWxkRG9tTmFtZSwgY2hpbGREb21OYW1lLCAiU3RyaW5nIiwgY29udmVydGVkVmFsdWUpOyAvLyROT04tTkxTLTEkCisJCQkJfQorCisJCQl9IGVsc2UgeworCQkJCWNoaWxkRG9tTmFtZSA9IGF0dHJpYnV0ZVRyYW5zbGF0b3IuZ2V0RE9NTmFtZSh0YXJnZXQpOworCQkJCWNvbnZlcnRlZFZhbHVlID0gKFN0cmluZykgYXR0cmlidXRlVHJhbnNsYXRvci5nZXRNT0ZWYWx1ZSh0YXJnZXQpOworCQkJCWlmIChjb252ZXJ0ZWRWYWx1ZSAhPSBudWxsKQorCQkJCQlhdHRyaWJ1dGVzLmFkZEF0dHJpYnV0ZShOQU1FU1BBQ0UsIGNoaWxkRG9tTmFtZSwgY2hpbGREb21OYW1lLCAiU3RyaW5nIiwgY29udmVydGVkVmFsdWUpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKwkJcmV0dXJuIGF0dHJpYnV0ZXM7CisJfQorCisJLyoqCisJICogV3JpdGVySGludHMgaXMgdXNlZCB0byAicmVtZW1iZXIiIGNlcnRhaW4gcGllY2VzIG9mIGluZm9ybWF0aW9uIHdoaWxlIHRoZSB3cml0ZXIgaXMKKwkgKiBwcm9jZXNzaW5nLiBPZiBwYXJ0aWN1bGFyIGludGVyZXN0IGFyZSB0aGUgdmVyc2lvbiBhbmQgdGhlIHN0YXRlIG9mIHRoZSBET00gUGF0aCBvdXRwdXQuCisJICogQ29uc2VjdXRpdmUgZWxlbWVudHMgd2l0aCBjb25zaXN0ZW50IChpZGVudGljYWwpIERPTSBQYXRocyBhcmUgY29sbGFwc2VkIHVuZGVyIGEgc2luZ2xlIFhNTAorCSAqIGVsZW1lbnQuCisJICogCisJICogVGhlIFdyaXRlckhpbnRzIHByb3ZpZGVzIGdsb2JhbCBzdGF0ZSBiZXR3ZWVuIHJlY3Vyc2l2ZSBpbnZvY2F0aW9ucyBvZiBzZXJpYWxpemUoKS4gSXQgc2hvdWxkCisJICogYmUgbm90IGJlIHVzZWQgdG8gc3RvcmUgbG9jYWwgZGF0YSAoZS5nLiBkYXRhIHRoYXQgaXMgb25seSByZWxldmFudCB0byBhIHNpbmdsZSBUcmFuc2xhdG9yIGluCisJICogYSBnaXZlbiBjb250ZXh0KS4KKwkgKiAKKwkgKiBUaGUgV3JpdGVySGludHMgYWxzbyBzdG9yZXMgYW4gQXR0cmlidXRlc0ltcGwgb2JqZWN0IHRoYXQgaXMgcmUtdXNlZCB0byBzdG9yZSBhdHRyaWJ1dGVzLiBUaGUKKwkgKiBnZXRBdHRyaWJ1dGVzKCkgbWV0aG9kIHdpbGwgcmVxdWVzdCB0aGUgQXR0cmlidXRlcyBIb2xkZXIuCisJICogCisJICogQGF1dGhvciBtZGVsZGVyCisJICovCisJcHVibGljIGZpbmFsIGNsYXNzIFdyaXRlckhpbnRzIHsKKwkJcHJpdmF0ZSBmaW5hbCBUcmFuc2xhdG9yUmVzb3VyY2UgcmVzb3VyY2U7CisJCXByaXZhdGUgZmluYWwgU3RhY2sgZG9tU3RhY2sgPSBuZXcgU3RhY2soKTsKKwkJcHJpdmF0ZSBmaW5hbCBBdHRyaWJ1dGVzSW1wbCBhdHRyaWJ1dGVzSW1wbCA9IG5ldyBBdHRyaWJ1dGVzSW1wbCgpOworCisJCXB1YmxpYyBXcml0ZXJIaW50cyhUcmFuc2xhdG9yUmVzb3VyY2UgcmVzKSB7CisJCQl0aGlzLnJlc291cmNlID0gcmVzOworCQl9CisKKwkJLyoqCisJCSAqIFB1c2ggYSBuZXcgZG9tUGF0aCBvbnRvIHRoZSBzdGFjaworCQkgKiAKKwkJICogQHBhcmFtIGRvbVBhdGgKKwkJICogICAgICAgICAgICBhIERPTVBhdGggd2hpY2ggaGFzIGJlZW4gd3JpdHRlbiB0byB0aGUgWE1MIHN0cmVhbQorCQkgKi8KKwkJcHVibGljIHZvaWQgcHVzaERvbVBhdGgoU3RyaW5nIGRvbVBhdGgpIHsKKworCQkJaWYgKGRvbVBhdGggIT0gbnVsbCAmJiBkb21QYXRoLmxlbmd0aCgpID4gMCkKKwkJCQlkb21TdGFjay5wdXNoKGRvbVBhdGgpOworCQl9CisKKwkJLyoqCisJCSAqIFBvcCB0aGUgY3VycmVudCBkb21QYXRoIGZyb20gdGhlIEFycmF5CisJCSAqLworCQlwdWJsaWMgdm9pZCBwb3BEb21QYXRoKCkgeworCisJCQlpZiAoIWRvbVN0YWNrLmlzRW1wdHkoKSkKKwkJCQlkb21TdGFjay5wb3AoKTsKKwkJfQorCisJCS8qKgorCQkgKiBEZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiBET01QYXRoIGhhcyBhbHJlYWR5IGJlZW4gd3JpdHRlbiB0byB0aGUgWE1MIHN0cmVhbQorCQkgKiAKKwkJICogQHBhcmFtIGRvbVBhdGgKKwkJICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBET01QYXRoIGhhcyBhbHJlYWR5IGJlZW4gd3JpdHRlbiB0byB0aGUgWE1MIHN0cmVhbQorCQkgKi8KKwkJcHVibGljIGJvb2xlYW4gaXNEb21QYXRoQWN0aXZlKFN0cmluZyBkb21QYXRoKSB7CisJCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOworCQkJaWYgKCFkb21TdGFjay5pc0VtcHR5KCkpIHsKKworCQkJCVN0cmluZyBjdXJyZW50RG9tUGF0aCA9IChTdHJpbmcpIGRvbVN0YWNrLnBlZWsoKTsKKwkJCQlpZiAoY3VycmVudERvbVBhdGggIT0gbnVsbCAmJiBkb21QYXRoICE9IG51bGwpCisJCQkJCXJlc3VsdCA9IGN1cnJlbnREb21QYXRoLmVxdWFscyhkb21QYXRoKTsKKwkJCQllbHNlIGlmICghKGN1cnJlbnREb21QYXRoID09IG51bGwgXiBkb21QYXRoID09IG51bGwpKQorCQkJCQlyZXN1bHQgPSB0cnVlOworCQkJfQorCisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisKKwkJLyoqCisJCSAqIEByZXR1cm4gdGhlIHZlcnNpb24gb2YgdGhlIEVNRiBSZXNvdXJjZQorCQkgKi8KKwkJcHVibGljIGludCBnZXRWZXJzaW9uKCkgeworCQkJcmV0dXJuIHRoaXMucmVzb3VyY2UuZ2V0VmVyc2lvbklEKCk7CisJCX0KKworCQkvKioKKwkJICogUmV0dXJucyBhbiBlbXB0eSBBdHRyaWJ1dGVzSW1wbCBvYmplY3QgdG8gc3RvcmUgYXR0cmlidXRlcy4gV2l0aGluIHRoZSBjb250ZXh0IG9mIGEgZ2l2ZW4KKwkJICogV3JpdGVySGludHMgb2JqZWN0IChhbmQgaGVuY2Ugc2luZ2xlIFhNTCBkb2N1bWVudCksIHRoZSBvYmplY3QgcmV0dXJuZWQgaXMgYSBzaW5nbGV0b24uCisJCSAqIFRoZSBzYW1lIEF0dHJpYnV0ZXNJbXBsIG9iamVjdCBpcyBjbGVhcmVkIGFuZCByZXVzZWQgZm9yIGVhY2ggaW52b2NhdGlvbi4KKwkJICogCisJCSAqIEByZXR1cm4gYW4gZW1wdHkgQXR0cmlidXRlc0ltcGwgb2JqZWN0IHRvIHN0b3JlIGF0dHJpYnV0ZXMKKwkJICovCisJCXB1YmxpYyBBdHRyaWJ1dGVzSW1wbCBnZXRBdHRyaWJ1dGVIb2xkZXIoKSB7CisJCQl0aGlzLmF0dHJpYnV0ZXNJbXBsLmNsZWFyKCk7CisJCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzSW1wbDsKKwkJfQorCisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0ZpbGVOYW1lUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0ZpbGVOYW1lUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWIzZGFiCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvRmlsZU5hbWVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UuRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRGVmYXVsdE92ZXJyaWRhYmxlUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7CisKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEZpbGVOYW1lUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkgZXh0ZW5kcyBEZWZhdWx0T3ZlcnJpZGFibGVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSB7CisKKwlwcml2YXRlIE1hcC8qPFN0cmluZyBzaG9ydE5hbWUsIFJlc291cmNlRmFjdG9yeURlc2NyaXB0b3I+Ki8gZGVzY3JpcHRvcnMgPSBuZXcgSGFzaE1hcCgpOyAKKwlwcml2YXRlIE1hcC8qPFJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IsIFJlc291cmNlLkZhY3Rvcnk+Ki8gZmFjdG9yaWVzID0gbmV3IEhhc2hNYXAoKTsKKwkKKwlwdWJsaWMgRmlsZU5hbWVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gYSBSZXNvdXJjZS5GYWN0b3J5IHRoYXQgaXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBsYXN0IHNlZ21lbnQgb2YgdGhlIFVSSSdzIGZpbGUgbmFtZS4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5SW1wbCNnZXRGYWN0b3J5KFVSSSkKKwkgKi8KKwlwcm90ZWN0ZWQgT2JqZWN0IGdldEZpbGVOYW1lRmFjdG9yeShVUkkgdXJpKSB7CisKKwkJaWYodXJpICE9IG51bGwpIHsKKwkJCVJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldERlc2NyaXB0b3IodXJpKTsKKwkJCQorCQkJaWYoZGVzY3JpcHRvciAhPSBudWxsKSB7CisJCQkJcmV0dXJuIGdldEZhY3RvcnkoZGVzY3JpcHRvcik7CQorCQkJfQkKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwkJCisJfQorCisJcHVibGljIHN5bmNocm9uaXplZCBSZXNvdXJjZS5GYWN0b3J5IGdldEZhY3RvcnkoVVJJIHVyaSkgeworCQlyZXR1cm4gZ2V0RmFjdG9yeSh1cmksIG51bGwpOworCX0KKworCXB1YmxpYyBSZXNvdXJjZS5GYWN0b3J5IGdldEZhY3RvcnkoVVJJIHVyaSwgU3RyaW5nIGNvbnRlbnRUeXBlKQorCXsKKwkJUmVzb3VyY2UuRmFjdG9yeSByZXNvdXJjZUZhY3RvcnkgPSBudWxsOworCQlpZih1cmkgIT0gbnVsbCAmJiB1cmkubGFzdFNlZ21lbnQoKSAhPSBudWxsKSB7CisJCQlSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXREZXNjcmlwdG9yKHVyaSk7CisJCQkKKwkJCWlmKGRlc2NyaXB0b3IgIT0gbnVsbCkgeworCQkJCXJlc291cmNlRmFjdG9yeSA9IGdldEZhY3RvcnkoZGVzY3JpcHRvcik7CQorCQkJfQkKKwkJfQorCQlpZihyZXNvdXJjZUZhY3RvcnkgPT0gbnVsbCkKKwkJCXJlc291cmNlRmFjdG9yeSA9IHN1cGVyLmdldEZhY3RvcnkodXJpLCBjb250ZW50VHlwZSk7CisJCXJldHVybiByZXNvdXJjZUZhY3Rvcnk7IAorCX0KKworCS8qKgorCSAqIFJlZ2lzdGVyIGEgZmlsZSBuYW1lIHJlcHJlc2VudGluZyB0aGUgbGFzdCBzZWdtZW50IG9mIGEgVVJJIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcKKwkgKiBSZXNvdXJjZS5GYWN0b3J5LgorCSAqLworCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWdpc3Rlckxhc3RGaWxlU2VnbWVudChTdHJpbmcgYVNpbXBsZUZpbGVOYW1lLCBSZXNvdXJjZS5GYWN0b3J5IGFGYWN0b3J5KSB7CisJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKGFTaW1wbGVGaWxlTmFtZSk7CisJCVN0cmluZyBsYXN0U2VnbWVudCA9IHVyaS5sYXN0U2VnbWVudCgpOyAKKwkJYWRkRGVzY3JpcHRvcihuZXcgU3RhdGljUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvcihsYXN0U2VnbWVudCwgYUZhY3RvcnkpKTsJCQorCX0gCisKKwlwcm90ZWN0ZWQgc3luY2hyb25pemVkIFJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcihVUkkgdXJpKSB7CisJCXJldHVybiAoUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvcikgZGVzY3JpcHRvcnMuZ2V0KHVyaS5sYXN0U2VnbWVudCgpKTsKKwl9CisJcHJvdGVjdGVkIHN5bmNocm9uaXplZCBNYXAgZ2V0RGVzY3JpcHRvcnMoKSB7CisJCXJldHVybiBkZXNjcmlwdG9yczsKKwl9CisKKwlwcm90ZWN0ZWQgZmluYWwgc3luY2hyb25pemVkIFJlc291cmNlLkZhY3RvcnkgZ2V0RmFjdG9yeShSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsgIAorCQlSZXNvdXJjZS5GYWN0b3J5IGZhY3RvcnkgPSAoRmFjdG9yeSkgZmFjdG9yaWVzLmdldChkZXNjcmlwdG9yKTsKKwkJaWYoZmFjdG9yeSA9PSBudWxsKSB7CisJCQlmYWN0b3JpZXMucHV0KGRlc2NyaXB0b3IsIChmYWN0b3J5ID0gZGVzY3JpcHRvci5jcmVhdGVGYWN0b3J5KCkpKTsKKwkJfQorCQlyZXR1cm4gZmFjdG9yeTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhZGREZXNjcmlwdG9yKFJlc291cmNlRmFjdG9yeURlc2NyaXB0b3IgZGVzY3JpcHRvcikgeyAKKwkJZGVzY3JpcHRvcnMucHV0KGRlc2NyaXB0b3IuZ2V0U2hvcnRTZWdtZW50KCksIGRlc2NyaXB0b3IpOworCX0KKyAKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0dlbmVyaWNUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9HZW5lcmljVHJhbnNsYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZmUwOWYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9HZW5lcmljVHJhbnNsYXRvci5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBDcmVhdGVkIG9uIE1hciAyMCwgMjAwMworICoKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKKworLyoqCisgKiBTcGVjaWFsaXplZCB0cmFuc2xhdG9yIGZvciBvYmplY3RzIHRoYXQgY29udGFpbiBzaW1wbGUgbWFwcGluZ3Mgd2l0aCBubyBzcGVjaWFsaXplZCBiZWhhdmlvci4KKyAqLworcHVibGljIGNsYXNzIEdlbmVyaWNUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciB7CisKKwlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNoaWxkcmVuOworCisJLyoqCisJICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCisJICogQHBhcmFtIGVDbGFzcworCSAqLworCXB1YmxpYyBHZW5lcmljVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVDbGFzcyBlQ2xhc3MpIHsKKwkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGVDbGFzcyk7CisJfQorCisJLyoqCisJICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCisJICogQHBhcmFtIGFGZWF0dXJlCisJICovCisJcHVibGljIEdlbmVyaWNUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKSB7CisJCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSk7CisJfQorCisJLyoqCisJICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCisJICogQHBhcmFtIGFGZWF0dXJlCisJICogQHBhcmFtIHBhdGgKKwkgKi8KKwlwdWJsaWMgR2VuZXJpY1RyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIFRyYW5zbGF0b3JQYXRoIHBhdGgpIHsKKwkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBwYXRoKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKKwkgKiBAcGFyYW0gYUZlYXR1cmUKKwkgKiBAcGFyYW0gcGF0aHMKKwkgKi8KKwlwdWJsaWMgR2VuZXJpY1RyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIFRyYW5zbGF0b3JQYXRoW10gcGF0aHMpIHsKKwkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBwYXRocyk7CisJfQorCisJLyoqCisJICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCisJICogQHBhcmFtIGFGZWF0dXJlCisJICogQHBhcmFtIGVDbGFzcworCSAqLworCXB1YmxpYyBHZW5lcmljVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgRUNsYXNzIGVDbGFzcykgeworCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUsIGVDbGFzcyk7CisJfQorCisJLyoqCisJICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCisJICogQHBhcmFtIGFGZWF0dXJlCisJICogQHBhcmFtIHN0eWxlCisJICovCisJcHVibGljIEdlbmVyaWNUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBpbnQgc3R5bGUpIHsKKwkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBzdHlsZSk7CisJfQorCisJLyoqCisJICogQHJldHVybiBUcmFuc2xhdG9yW10KKwkgKi8KKwlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKCkgeworCQlyZXR1cm4gY2hpbGRyZW47CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgY2hpbGRyZW4uCisJICogCisJICogQHBhcmFtIGNoaWxkcmVuCisJICogICAgICAgICAgICBUaGUgY2hpbGRyZW4gdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0Q2hpbGRyZW4oVHJhbnNsYXRvcltdIGNoaWxkcmVuKSB7CisJCXRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKKwl9CisKKworCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBhcHBlbmRDaGlsZHJlbihHZW5lcmljVHJhbnNsYXRvciB0cmFuLCBUcmFuc2xhdG9yW10gY2hpbGQpIHsKKwkJVHJhbnNsYXRvcltdIG9yZ0NoaWxkID0gdHJhbi5nZXRDaGlsZHJlbigpOworCQlUcmFuc2xhdG9yW10gbmV3Q2hpbGRyZW4gPSAoVHJhbnNsYXRvcltdKSBjb25jYXQob3JnQ2hpbGQsIGNoaWxkKTsKKwkJdHJhbi5zZXRDaGlsZHJlbihuZXdDaGlsZHJlbik7CisJCXJldHVybiB0cmFuOworCX0KKworCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBhcHBlbmRDaGlsZChHZW5lcmljVHJhbnNsYXRvciB0cmFuLCBUcmFuc2xhdG9yIGNoaWxkKSB7CisJCU9iamVjdFtdIG9yZ0NoaWxkID0gdHJhbi5nZXRDaGlsZHJlbigpOworCQlUcmFuc2xhdG9yW10gbmV3Q2hpbGRyZW4gPSAoVHJhbnNsYXRvcltdKSBjb25jYXQob3JnQ2hpbGQsIGNoaWxkKTsKKwkJdHJhbi5zZXRDaGlsZHJlbihuZXdDaGlsZHJlbik7CisJCXJldHVybiB0cmFuOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9JRFRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0lEVHJhbnNsYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YmY2YTAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9JRFRyYW5zbGF0b3IuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIENyZWF0ZWQgb24gTWFyIDE5LCAyMDAzCisgKgorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1JUmVzb3VyY2U7CisKKy8qKgorICogQGF1dGhvciBzY2hhY2hlcgorICovCitwdWJsaWMgY2xhc3MgSURUcmFuc2xhdG9yIGV4dGVuZHMgVHJhbnNsYXRvciB7CisJcHVibGljIGNsYXNzIE5vUmVzb3VyY2VFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKworCQlwdWJsaWMgTm9SZXNvdXJjZUV4Y2VwdGlvbigpIHsKKwkJCXN1cGVyKCk7CisJCX0KKworCQlwdWJsaWMgTm9SZXNvdXJjZUV4Y2VwdGlvbihTdHJpbmcgcykgeworCQkJc3VwZXIocyk7CisJCX0KKwl9CisKKwlzdGF0aWMgZmluYWwgcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBJRF9GRUFUVVJFID0gRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFQ2xhc3NfRUlEQXR0cmlidXRlKCk7CisJc3RhdGljIGZpbmFsIHB1YmxpYyBJRFRyYW5zbGF0b3IgSU5TVEFOQ0UgPSBuZXcgSURUcmFuc2xhdG9yKCk7CisKKwlwdWJsaWMgSURUcmFuc2xhdG9yKCkgeworCQlzdXBlcigiaWQiLCBJRF9GRUFUVVJFLCBET01fQVRUUklCVVRFKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCXB1YmxpYyB2b2lkIHNldE1PRlZhbHVlKEVPYmplY3QgZW1mT2JqZWN0LCBPYmplY3QgdmFsdWUpIHsKKwkJWE1JUmVzb3VyY2UgcmVzID0gKFhNSVJlc291cmNlKSBlbWZPYmplY3QuZVJlc291cmNlKCk7CisJCWlmIChyZXMgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBOb1Jlc291cmNlRXhjZXB0aW9uKCk7CisJCVN0cmluZyBpZCA9IHJlcy5nZXRJRChlbWZPYmplY3QpOworCQlpZiAoaWQgPT0gbnVsbCAmJiB2YWx1ZSA9PSBudWxsKQorCQkJcmV0dXJuOworCQlpZiAoKGlkICE9IG51bGwgJiYgIWlkLmVxdWFscyh2YWx1ZSkpIHx8ICh2YWx1ZSAhPSBudWxsICYmICF2YWx1ZS5lcXVhbHMoaWQpKSkKKwkJCXJlcy5zZXRJRChlbWZPYmplY3QsIChTdHJpbmcpIHZhbHVlKTsKKwl9CisKKwlwdWJsaWMgT2JqZWN0IGdldE1PRlZhbHVlKEVPYmplY3QgZW1mT2JqZWN0KSB7CisJCWlmIChlbWZPYmplY3QgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBOb1Jlc291cmNlRXhjZXB0aW9uKCk7CisJCVhNSVJlc291cmNlIHJlcyA9IChYTUlSZXNvdXJjZSkgZW1mT2JqZWN0LmVSZXNvdXJjZSgpOworCQlpZiAocmVzID09IG51bGwpCisJCQl0aHJvdyBuZXcgTm9SZXNvdXJjZUV4Y2VwdGlvbigpOworCQlyZXR1cm4gcmVzLmdldElEKGVtZk9iamVjdCk7CisJfQorCisKKwlwdWJsaWMgYm9vbGVhbiBmZWF0dXJlRXhpc3RzKEVPYmplY3QgZW1mT2JqZWN0KSB7CisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzSURNYXAoKSB7CisJCXJldHVybiB0cnVlOworCX0KKworCisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0lSb290T2JqZWN0UmVzb3VyY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL0lSb290T2JqZWN0UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDQ4MTM2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvSVJvb3RPYmplY3RSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworCitwdWJsaWMgaW50ZXJmYWNlIElSb290T2JqZWN0UmVzb3VyY2UgeworCisJcHVibGljIEVPYmplY3QgZ2V0Um9vdE9iamVjdCgpOworCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9MaW5rVXBkYXRlclRhcmdldC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvTGlua1VwZGF0ZXJUYXJnZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWNkMWY5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvTGlua1VwZGF0ZXJUYXJnZXQuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCisgKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOworCisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKworCitwdWJsaWMgY2xhc3MgTGlua1VwZGF0ZXJUYXJnZXQgZXh0ZW5kcyBPYmplY3QgeworCisJcHVibGljIHN0YXRpYyBmaW5hbCBMaW5rVXBkYXRlclRhcmdldCBJTlNUQU5DRSA9IG5ldyBMaW5rVXBkYXRlclRhcmdldCgpOworCisJLyoqCisJICogQ29uc3RydWN0b3IgZm9yIExpbmtVcGRhdGVyTXVsdGlUYXJnZXQuCisJICogCisJICogQHBhcmFtIGFkYXB0ZXIKKwkgKi8KKwlwcml2YXRlIExpbmtVcGRhdGVyVGFyZ2V0KCkgeworCQlzdXBlcigpOworCX0KKworCisJcHVibGljIHZvaWQgdXBkYXRlRE9NKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7CisJCXJlZnJlc2hTb3VyY2VPYmplY3RzKG1hcCwgbm9kZSwgbW9mT2JqZWN0LCB0cnVlKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB1cGRhdGVNT0YoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKKwkJcmVmcmVzaFNvdXJjZU9iamVjdHMobWFwLCBub2RlLCBtb2ZPYmplY3QsIGZhbHNlKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU291cmNlT2JqZWN0cyhUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCwgYm9vbGVhbiBkb21VcGRhdGUpIHsKKwkJVHJhbnNsYXRvclBhdGhbXSBwYXRocyA9IG1hcC5nZXRUcmFuc2xhdG9yUGF0aHMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGg7IGkrKykgeworCQkJVHJhbnNsYXRvclBhdGggcGF0aCA9IHBhdGhzW2ldOworCQkJTGlzdCBhbGxTb3VyY2VPYmplY3RzID0gcGF0aC5maW5kT2JqZWN0cyhtb2ZPYmplY3QpOworCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWxsU291cmNlT2JqZWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKwkJCQlFT2JqZWN0IGN1ck9iamVjdCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKKwkJCQlFTUYyRE9NQWRhcHRlciBjdXJBZGFwdGVyID0gKEVNRjJET01BZGFwdGVyKSBFY29yZVV0aWwuZ2V0QWRhcHRlcihjdXJPYmplY3QuZUFkYXB0ZXJzKCksIEVNRjJET01BZGFwdGVyLmNsYXNzKTsKKwkJCQlpZiAoY3VyQWRhcHRlciAhPSBudWxsKSB7CisJCQkJCWlmIChkb21VcGRhdGUpCisJCQkJCQljdXJBZGFwdGVyLnVwZGF0ZURPTSgpOworCQkJCQllbHNlCisJCQkJCQljdXJBZGFwdGVyLnVwZGF0ZU1PRigpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9NYXBwZWRYTUlIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL01hcHBlZFhNSUhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwOTM5YTIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9NYXBwZWRYTUlIZWxwZXIuamF2YQpAQCAtMCwwICsxLDI5NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTEhlbHBlckltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLklEVXRpbDsKKworcHVibGljIGNsYXNzIE1hcHBlZFhNSUhlbHBlciBleHRlbmRzIFhNTEhlbHBlckltcGwgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktTUEFDRV9QUk9UT0NPTCA9ICJ3b3Jrc3BhY2U6LyI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk1fUkVTT1VSQ0VfUFJPVE9DT0wgPSAicGxhdGZvcm06L3Jlc291cmNlLyI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgTlVMTF9GRUFUVVJFID0gbmV3IFVuc3VwcG9ydGVkRmVhdHVyZSgpOworCXByb3RlY3RlZCBib29sZWFuIHVzaW5nTWFwcyA9IHRydWU7CisJcHJvdGVjdGVkIE1hcCBjYWNoZWRSZWxhdGl2ZVVSSXM7CisJcHJvdGVjdGVkIE1hcCBwYWNrYWdlVVJJc1RvUHJlZml4ZXM7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvciBmb3IgTWFwcGVkWE1MSGVscGVyLgorCSAqIAorCSAqIEBwYXJhbSByZXNvdXJjZQorCSAqLworCXB1YmxpYyBNYXBwZWRYTUlIZWxwZXIoWE1MUmVzb3VyY2UgcmVzb3VyY2UsIE1hcCBwcmVmaXhlc1RvVVJJcykgeworCQlzdXBlcihyZXNvdXJjZSk7CisJCXRoaXMucHJlZml4ZXNUb1VSSXMucHV0QWxsKHByZWZpeGVzVG9VUklzKTsKKwkJcHVzaENvbnRleHQoKTsgLy9OZWVkZWQgdG8gaW5pdGlhbGl6ZSB0aGUgY29udGV4dCB0byB6ZXJvCisJCVNldCBrZXlzID0gcHJlZml4ZXNUb1VSSXMua2V5U2V0KCk7CisJCWZvciAoSXRlcmF0b3IgaXRlciA9IGtleXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisJCQlTdHJpbmcgcHJlZml4ID0gKFN0cmluZykgaXRlci5uZXh0KCk7CisJCQlTdHJpbmcgdXJpID0gKFN0cmluZykgcHJlZml4ZXNUb1VSSXMuZ2V0KHByZWZpeCk7CisJCQluYW1lc3BhY2VTdXBwb3J0LmRlY2xhcmVQcmVmaXgocHJlZml4LCB1cmkpOworCQl9CisKKwl9CisKKwlwdWJsaWMgVVJJIHJlc29sdmUoVVJJIHJlbGF0aXZlLCBVUkkgYmFzZSkgeworCQlVUkkgcmVzb2x2ZWQgPSBudWxsOworCQlib29sZWFuIGlzTWFwcGVkID0gZmFsc2U7CisJCVJlc291cmNlU2V0IHNldCA9IGdldFJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKKwkJaWYgKHNldCAhPSBudWxsKSB7CisJCQlVUkkgbG9jYWxyZXNvdXJjZVVSSSA9IG51bGw7CisJCQlpZiAocmVsYXRpdmUuaGFzRnJhZ21lbnQoKSkKKwkJCQlsb2NhbHJlc291cmNlVVJJID0gcmVsYXRpdmUudHJpbUZyYWdtZW50KCk7CisJCQllbHNlCisJCQkJbG9jYWxyZXNvdXJjZVVSSSA9IHJlbGF0aXZlOworCQkJaXNNYXBwZWQgPSAhKCgoVVJJQ29udmVydGVySW1wbC5VUklNYXApIHNldC5nZXRVUklDb252ZXJ0ZXIoKS5nZXRVUklNYXAoKSkuZ2V0VVJJKGxvY2FscmVzb3VyY2VVUkkpLmVxdWFscyhsb2NhbHJlc291cmNlVVJJKSk7CisJCX0KKwkJaWYgKCFpc01hcHBlZCkgeworCQkJaWYgKGlzVXNpbmdDb250YWluZXJSZWxhdGl2ZVBhdGhzKCkgJiYgc2V0ICE9IG51bGwpCisJCQkJcmVzb2x2ZWQgPSBzZXQuZ2V0VVJJQ29udmVydGVyKCkubm9ybWFsaXplKHJlbGF0aXZlKTsKKwkJfSBlbHNlIHsKKwkJCXJlc29sdmVkID0gcmVsYXRpdmU7CisJCX0KKwkJcmV0dXJuIHJlc29sdmVkID09IG51bGwgPyBzdXBlci5yZXNvbHZlKHJlbGF0aXZlLCBiYXNlKSA6IHJlc29sdmVkOworCX0KKworCS8qKgorCSAqIE1ldGhvZCBpc1VzaW5nQ29udGFpbmVyUmVsYXRpdmVQYXRocy4KKwkgKiAKKwkgKiBAcmV0dXJuIGJvb2xlYW4KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaXNVc2luZ0NvbnRhaW5lclJlbGF0aXZlUGF0aHMoKSB7CisJCXJldHVybiAoKENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZSkgcmVzb3VyY2UpLmdldEZvcm1hdCgpID09IENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZS5GT1JNQVRfTU9GNSB8fCB1c2luZ01hcHM7CisJfQorCisJcHVibGljIHZvaWQgYWRkUHJlZml4KFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpIHsKKwkJLyoKKwkJICogcHJvYmxlbSAtIHRoZSBpbmNvbWluZyBrZXkgdmFsdWUgcGFpciBpcyBlamJibmQtPmVqYmJuZC54bWk7IGhvd2V2ZXIsIHRoZSBtYXAgYWxyZWFkeSBoYXMKKwkJICogYSBrZXkgdmFsdWUgcGFpciBvZiBlamJibmQtPmh0dHA6Ly8vZWpiYm5kLmVjb3JlCisJCSAqLworCQlpZiAodXJpLmVuZHNXaXRoKCIuZWNvcmUiKSkgeyAvLyROT04tTkxTLTEkCisJCQl1c2luZ01hcHMgPSBmYWxzZTsKKwkJfQorCQlTdHJpbmcgZXhpc3RpbmcgPSAoU3RyaW5nKSBwcmVmaXhlc1RvVVJJcy5nZXQocHJlZml4KTsKKwkJaWYgKGV4aXN0aW5nID09IG51bGwpIHsKKwkJCXByZWZpeGVzVG9VUklzLnB1dChwcmVmaXgsIHVyaSk7CisJCQluYW1lc3BhY2VTdXBwb3J0LmRlY2xhcmVQcmVmaXgocHJlZml4LCB1cmkpOworCQl9IGVsc2UgaWYgKCFleGlzdGluZy5lcXVhbHModXJpKSkgeworCQkJZ2V0Q29tcGF0aWJpbGl0eVJlc291cmNlKCkuYWRkT3JpZ2luYWxQYWNrYWdlVVJJKGV4aXN0aW5nLCB1cmkpOworCQkJZ2V0Q29tcGF0aWJpbGl0eVJlc291cmNlKCkuc2V0Rm9ybWF0KENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZS5GT1JNQVRfTU9GNSk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlIGdldENvbXBhdGliaWxpdHlSZXNvdXJjZSgpIHsKKwkJcmV0dXJuIChDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UpIGdldFJlc291cmNlKCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MSGVscGVySW1wbCNnZXRIUkVGKEVPYmplY3QpCisJICovCisJcHVibGljIFN0cmluZyBnZXRIUkVGKEVPYmplY3Qgb2JqKSB7CisJCWlmICghZ2V0Q29tcGF0aWJpbGl0eVJlc291cmNlKCkudXNlc0RlZmF1bHRGb3JtYXQoKSkgeworCQkJVVJJQ29udmVydGVyIGNvbnYgPSBnZXRVUklDb252ZXJ0ZXIoKTsKKwkJCWlmIChjb252ICE9IG51bGwgJiYgY29udiBpbnN0YW5jZW9mIENvbXBhdGliaWxpdHlVUklDb252ZXJ0ZXIpIHsKKwkJCQlTdHJpbmcgaHJlZiA9IGdldENvbXBhdGlibGlsdHlIUkVGKG9iaiwgKENvbXBhdGliaWxpdHlVUklDb252ZXJ0ZXIpIGNvbnYpOworCQkJCXJldHVybiB1c2VXb3Jrc3BhY2VQcm90b2NvbElmTmVjZXNzYXJ5KGhyZWYpOworCQkJfQorCQl9CisJCXJldHVybiBzdXBlci5nZXRIUkVGKG9iaik7CisJfQorCisKKwkvKioKKwkgKiBAcGFyYW0gaHJlZgorCSAqIEByZXR1cm4KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHVzZVdvcmtzcGFjZVByb3RvY29sSWZOZWNlc3NhcnkoU3RyaW5nIGhyZWYpIHsKKwkJaWYgKGhyZWYgIT0gbnVsbCAmJiBocmVmLnN0YXJ0c1dpdGgoUExBVEZPUk1fUkVTT1VSQ0VfUFJPVE9DT0wpKQorCQkJcmV0dXJuIFdPUktTUEFDRV9QUk9UT0NPTCArIGhyZWYuc3Vic3RyaW5nKDE5KTsKKwkJcmV0dXJuIGhyZWY7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0Q29tcGF0aWJsaWx0eUhSRUYoRU9iamVjdCBvYmosIENvbXBhdGliaWxpdHlVUklDb252ZXJ0ZXIgY29udikgeworCQkvL0ltcGxlbWVudGF0aW9uIGNvcGllZCBmcm9tIHN1cGVyLmdldEhSRUYoRU9iamVjdCkKKwkJSW50ZXJuYWxFT2JqZWN0IG8gPSAoSW50ZXJuYWxFT2JqZWN0KSBvYmo7CisKKwkJVVJJIG9iamVjdFVSSSA9IG8uZVByb3h5VVJJKCk7CisJCWlmIChvYmplY3RVUkkgPT0gbnVsbCkgeworCQkJUmVzb3VyY2Ugb3RoZXJSZXNvdXJjZSA9IG9iai5lUmVzb3VyY2UoKTsKKwkJCWlmIChvdGhlclJlc291cmNlID09IG51bGwpIHsKKwkJCQlvYmplY3RVUkkgPSBoYW5kbGVEYW5nbGluZ0hSRUYob2JqKTsKKwkJCQlpZiAob2JqZWN0VVJJID09IG51bGwpIHsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJb2JqZWN0VVJJID0gb3RoZXJSZXNvdXJjZS5nZXRVUkkoKS5hcHBlbmRGcmFnbWVudChvdGhlclJlc291cmNlLmdldFVSSUZyYWdtZW50KG9iaikpOworCQl9CisKKwkJLy9Nb2RpZmllZCB0byBkaXNwYXRjaCBiYWNrIHRvIFVSSSBDb252ZXJ0ZXIKKwkJaWYgKCFvYmplY3RVUkkuaXNSZWxhdGl2ZSgpKSB7CisJCQlvYmplY3RVUkkgPSBtYWtlUmVsYXRpdmUob2JqZWN0VVJJLCBjb252KTsKKwkJfQorCQlyZXR1cm4gb2JqZWN0VVJJLnRvU3RyaW5nKCk7CisJfQorCisJcHJvdGVjdGVkIFVSSSBtYWtlUmVsYXRpdmUoVVJJIG9iamVjdFVSSSwgQ29tcGF0aWJpbGl0eVVSSUNvbnZlcnRlciBjb252KSB7CisJCVN0cmluZyBmcmFnbWVudCA9IG9iamVjdFVSSS5mcmFnbWVudCgpOworCQlvYmplY3RVUkkgPSBvYmplY3RVUkkudHJpbUZyYWdtZW50KCk7CisJCVVSSSByZWxhdGl2ZSA9IChVUkkpIGdldENhY2hlZFJlbGF0aXZlVVJJcygpLmdldChvYmplY3RVUkkpOworCQlpZiAocmVsYXRpdmUgPT0gbnVsbCkgeworCQkJcmVsYXRpdmUgPSBjb252LmRlTm9ybWFsaXplKG9iamVjdFVSSSk7CisJCQlpZiAocmVsYXRpdmUuaXNSZWxhdGl2ZSgpKQorCQkJCWNhY2hlZFJlbGF0aXZlVVJJcy5wdXQob2JqZWN0VVJJLCByZWxhdGl2ZSk7CisJCX0KKwkJcmV0dXJuIHJlbGF0aXZlLmFwcGVuZEZyYWdtZW50KGZyYWdtZW50KTsKKwl9CisKKwlwcm90ZWN0ZWQgVVJJQ29udmVydGVyIGdldFVSSUNvbnZlcnRlcigpIHsKKwkJUmVzb3VyY2VTZXQgc2V0ID0gZ2V0UmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOworCQlpZiAoc2V0ICE9IG51bGwpCisJCQlyZXR1cm4gc2V0LmdldFVSSUNvbnZlcnRlcigpOworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcm90ZWN0ZWQgTWFwIGdldENhY2hlZFJlbGF0aXZlVVJJcygpIHsKKwkJaWYgKGNhY2hlZFJlbGF0aXZlVVJJcyA9PSBudWxsKQorCQkJY2FjaGVkUmVsYXRpdmVVUklzID0gbmV3IEhhc2hNYXAoKTsKKwkJcmV0dXJuIGNhY2hlZFJlbGF0aXZlVVJJczsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxIZWxwZXJJbXBsI2dldElEKEVPYmplY3QpCisJICovCisJcHVibGljIFN0cmluZyBnZXRJRChFT2JqZWN0IG9iaikgeworCQlpZiAoZ2V0Q29tcGF0aWJpbGl0eVJlc291cmNlKCkudXNlc0RlZmF1bHRGb3JtYXQoKSkKKwkJCXJldHVybiBzdXBlci5nZXRJRChvYmopOworCQlyZXR1cm4gSURVdGlsLmdldE9yQXNzaWduSUQob2JqLCByZXNvdXJjZSk7CisJfQorCisJcHVibGljIFN0cmluZ1tdIGdldE5TSW5mbyhFUGFja2FnZSBwa2cpIHsKKwkJU3RyaW5nIHByZWZpeCA9IGdldE1hcHBlZFByZWZpeChwa2cpOworCQlpZiAocHJlZml4ID09IG51bGwpCisJCQlyZXR1cm4gbmV3IFN0cmluZ1tde3BrZy5nZXROc1ByZWZpeCgpLCBwa2cuZ2V0TnNVUkkoKX07CisJCXJldHVybiBuZXcgU3RyaW5nW117cHJlZml4LCBwcmVmaXggKyAiLnhtaSJ9OyAvLyROT04tTkxTLTEkCisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBnZXRNYXBwZWRQcmVmaXgoRVBhY2thZ2UgcGtnKSB7CisJCVN0cmluZyBuc1VSSSA9IHBrZy5nZXROc1VSSSgpOworCQlpZiAodXNpbmdNYXBzIHx8ICFnZXRDb21wYXRpYmlsaXR5UmVzb3VyY2UoKS51c2VzRGVmYXVsdEZvcm1hdCgpKQorCQkJcmV0dXJuIChTdHJpbmcpIHBhY2thZ2VVUklzVG9QcmVmaXhlcy5nZXQobnNVUkkpOworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldE1hcHBlZFByZWZpeE9yRGVmYXVsdChFUGFja2FnZSBwa2cpIHsKKwkJU3RyaW5nIHByZWZpeCA9IGdldE1hcHBlZFByZWZpeChwa2cpOworCQlyZXR1cm4gcHJlZml4ID09IG51bGwgPyBwa2cuZ2V0TnNQcmVmaXgoKSA6IHByZWZpeDsKKwl9CisKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHBhY2thZ2VVUklzVG9QcmVmaXhlcy4KKwkgKiAKKwkgKiBAcmV0dXJuIE1hcAorCSAqLworCXB1YmxpYyBNYXAgZ2V0UGFja2FnZVVSSXNUb1ByZWZpeGVzKCkgeworCQlyZXR1cm4gcGFja2FnZVVSSXNUb1ByZWZpeGVzOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHBhY2thZ2VVUklzVG9QcmVmaXhlcy4KKwkgKiAKKwkgKiBAcGFyYW0gcGFja2FnZVVSSXNUb1ByZWZpeGVzCisJICogICAgICAgICAgICBUaGUgcGFja2FnZVVSSXNUb1ByZWZpeGVzIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldFBhY2thZ2VVUklzVG9QcmVmaXhlcyhNYXAgcGFja2FnZVVSSXNUb1ByZWZpeGVzKSB7CisJCXRoaXMucGFja2FnZVVSSXNUb1ByZWZpeGVzID0gcGFja2FnZVVSSXNUb1ByZWZpeGVzOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UU5hbWUoRUNsYXNzIGMpIHsKKwkJU3RyaW5nIG5hbWUgPSBnZXROYW1lKGMpOworCisJCWlmICh4bWxNYXAgIT0gbnVsbCkgeworCQkJWE1MUmVzb3VyY2UuWE1MSW5mbyBjbHNJbmZvID0geG1sTWFwLmdldEluZm8oYyk7CisKKwkJCWlmIChjbHNJbmZvICE9IG51bGwpIHsKKwkJCQlTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gY2xzSW5mby5nZXRUYXJnZXROYW1lc3BhY2UoKTsKKwkJCQlyZXR1cm4gZ2V0UU5hbWUodGFyZ2V0TmFtZXNwYWNlLCBuYW1lKTsKKwkJCX0KKwkJfQorCisJCUVQYWNrYWdlIHAgPSBjLmdldEVQYWNrYWdlKCk7CisJCXBhY2thZ2VzLnB1dChwLCBudWxsKTsKKworCQlpZiAocC5nZXROc1ByZWZpeCgpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQgCisJCQlyZXR1cm4gbmFtZTsKKworCQkvL01vZGlmaWVkIGZyb20gc3VwZXJjbGFzcworCQkvL3JldHVybiBwLmdldE5zUHJlZml4KCkgKyAiOiIgKyBuYW1lOworCQlyZXR1cm4gZ2V0TWFwcGVkUHJlZml4T3JEZWZhdWx0KHApICsgIjoiICsgbmFtZTsgLy8kTk9OLU5MUy0xJCAKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxIZWxwZXJJbXBsI3NldFZhbHVlKEVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSwKKwkgKiAgICAgIE9iamVjdCwgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIHNldFZhbHVlKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlLCBpbnQgcG9zaXRpb24pIHsKKwkJaWYgKGZlYXR1cmUgPT0gTlVMTF9GRUFUVVJFKQorCQkJcmV0dXJuOworCQlpZiAoIWZlYXR1cmUuaXNUcmFuc2llbnQoKSkgeworCQkJaWYgKHZhbHVlID09IG51bGwgJiYgZmVhdHVyZS5nZXRFVHlwZSgpLmdldEluc3RhbmNlQ2xhc3MoKSAhPSBudWxsICYmIGZlYXR1cmUuZ2V0RVR5cGUoKS5nZXRJbnN0YW5jZUNsYXNzKCkuaXNQcmltaXRpdmUoKSkKKwkJCQkvL0ZvciBjb21wYXRpYmlsaXR5IHdpdGggTU9GNSB3aGVyZSB0eXBlcyBsaWtlIEludGVnZXIgbWlnaHQgaGF2ZSBiZWVuIHNldAorCQkJCS8vYW5kIHNlcmlhbGl6ZWQgYXMgInhzaTpuaWwiCisJCQkJcmV0dXJuOworCisJCQlzdXBlci5zZXRWYWx1ZShvYmplY3QsIGZlYXR1cmUsIHZhbHVlLCBwb3NpdGlvbik7CisJCX0KKwl9CisKKworCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTEhlbHBlciNnZXRGZWF0dXJlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3MsCisJICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKQorCSAqLworCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZShFQ2xhc3MgZUNsYXNzLCBTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0VsZW1lbnQpIHsKKwkJaWYgKFVuc3VwcG9ydGVkRmVhdHVyZS5pc1Vuc3VwcG9ydGVkKGVDbGFzcywgbmFtZSkpCisJCQlyZXR1cm4gTlVMTF9GRUFUVVJFOworCQlyZXR1cm4gc3VwZXIuZ2V0RmVhdHVyZShlQ2xhc3MsIG5hbWVzcGFjZVVSSSwgbmFtZSwgaXNFbGVtZW50KTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyI2dldEZlYXR1cmVLaW5kKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUpCisJICovCisJcHVibGljIGludCBnZXRGZWF0dXJlS2luZChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgeworCQlpZiAoZmVhdHVyZSA9PSBOVUxMX0ZFQVRVUkUpCisJCQlyZXR1cm4gWE1MSGVscGVyLkRBVEFUWVBFX1NJTkdMRTsKKwkJcmV0dXJuIHN1cGVyLmdldEZlYXR1cmVLaW5kKGZlYXR1cmUpOworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL011bHRpT2JqZWN0VHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvTXVsdGlPYmplY3RUcmFuc2xhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFlZDViYwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL011bHRpT2JqZWN0VHJhbnNsYXRvci5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIENyZWF0ZWQgb24gTWFyIDMxLCAyMDAzCisgKgorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworCisvKioKKyAqIEBhdXRob3Igc2NoYWNoZXIKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIE11bHRpT2JqZWN0VHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3JbXSBFTVBUWV9UUkFOU0xBVE9SUyA9IG5ldyBUcmFuc2xhdG9yW117fTsKKworCS8qKgorCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAorCSAqIEBwYXJhbSBhRmVhdHVyZQorCSAqIEBwYXJhbSBzdHlsZQorCSAqLworCXB1YmxpYyBNdWx0aU9iamVjdFRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKKwkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlKTsKKwl9CisKKwlwdWJsaWMgYWJzdHJhY3QgVHJhbnNsYXRvciBnZXREZWxlZ2F0ZUZvcihFT2JqZWN0IG8pOworCisJcHVibGljIGFic3RyYWN0IFRyYW5zbGF0b3IgZ2V0RGVsZWdhdGVGb3IoU3RyaW5nIGRvbU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKTsKKworCisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NyZWF0ZUVNRk9iamVjdChqYXZhLmxhbmcuU3RyaW5nLAorCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgRU9iamVjdCBjcmVhdGVFTUZPYmplY3QoU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSkgeworCQlyZXR1cm4gZ2V0RGVsZWdhdGVGb3Iobm9kZU5hbWUsIHJlYWRBaGVhZE5hbWUpLmNyZWF0ZUVNRk9iamVjdChub2RlTmFtZSwgcmVhZEFoZWFkTmFtZSk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8sIGludCB2ZXJzaW9uKSB7CisJCWlmIChvID09IG51bGwpCisJCQlyZXR1cm4gRU1QVFlfVFJBTlNMQVRPUlM7CisJCXJldHVybiBnZXREZWxlZ2F0ZUZvcigoRU9iamVjdCkgbykuZ2V0Q2hpbGRyZW4obywgdmVyc2lvbik7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRET01OYW1lKGphdmEubGFuZy5PYmplY3QpCisJICovCisJcHVibGljIFN0cmluZyBnZXRET01OYW1lKE9iamVjdCB2YWx1ZSkgeworCQlyZXR1cm4gZ2V0RGVsZWdhdGVGb3IoKEVPYmplY3QpIHZhbHVlKS5nZXRET01OYW1lKHZhbHVlKTsKKwl9CisKKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjaXNNYW5hZ2VkQnlQYXJlbnQoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTWFuYWdlZEJ5UGFyZW50KCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIGJvb2xlYW4gc2hvdWxkSW5kZW50RW5kVGFnKE5vZGUgbm9kZSkgeworCQlpZiAobm9kZS5nZXROb2RlTmFtZSgpLmVxdWFscyhnZXRET01QYXRoKCkpKSB7CisJCQlyZXR1cm4gc3VwZXIuc2hvdWxkSW5kZW50RW5kVGFnKG5vZGUpOworCQl9CisJCVRyYW5zbGF0b3IgZGVsZWdhdGUgPSBnZXREZWxlZ2F0ZUZvcihub2RlLmdldE5vZGVOYW1lKCksIG51bGwpOworCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkgeworCQkJcmV0dXJuIGRlbGVnYXRlLnNob3VsZEluZGVudEVuZFRhZyhub2RlKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuc2hvdWxkSW5kZW50RW5kVGFnKG5vZGUpOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL05hbWVzcGFjZVRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL05hbWVzcGFjZVRyYW5zbGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzIzZWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvTmFtZXNwYWNlVHJhbnNsYXRvci5qYXZhCkBAIC0wLDAgKzEsMTEyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIENyZWF0ZWQgb24gQXVnIDE0LCAyMDAzCisgKgorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLk5hbWVzcGFjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuTmFtZXNwYWNlQWRhcHRlcjsKKworCisvKioKKyAqIEBhdXRob3Igc2NoYWNoZXIKKyAqLworcHVibGljIGNsYXNzIE5hbWVzcGFjZVRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIHsKKworCXByb3RlY3RlZCBTdHJpbmcgcHJlZml4OworCisJLyoqCisJICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCisJICogQHBhcmFtIGFGZWF0dXJlCisJICovCisJcHVibGljIE5hbWVzcGFjZVRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWUpIHsKKwkJc3VwZXIoZG9tTmFtZSwgTmFtZXNwYWNlQWRhcHRlci5OT1RJRklDQVRJT05fRkVBVFVSRSwgRE9NX0FUVFJJQlVURSk7CisJCWluaXRQcmVmaXgoKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgaW5pdFByZWZpeCgpIHsKKwkJU3RyaW5nIGROYW1lID0gZ2V0RE9NTmFtZShudWxsKTsKKwkJcHJlZml4ID0gZE5hbWUuc3Vic3RyaW5nKERlZmF1bHRUcmFuc2xhdG9yRmFjdG9yeS5YTUxOUy5sZW5ndGgoKSk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNzZXRNT0ZWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKKwkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCisJICovCisJcHVibGljIHZvaWQgc2V0TU9GVmFsdWUoRU9iamVjdCBlbWZPYmplY3QsIE9iamVjdCB2YWx1ZSkgeworCQlOYW1lc3BhY2VBZGFwdGVyLmFkZE5hbWVzcGFjZShwcmVmaXgsIChTdHJpbmcpIHZhbHVlLCBlbWZPYmplY3QpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjaXNTZXRNT0ZWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1NldE1PRlZhbHVlKEVPYmplY3QgZW1mT2JqZWN0KSB7CisJCXJldHVybiBnZXRNT0ZWYWx1ZShlbWZPYmplY3QpICE9IG51bGw7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRNT0ZWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldE1PRlZhbHVlKEVPYmplY3QgbW9mT2JqZWN0KSB7CisJCXJldHVybiBOYW1lc3BhY2VBZGFwdGVyLmdldE5hbWVzcGFjZVVSSUF0VGhpc0xldmVsKHByZWZpeCwgbW9mT2JqZWN0KTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI3VuU2V0TU9GVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCisJICovCisJcHVibGljIHZvaWQgdW5TZXRNT0ZWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCkgeworCQlOYW1lc3BhY2VBZGFwdGVyLnJlbW92ZU5hbWVzcGFjZShwcmVmaXgsIGVtZk9iamVjdCk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNmZWF0dXJlRXhpc3RzKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQorCSAqLworCXB1YmxpYyBib29sZWFuIGZlYXR1cmVFeGlzdHMoRU9iamVjdCBlbWZPYmplY3QpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNpc0RhdGFUeXBlKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0RhdGFUeXBlKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2lzTWFwRm9yKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsCisJICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTWFwRm9yKE9iamVjdCBhRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJaWYgKGFGZWF0dXJlID09IGZlYXR1cmUpIHsKKwkJCU5hbWVzcGFjZSBuYW1lc3BhY2UgPSAoTmFtZXNwYWNlKSAob2xkVmFsdWUgPT0gbnVsbCA/IG5ld1ZhbHVlIDogb2xkVmFsdWUpOworCQkJaWYgKG5hbWVzcGFjZSAhPSBudWxsKQorCQkJCXJldHVybiBwcmVmaXguZXF1YWxzKG5hbWVzcGFjZS5nZXRQcmVmaXgoKSk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL09iamVjdFRyYW5zbGF0b3JGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL09iamVjdFRyYW5zbGF0b3JGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MThiOWNlCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvT2JqZWN0VHJhbnNsYXRvckZpbHRlci5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKKyAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBDcmVhdGVkIG9uIFNlcCAyMSwgMjAwMworICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOworCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBPYmplY3RUcmFuc2xhdG9yRmlsdGVyIGV4dGVuZHMgVHJhbnNsYXRvckZpbHRlciB7CisKKwlwdWJsaWMgT2JqZWN0VHJhbnNsYXRvckZpbHRlcigpIHsKKwkJc3VwZXIobnVsbCwgLTEpOworCX0KKworCXB1YmxpYyBPYmplY3RUcmFuc2xhdG9yRmlsdGVyKFRyYW5zbGF0b3IgdHJhbnMsIGludCB2ZXJzaW9uKSB7CisJCXN1cGVyKHRyYW5zLCB2ZXJzaW9uKTsKKwl9CisKKwlwdWJsaWMgZmluYWwgaW50IHNjYW5OZXh0VHJhbnNsYXRvcihUcmFuc2xhdG9yW10gY2hpbGRyZW4sIGludCBzdGFydCkgeworCQlpbnQgZm91bmQgPSBzdGFydCArIDE7CisJCWZvciAoOyBmb3VuZCA8IGNoaWxkcmVuLmxlbmd0aDsgKytmb3VuZCkgeworCQkJaWYgKCFjaGlsZHJlbltmb3VuZF0uaXNET01BdHRyaWJ1dGUoKSkKKwkJCQlicmVhazsKKwkJfQorCQlmb3VuZCA9IChmb3VuZCA8IGNoaWxkcmVuLmxlbmd0aCkgPyBmb3VuZCA6IC0xOworCQlyZXR1cm4gZm91bmQ7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlYWRBaGVhZEhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVhZEFoZWFkSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdkMWEyMwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlYWRBaGVhZEhlbHBlci5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIENyZWF0ZWQgb24gQXByIDIsIDIwMDMKKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7CisKKy8qKgorICogQGF1dGhvciBzY2hhY2hlcgorICovCitwdWJsaWMgY2xhc3MgUmVhZEFoZWFkSGVscGVyIHsKKworCXByb3RlY3RlZCBTdHJpbmcgcGFyZW50RE9NTmFtZTsKKwlwcm90ZWN0ZWQgU3RyaW5nW10gdmFsdWVzOworCXByb3RlY3RlZCBTdHJpbmcgY2hpbGRET01OYW1lOworCisJcHVibGljIFJlYWRBaGVhZEhlbHBlcihTdHJpbmcgcGFyZW50RE9NTmFtZSwgU3RyaW5nW10gdmFsdWVzLCBTdHJpbmcgY2hpbGRET01OYW1lKSB7CisJCXN1cGVyKCk7CisJCXRoaXMucGFyZW50RE9NTmFtZSA9IHBhcmVudERPTU5hbWU7CisJCXRoaXMudmFsdWVzID0gdmFsdWVzOworCQl0aGlzLmNoaWxkRE9NTmFtZSA9IGNoaWxkRE9NTmFtZTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIFN0cmluZyBnZXRDaGlsZERPTU5hbWUoKSB7CisJCXJldHVybiBjaGlsZERPTU5hbWU7CisJfQorCisJLyoqCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50RE9NTmFtZSgpIHsKKwkJcmV0dXJuIHBhcmVudERPTU5hbWU7CisJfQorCisJLyoqCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CisJCXJldHVybiB2YWx1ZXM7CisJfQorCisJLyoqCisJICogQHBhcmFtIHN0cmluZworCSAqLworCXB1YmxpYyB2b2lkIHNldENoaWxkRE9NTmFtZShTdHJpbmcgc3RyaW5nKSB7CisJCWNoaWxkRE9NTmFtZSA9IHN0cmluZzsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gc3RyaW5nCisJICovCisJcHVibGljIHZvaWQgc2V0UGFyZW50RE9NTmFtZShTdHJpbmcgc3RyaW5nKSB7CisJCXBhcmVudERPTU5hbWUgPSBzdHJpbmc7CisJfQorCisJLyoqCisJICogQHBhcmFtIHN0cmluZ3MKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZXMoU3RyaW5nW10gc3RyaW5ncykgeworCQl2YWx1ZXMgPSBzdHJpbmdzOworCX0KKworCisJcHVibGljIGJvb2xlYW4gbm9kZVZhbHVlSXNSZWFkQWhlYWROYW1lKFN0cmluZyBub2RlTmFtZSkgeworCisJCXJldHVybiAoY2hpbGRET01OYW1lICE9IG51bGwpID8gY2hpbGRET01OYW1lLmVxdWFscyhub2RlTmFtZSkgOiBmYWxzZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBub2RlTmFtZUlzUmVhZEFoZWFkTmFtZShTdHJpbmcgbm9kZU5hbWUpIHsKKwkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChub2RlTmFtZS5lcXVhbHModmFsdWVzW2ldKSkgeworCQkJCXJlc3VsdCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZWZlcmVuY2VkUmVzb3VyY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlZmVyZW5jZWRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZmFmMmIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZWZlcmVuY2VkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOworCisKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKKworcHVibGljIGludGVyZmFjZSBSZWZlcmVuY2VkUmVzb3VyY2UgZXh0ZW5kcyBSZXNvdXJjZSwgQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlIHsKKwkvL1RPRE8gLSByZW5hbWUgcGFja2FnZWQKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURURfRVJST1JfTVNHID0gIlRoaXMgcmVzb3VyY2UgaGFzIGJlZW4gZGVsZXRlZCBhbmQgY2FuIG5vIGxvbmdlciBiZSB1c2VkLiI7IC8vJE5PTi1OTFMtMSQKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU09VUkNFX1dBU19TQVZFRCA9IDYwMTsKKwkKKwkvKioKKwkgKiBBIGZsYWcgdXNlZCB0byBpbmRpY2F0ZSBhIFJlZmVyZW5jZWRSZXNvdXJjZSBpcyBhYm91dAorCSAqIHRvIHNhdmUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTT1VSQ0VfQUJPVVRfVE9fU0FWRSA9IDYwMjsKKwkKKwkvKioKKwkgKiBBIGZsYWcgdXNlZCB0byBpbmRpY2F0ZSBhIFJlZmVyZW5jZWRSZXNvdXJjZSBoYXMgZmFpbGVkCisJICogdG8gc2F2ZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNPVVJDRV9TQVZFX0ZBSUxFRCA9IDYwMzsKKworCS8qKgorCSAqIEFjY2VzcyB0aGlzIHJlc291cmNlIGZvciByZWFkIG9ubHkuIFRoaXMgY2FsbCBpbmNyZW1lbnRzIHRoZSB1c2UgcmVhZCBjb3VudCBvZiB0aGlzIHJlc291cmNlLgorCSAqIENsaWVudHMgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgYmVmb3JlIHRoZXkgdXNlIHRoZSByZXNvdXJjZS4gVGhleSBzaG91bGQgY2FsbAorCSAqIHJlbGVhc2VGcm9tUmVhZCgpIGFmdGVyIHRoZXkgYXJlIGRvbmUgbW9kaWZ5aW5nIHRoaXMgcmVzb3VyY2UuCisJICovCisJdm9pZCBhY2Nlc3NGb3JSZWFkKCk7CisKKwkvKioKKwkgKiBBY2Nlc3MgdGhpcyByZXNvdXJjZSBmb3Igd3JpdGUgb25seS4gVGhpcyBjYWxsIGluY3JlbWVudHMgdGhlIHVzZSB3cml0ZSBjb3VudCBvZiB0aGlzCisJICogcmVzb3VyY2UuIENsaWVudHMgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgYmVmb3JlIHRoZXkgbW9kaWZ5IHRoZSByZXNvdXJjZS4gVGhleSBzaG91bGQgY2FsbAorCSAqIHJlbGVhc2VGcm9tV3JpdGUoKSBhZnRlciB0aGV5IGFyZSBkb25lIG1vZGlmeWluZyB0aGlzIHJlc291cmNlLgorCSAqLworCXZvaWQgYWNjZXNzRm9yV3JpdGUoKTsKKworCS8qKgorCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgcmVzb3VyY2UgaGFzIGp1c3QgYmVlbiBsb2FkZWQgYW5kIG5vdCB5ZXQgYWNjZXNzZWQgZm9yIHJlYWQgb3Igd3JpdGUuCisJICovCisJYm9vbGVhbiBpc05ldygpOworCisJLyoqCisJICogUmV0dXJuIHRydWUgaWYgdGhpcyByZXNvdXJjZSBkb2VzIG5vdCBoYXZlIGFueSB3cml0ZSByZWZlcmVuY2VzLgorCSAqLworCWJvb2xlYW4gaXNSZWFkT25seSgpOworCisJLyoqCisJICogUmV0dXJuIHRydWUgaWYgdGhpcyByZXNvdXJjZSBpcyBzaGFyZWQgZm9yIHJlYWQgb3Igd3JpdGUgYnkgbW9yZSB0aGFuIG9uZSBhY2Nlc3Nvci4KKwkgKi8KKwlib29sZWFuIGlzU2hhcmVkKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHJlc291cmNlIGlzIHNoYXJlZCBmb3Igd3JpdGUgYnkgbW9yZSB0aGFuIG9uZSBhY2Nlc3Nvci4KKwkgKi8KKwlib29sZWFuIGlzU2hhcmVkRm9yV3JpdGUoKTsKKworCS8qKgorCSAqIFJlbGVhc2UgcmVhZCB0aGUgYWNjZXNzIHRvIHRoaXMgcmVzb3VyY2UuIFRoaXMgY2FsbCBkZWNyZW1lbnRzIHRoZSB1c2UgY291bnQgb2YgdGhpcyByZXNvdXJjZQorCSAqIGFuZCB3aWxsIHJlbW92ZSB0aGUgcmVzb3VyY2UgZnJvbSBpdHMgcmVzb3VyY2Ugc2V0IGlmIHRoZSB1c2UgY291bnQgZ29lcyB0byAwLiBDbGllbnRzIHNob3VsZAorCSAqIGNhbGwgdGhpcyBtZXRob2Qgd2hlbiB0aGV5IGFyZSBkb25lIGFjY2Vzc2luZyB0aGUgcmVzb3VyY2UgYW5kIG9ubHkgYWZ0ZXIgdGhleSBoYXZlIGNhbGxlZAorCSAqIGFjY2Vzc0ZvclJlYWQoKSB0byBvYnRhaW4gYWNjZXNzLgorCSAqLworCXZvaWQgcmVsZWFzZUZyb21SZWFkKCk7CisKKwkvKioKKwkgKiBSZWxlYXNlIHdyaXRlIHRoZSBhY2Nlc3MgdG8gdGhpcyByZXNvdXJjZS4gVGhpcyBjYWxsIGRlY3JlbWVudHMgdGhlIHdyaXRlIGNvdW50IG9mIHRoaXMKKwkgKiByZXNvdXJjZSBhbmQgd2lsbCByZW1vdmUgdGhlIHJlc291cmNlIGZyb20gaXRzIHJlc291cmNlIHNldCBpZiB0aGUgdXNlIGNvdW50IGdvZXMgdG8gMC4KKwkgKiBDbGllbnRzIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIHdoZW4gdGhleSBhcmUgZG9uZSBhY2Nlc3NpbmcgdGhlIHJlc291cmNlIGFuZCBvbmx5IGFmdGVyIHRoZXkKKwkgKiBoYXZlIGNhbGxlZCBhY2Nlc3NGb3JXcml0ZSgpIHRvIG9idGFpbiBhY2Nlc3MuCisJICovCisJdm9pZCByZWxlYXNlRnJvbVdyaXRlKCk7CisKKwkvKioKKwkgKiBTYXZlcyB0aGlzIHJlc291cmNlIG9ubHkgaWYgdGhlIHdyaXRlIGNvdW50IGlzIGVxdWFsIHRvIDEuCisJICovCisJdm9pZCBzYXZlSWZOZWNlc3NhcnkoKSB0aHJvd3MgRXhjZXB0aW9uOworCisJLyoqCisJICogUmV0dXJuIHRydWUgaWYgdGhpcyByZXNvdXJjZSBpcyBkaXJ0eSBhbmQgaXMgbm90IHNoYXJlZCBmb3Igd3JpdGUuCisJICovCisJYm9vbGVhbiBuZWVkc1RvU2F2ZSgpOworCisKKworCS8qKgorCSAqIFNldCB3aGV0aGVyIHdlIHNob3VsZCBhbGxvdyBhIHJlZnJlc2ggdG8gdGFrZSBwbGFjZSBldmVuIHdoZW4gdGhpcyByZXNvdXJjZSBpcyBkaXJ0eS4KKwkgKiAKKwkgKiBAcGFyYW0gYgorCSAqLworCXZvaWQgc2V0Rm9yY2VSZWZyZXNoKGJvb2xlYW4gYik7CisKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB3ZSBzaG91bGQgYWxsb3cgYSByZWZyZXNoIHRvIHRha2UgcGxhY2UgZXZlbiB3aGVuIHRoaXMgcmVzb3VyY2UgaXMgZGlydHkuCisJICovCisJYm9vbGVhbiBzaG91bGRGb3JjZVJlZnJlc2goKTsKKworCWJvb2xlYW4gd2FzUmV2ZXJ0ZWQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBvcGVuIHJlYWQgYWNjZXNzZXMgb24gdGhpcyByZXNvdXJjZQorCSAqIAorCSAqIEByZXR1cm4KKwkgKi8KKwlpbnQgZ2V0UmVhZENvdW50KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygb3BlbiB3cml0ZSBhY2Nlc3NlcyBvbiB0aGlzIHJlc291cmNlCisJICogCisJICogQHJldHVybgorCSAqLworCWludCBnZXRXcml0ZUNvdW50KCk7CisKKwkvKioKKwkgKiBJZiB0aGUgcmVzb3VyY2UgaXMgbm8gbG9uZ2VyIGJlaW5nIGFjY2Vzc2VkLCB0aGVuIHJlbW92ZSBpdCBmcm9tIHRoZSByZXNvdXJjZSBzZXQuCisJICovCisJdm9pZCB1bmxvYWRJZk5lY2Vzc2FyeSgpOworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVmZXJlbmNlZFhNSUZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZWZlcmVuY2VkWE1JRmFjdG9yeUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODkxYzJjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVmZXJlbmNlZFhNSUZhY3RvcnlJbXBsLmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKKyAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7CisKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUZhY3RvcnlJbXBsOworCitwdWJsaWMgY2xhc3MgUmVmZXJlbmNlZFhNSUZhY3RvcnlJbXBsIGV4dGVuZHMgUmVzb3VyY2VGYWN0b3J5SW1wbCB7CisKKwlwcm90ZWN0ZWQgc3RhdGljIExpc3QgZ2xvYmFsQWRhcHRlckZhY3RvcmllczsKKwlwcm90ZWN0ZWQgTGlzdCBsb2NhbEFkYXB0ZXJGYWN0b3JpZXM7CisKKwkvKioKKwkgKiBSZWZlcmVuY2VkWE1JRmFjdG9yeUltcGwgY29uc3RydWN0b3IgY29tbWVudC4KKwkgKi8KKwlwdWJsaWMgUmVmZXJlbmNlZFhNSUZhY3RvcnlJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIFRoaXMgaXMgdGhlIG1ldGhvZCB0aGF0IHN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRvIGFjdHVhbGx5IGluc3RhbnRpYXRlIGEgbmV3IFJlc291cmNlCisJICogCisJICogQHBhcmFtIHVyaQorCSAqIEByZXR1cm4KKwkgKi8KKwlwcm90ZWN0ZWQgUmVzb3VyY2UgZG9DcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7CisJCXJldHVybiBuZXcgUmVmZXJlbmNlZFhNSVJlc291cmNlSW1wbCh1cmkpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VGYWN0b3J5SW1wbCNjcmVhdGVSZXNvdXJjZShVUkkpCisJICovCisJcHVibGljIGZpbmFsIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKKwkJUmVzb3VyY2UgcmVzID0gZG9DcmVhdGVSZXNvdXJjZSh1cmkpOworCQlhZGFwdE5ldyhyZXMpOworCQlyZXR1cm4gcmVzOworCX0KKworCXByb3RlY3RlZCB2b2lkIGFkYXB0TmV3KFJlc291cmNlIHJlcykgeworCQlpZiAoZ2xvYmFsQWRhcHRlckZhY3RvcmllcyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGdsb2JhbEFkYXB0ZXJGYWN0b3JpZXMuc2l6ZSgpOyBpKyspIHsKKwkJCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gKEFkYXB0ZXJGYWN0b3J5KSBnbG9iYWxBZGFwdGVyRmFjdG9yaWVzLmdldChpKTsKKwkJCQlmYWN0b3J5LmFkYXB0QWxsTmV3KHJlcyk7CisJCQl9CisJCX0KKwkJaWYgKGxvY2FsQWRhcHRlckZhY3RvcmllcyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2FsQWRhcHRlckZhY3Rvcmllcy5zaXplKCk7IGkrKykgeworCQkJCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSAoQWRhcHRlckZhY3RvcnkpIGxvY2FsQWRhcHRlckZhY3Rvcmllcy5nZXQoaSk7CisJCQkJZmFjdG9yeS5hZGFwdEFsbE5ldyhyZXMpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhlIGxvY2FsIGFkYXB0ZXIgZmFjdG9yeSBpcyBhbiBhZGFwdGVyIGZhY3RvcnkgdGhhdCB5b3UgdXNlIHRvIG9ubHkgYWRhcHQgdGhlIHJlc291cmNlCisJICogc3BlY2lmaWMgdG8gdGhlIFJlc291cmNlRmFjdG9yeSBpbnN0YW5jZS4KKwkgKiAKKwkgKiBAcGFyYW0gZmFjdG9yeQorCSAqLworCXB1YmxpYyB2b2lkIGFkZExvY2FsQWRhcHRlckZhY3RvcnkoQWRhcHRlckZhY3RvcnkgZmFjdG9yeSkgeworCQlpZiAobG9jYWxBZGFwdGVyRmFjdG9yaWVzID09IG51bGwpCisJCQlsb2NhbEFkYXB0ZXJGYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KDMpOworCQlsb2NhbEFkYXB0ZXJGYWN0b3JpZXMuYWRkKGZhY3RvcnkpOworCX0KKworCXB1YmxpYyB2b2lkIHJlbW92ZUxvY2FsQWRhcHRlckZhY3RvcnkoQWRhcHRlckZhY3RvcnkgZmFjdG9yeSkgeworCQlpZiAobG9jYWxBZGFwdGVyRmFjdG9yaWVzICE9IG51bGwpCisJCQlsb2NhbEFkYXB0ZXJGYWN0b3JpZXMucmVtb3ZlKGZhY3RvcnkpOworCX0KKworCS8qKgorCSAqIEEgZ2xvYmFsIGFkYXB0ZXIgZmFjdG9yeSB3aWxsIGJlIHVzZWQgdG8gYWRhcHQgYW55IHJlc291cmNlIGNyZWF0ZWQgYnkgYW55IFJlc291cmNlRmFjdG9yeQorCSAqIGluc3RhbmNlLgorCSAqIAorCSAqIEBwYXJhbSBmYWN0b3J5CisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGFkZEdsb2JhbEFkYXB0ZXJGYWN0b3J5KEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpIHsKKwkJaWYgKGdsb2JhbEFkYXB0ZXJGYWN0b3JpZXMgPT0gbnVsbCkKKwkJCWdsb2JhbEFkYXB0ZXJGYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KDMpOworCQlnbG9iYWxBZGFwdGVyRmFjdG9yaWVzLmFkZChmYWN0b3J5KTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlR2xvYmFsQWRhcHRlckZhY3RvcnkoQWRhcHRlckZhY3RvcnkgZmFjdG9yeSkgeworCQlpZiAoZ2xvYmFsQWRhcHRlckZhY3RvcmllcyAhPSBudWxsKQorCQkJZ2xvYmFsQWRhcHRlckZhY3Rvcmllcy5yZW1vdmUoZmFjdG9yeSk7CisJfQorfQorCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZWZlcmVuY2VkWE1JUmVzb3VyY2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZWZlcmVuY2VkWE1JUmVzb3VyY2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRiOWE1YwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlZmVyZW5jZWRYTUlSZXNvdXJjZUltcGwuamF2YQpAQCAtMCwwICsxLDQxNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLklEVXRpbDsKKworcHVibGljIGNsYXNzIFJlZmVyZW5jZWRYTUlSZXNvdXJjZUltcGwgZXh0ZW5kcyBDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2VJbXBsIGltcGxlbWVudHMgUmVmZXJlbmNlZFJlc291cmNlIHsKKwkvL1RPRE8gQWRkIHRvU3RyaW5nIGhvb2sKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9fU1RSSU5HID0gIlJlZmVyZW5jZWRYTUlSZXNvdXJjZSwgZmlsZSA9ICI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBRF9DT1VOVF9UT19TVFJJTkcgPSAiIFI9ICI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1JJVEVfQ09VTlRfVE9fU1RSSU5HID0gIiBXPSAiOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIGludCByZWFkUmVmZXJlbmNlQ291bnQgPSAxOworCXByaXZhdGUgaW50IGVkaXRSZWZlcmVuY2VDb3VudCA9IDA7CisJcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXcgPSB0cnVlOworCXByb3RlY3RlZCBib29sZWFuIGZvcmNlUmVmcmVzaDsKKwkKKwkgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRVN5bmNocm9uaXplZEFkYXB0ZXJMaXN0IGV4dGVuZHMgRUFkYXB0ZXJMaXN0CisJICB7CisKKwkgICAgcHVibGljIEVTeW5jaHJvbml6ZWRBZGFwdGVyTGlzdChOb3RpZmllciBub3RpZmllcikgeworCQkJc3VwZXIobm90aWZpZXIpOworCQl9CisKKwkJcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGFkZChPYmplY3Qgb2JqZWN0KQorCSAgICB7CisJICAgIHJldHVybiBzdXBlci5hZGQob2JqZWN0KTsKKwkgICAgfQorCisJICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGQoaW50IGluZGV4LCBPYmplY3Qgb2JqZWN0KQorCSAgICB7CisJICAgIHN1cGVyLmFkZChpbmRleCwgb2JqZWN0KTsKKwkgICAgfQorCisJICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKQorCSAgICB7CisJICAgIHJldHVybiBzdXBlci5hZGRBbGwoY29sbGVjdGlvbik7CisJICAgIH0KKworCSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvYmplY3QpCisJICAgIHsKKwkgICAgcmV0dXJuIHN1cGVyLnJlbW92ZShvYmplY3QpOworCSAgICB9CisKKwkgICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgcmVtb3ZlKGludCBpbmRleCkKKwkgICAgeworCSAgICByZXR1cm4gc3VwZXIucmVtb3ZlKGluZGV4KTsKKwkgICAgfQorCisJICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKQorCSAgICB7CisJICAgIHJldHVybiBzdXBlci5yZW1vdmVBbGwoY29sbGVjdGlvbik7CisJICAgIH0KKworCSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xlYXIoKQorCSAgICB7CisJICAgICBzdXBlci5jbGVhcigpOworCSAgICB9CisKKworCSAgICBwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBzZXQoaW50IGluZGV4LCBPYmplY3Qgb2JqZWN0KQorCSAgICB7CisJICAgIHJldHVybiBzdXBlci5zZXQoaW5kZXgsIG9iamVjdCk7CisJICAgIH0KKworCSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbW92ZShpbnQgbmV3UG9zaXRpb24sIE9iamVjdCBvYmplY3QpCisJICAgIHsKKwkgICAgc3VwZXIubW92ZShuZXdQb3NpdGlvbiwgb2JqZWN0KTsKKwkgICAgfQorCisJICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IG1vdmUoaW50IG5ld1Bvc2l0aW9uLCBpbnQgb2xkUG9zaXRpb24pCisJICAgIHsKKwkgICAgcmV0dXJuIHN1cGVyLm1vdmUobmV3UG9zaXRpb24sIG9sZFBvc2l0aW9uKTsKKwkgICAgfQorCSAgfQorCisJIAorCS8qKgorCSAqIFJlZmVyZW5jYWJsZVhNSVJlc291cmNlSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqLworCXB1YmxpYyBSZWZlcmVuY2VkWE1JUmVzb3VyY2VJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBSZWZlcmVuY2VkWE1JUmVzb3VyY2VJbXBsKFVSSSB1cmkpIHsKKwkJc3VwZXIodXJpKTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlZmVyZW5jZWRSZXNvdXJjZSNnZXRSZWFkQ291bnQoKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0UmVhZENvdW50KCkgeworCQlyZXR1cm4gcmVhZFJlZmVyZW5jZUNvdW50OworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVmZXJlbmNlZFJlc291cmNlI2dldFdyaXRlQ291bnQoKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0V3JpdGVDb3VudCgpIHsKKwkJcmV0dXJuIGVkaXRSZWZlcmVuY2VDb3VudDsKKwl9CisKKworCisJLyoKKwkgKiBAc2VlIFJlZmVyZW5jZWRSZXNvdXJjZSNhY2Nlc3NGb3JSZWFkCisJICovCisJcHVibGljIHZvaWQgYWNjZXNzRm9yUmVhZCgpIHsKKwkJY2hlY2tEZWxldGVkKCk7CisJCWlmICghaXNOZXcoKSkKKwkJCXJlYWRSZWZlcmVuY2VDb3VudCsrOworCQlpc05ldyA9IGZhbHNlOworCX0KKworCS8qCisJICogQHNlZSBSZWZlcmVuY2VkUmVzb3VyY2UjYWNjZXNzRm9yV3JpdGUKKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2Nlc3NGb3JXcml0ZSgpIHsKKwkJY2hlY2tEZWxldGVkKCk7CisJCWVkaXRSZWZlcmVuY2VDb3VudCsrOworCQlpZiAoaXNOZXcpCisJCQlyZWxlYXNlRnJvbVJlYWQoKTsKKwkJaXNOZXcgPSBmYWxzZTsKKwkJaWYgKCFpc1RyYWNraW5nTW9kaWZpY2F0aW9uKCkpCisJCQlzZXRUcmFja2luZ01vZGlmaWNhdGlvbih0cnVlKTsKKwl9CisKKwkvKgorCSAqIENoZWNrIGlmIHRoaXMgcmVzb3VyY2UgaGFzIGJlZW4gcmVtb3ZlZCBhbmQgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGl0IGRvZXMgbm90IGhhdmUgYQorCSAqIFJlc291cmNlU2V0LgorCSAqLworCXByb3RlY3RlZCB2b2lkIGNoZWNrRGVsZXRlZCgpIHsKKwkJaWYgKGdldFJlc291cmNlU2V0KCkgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKERFTEVURURfRVJST1JfTVNHKTsKKwl9CisKKwkvKioKKwkgKiAgCisJICovCisJcHVibGljIHZvaWQgY29sbGVjdENvbnRhaW5lZE9iamVjdHMoamF2YS51dGlsLkxpc3QgY29sbGVjdGluZywgRU9iamVjdCBwYXJlbnRPYmplY3QpIHsKKworCQlqYXZhLnV0aWwuSXRlcmF0b3IgY2hpbGRyZW4gPSBwYXJlbnRPYmplY3QuZUNvbnRlbnRzKCkuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGNoaWxkcmVuLmhhc05leHQoKSkgeworCQkJRU9iamVjdCBjaGlsZCA9IChFT2JqZWN0KSBjaGlsZHJlbi5uZXh0KCk7CisJCQljb2xsZWN0aW5nLmFkZChjaGlsZCk7CisJCQljb2xsZWN0Q29udGFpbmVkT2JqZWN0cyhjb2xsZWN0aW5nLCBjaGlsZCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiAgCisJICovCisJcHVibGljIHZvaWQgZW5zdXJlRnVsbElESHlkcmF0aW9uKCkgeworCQlMaXN0IGFsbFJlZk9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCUl0ZXJhdG9yIHJvb3RPYmplY3RzID0gZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOworCQl3aGlsZSAocm9vdE9iamVjdHMuaGFzTmV4dCgpKSB7CisJCQlFT2JqZWN0IGNoaWxkID0gKEVPYmplY3QpIHJvb3RPYmplY3RzLm5leHQoKTsKKwkJCWFsbFJlZk9iamVjdHMuYWRkKGNoaWxkKTsKKwkJCWNvbGxlY3RDb250YWluZWRPYmplY3RzKGFsbFJlZk9iamVjdHMsIGNoaWxkKTsKKwkJfQorCisJCUl0ZXJhdG9yIGl0ZXIgPSBhbGxSZWZPYmplY3RzLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyLmhhc05leHQoKSkKKwkJCUlEVXRpbC5hc3NpZ25JRCgoRU9iamVjdCkgaXRlci5uZXh0KCksIHRoaXMpOworCX0KKworCS8qKgorCSAqIElmIHRoZSByZXNvdXJjZSBpcyBubyBsb25nZXIgYmVpbmcgYWNjZXNzZWQsIHRoZW4gcmVtb3ZlIGl0IGZyb20gdGhlIHJlc291cmNlIHNldC4KKwkgKi8KKwlwdWJsaWMgdm9pZCB1bmxvYWRJZk5lY2Vzc2FyeSgpIHsKKwkJaWYgKChnZXRUb3RhbFJlZmVyZW5jZUNvdW50KCkgPD0gMCkgfHwgKGVkaXRSZWZlcmVuY2VDb3VudCA8PSAwICYmIGlzTW9kaWZpZWQoKSkpCisJCQl1bmxvYWQoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiB3cml0ZSBhY2Nlc3NlcyB0byB0aGlzIHJlc291cmNlLgorCSAqIAorCSAqIEByZXR1cm4gaW50IFRoZSBudW1iZXIgb2YgcmVmZXJlbmNlcy4KKwkgKi8KKwlwcm90ZWN0ZWQgaW50IGdldFRvdGFsUmVmZXJlbmNlQ291bnQoKSB7CisJCXJldHVybiBlZGl0UmVmZXJlbmNlQ291bnQgKyByZWFkUmVmZXJlbmNlQ291bnQ7CisJfQorCisJLyoKKwkgKiBAc2VlIFJlZmVyZW5jZWRSZXNvdXJjZSNpc05ldworCSAqLworCXB1YmxpYyBib29sZWFuIGlzTmV3KCkgeworCQlyZXR1cm4gaXNOZXc7CisJfQorCisJLyoKKwkgKiBAc2VlIFJlZmVyZW5jZWRSZXNvdXJjZSNpc1JlYWRPbmx5CisJICovCisJcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKKwkJcmV0dXJuIGVkaXRSZWZlcmVuY2VDb3VudCA8PSAwOworCX0KKworCS8qCisJICogQHNlZSBSZWZlcmVuY2VkUmVzb3VyY2UjaXNTaGFyZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZCgpIHsKKwkJcmV0dXJuIGdldFRvdGFsUmVmZXJlbmNlQ291bnQoKSA+IDE7CisJfQorCisJLyoKKwkgKiBAc2VlIFJlZmVyZW5jZWRSZXNvdXJjZSNpc1NoYXJlZEZvcldyaXRlCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTaGFyZWRGb3JXcml0ZSgpIHsKKwkJcmV0dXJuIGVkaXRSZWZlcmVuY2VDb3VudCA+IDE7CisJfQorCisJLyoqCisJICogQHNlZSBSZWZlcmVuY2VkUmVzb3VyY2UjcHJlRGVsZXRlCisJICovCisJcHVibGljIHZvaWQgcHJlRGVsZXRlKCkgeworCX0KKworCS8qCisJICogQHNlZSBSZWZlcmVuY2VkUmVzb3VyY2UjcmVsZWFzZUZyb21SZWFkCisJICovCisJcHVibGljIHZvaWQgcmVsZWFzZUZyb21SZWFkKCkgeworCQlyZWFkUmVmZXJlbmNlQ291bnQtLTsKKwkJaWYgKHJlYWRSZWZlcmVuY2VDb3VudCA8IDApCisJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUmVhZCByZWZlcmVuY2UgY291bnQgZXJyb3I6ICAiICsgdGhpcy50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAorCQl1bmxvYWRJZk5lY2Vzc2FyeSgpOworCX0KKworCS8qCisJICogQHNlZSBSZWZlcmVuY2VkUmVzb3VyY2UjcmVsZWFzZUZyb21Xcml0ZQorCSAqLworCXB1YmxpYyB2b2lkIHJlbGVhc2VGcm9tV3JpdGUoKSB7CisJCWVkaXRSZWZlcmVuY2VDb3VudC0tOworCQlpZiAoZWRpdFJlZmVyZW5jZUNvdW50IDwgMCkKKwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJXcml0ZSByZWZlcmVuY2UgY291bnQgZXJyb3I6ICAiICsgdGhpcy50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAorCQl1bmxvYWRJZk5lY2Vzc2FyeSgpOworCX0KKworCS8qCisJICogQHNlZSBSZWZlcmVuY2VkUmVzb3VyY2Ujc2F2ZUlmTmVjZXNzYXJ5CisJICovCisJcHVibGljIHZvaWQgc2F2ZUlmTmVjZXNzYXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWlmICghaXNTaGFyZWRGb3JXcml0ZSgpKSAvLyBjYWxsZXIgaXMgdGhlIG9ubHkgcmVmZXJlbmNlcgorCQkJc2F2ZShDb2xsZWN0aW9ucy5FTVBUWV9NQVApOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBUT19TVFJJTkcgKyBnZXRVUkkoKS50b1N0cmluZygpICsgUkVBRF9DT1VOVF9UT19TVFJJTkcgKyBuZXcgSW50ZWdlcihyZWFkUmVmZXJlbmNlQ291bnQpICsgV1JJVEVfQ09VTlRfVE9fU1RSSU5HICsgbmV3IEludGVnZXIoZWRpdFJlZmVyZW5jZUNvdW50KTsKKwl9CisKKwkvKgorCSAqIEBzZWUgUmVmZXJlbmNlZFJlc291cmNlI25lZWRzVG9TYXZlKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBuZWVkc1RvU2F2ZSgpIHsKKwkJcmV0dXJuIGlzTW9kaWZpZWQoKSAmJiAhaXNTaGFyZWRGb3JXcml0ZSgpOworCX0KKworCisJLyoqCisJICogQHNlZSBSZWZlcmVuY2VkUmVzb3VyY2Ujc2V0Rm9yY2VSZWZyZXNoKGJvb2xlYW4pCisJICovCisJcHVibGljIHZvaWQgc2V0Rm9yY2VSZWZyZXNoKGJvb2xlYW4gYikgeworCQlmb3JjZVJlZnJlc2ggPSBiOworCX0KKworCS8qKgorCSAqIEBzZWUgUmVmZXJlbmNlZFJlc291cmNlI3Nob3VsZEZvcmNlUmVmcmVzaCgpCisJICovCisJcHVibGljIGJvb2xlYW4gc2hvdWxkRm9yY2VSZWZyZXNoKCkgeworCQlyZXR1cm4gZm9yY2VSZWZyZXNoOworCX0KKworCXByb3RlY3RlZCB2b2lkIGJhc2ljRG9Mb2FkKElucHV0U3RyZWFtIGFyZzAsIE1hcCBhcmcxKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlib29sZWFuIGlzVHJhY2tpbmdNb2RzID0gaXNUcmFja2luZ01vZGlmaWNhdGlvbigpOworCQl0cnkgeworCQkJaWYgKGlzVHJhY2tpbmdNb2RzKQorCQkJCXNldFRyYWNraW5nTW9kaWZpY2F0aW9uKGZhbHNlKTsKKwkJCXN1cGVyLmJhc2ljRG9Mb2FkKGFyZzAsIGFyZzEpOworCQl9IGZpbmFsbHkgeworCQkJaWYgKGlzVHJhY2tpbmdNb2RzKQorCQkJCXNldFRyYWNraW5nTW9kaWZpY2F0aW9uKHRydWUpOworCQl9CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VJbXBsI2RvVW5sb2FkKCkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBkb1VubG9hZCgpIHsKKwkJCisJCXRyeSB7CisJCQkvLyBVc2luZyBsb2FkIGxvY2sgdG8gZW5zdXJlIG5vIG90aGVyIHRocmVhZHMgd2lsbCBhdHRlbXB0IGEgbG9hZCBkdXJpbmcgdGhlIHVubG9hZCBwcm9jZXNzCisJCQlhZGRTeW5jaHJvbml6YXRpb25Mb2FkaW5nQWRhcHRlcigpOworCQkJd2FpdEZvclJlc291cmNlVG9Mb2FkSWZOZWNlc3NhcnkoKTsKKwkJCQorCQkJaWYgKGlzVHJhY2tpbmdNb2RpZmljYXRpb24oKSAmJiBlZGl0UmVmZXJlbmNlQ291bnQgPCAxKSAvL2RvIG5vdCB0dXJuIG9mZiBtb2RpZmljYXRpb24gaWYKKwkJCQkvLyB3ZSBzdGlsbCBoYXZlIGEgd3JpdGUgY291bnQKKwkJCQlzZXRUcmFja2luZ01vZGlmaWNhdGlvbihmYWxzZSk7CisJCQlzdXBlci5kb1VubG9hZCgpOworCQkJc2V0Rm9yY2VSZWZyZXNoKGZhbHNlKTsKKwkJCXNldE1vZGlmaWVkKGZhbHNlKTsgLy9kY2IgLSB0aGlzIGlzIHJlcXVpcmVkIHRvIGVuc3VyZSB0aGF0IHJlc291cmNlcyB3aXRob3V0IGZpbGVzIGFyZQorCQkJLy8gbWFya2VkIGFzIG5vdCBtb2RpZmllZC4KKwkJCWlmIChyZWFkUmVmZXJlbmNlQ291bnQgPT0gMCAmJiBlZGl0UmVmZXJlbmNlQ291bnQgPT0gMCAmJiBnZXRSZXNvdXJjZVNldCgpICE9IG51bGwpIHsKKwkJCQlnZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLnJlbW92ZSh0aGlzKTsKKwkJCX0KKwkJCisJCX0gZmluYWxseSB7CisJCQkvL1JlbW92aW5nIHRoZSBsb2FkIGxvY2sKKwkJCXJlbW92ZUxvYWRpbmdTeW5jaHJvbml6YXRpb25BZGFwdGVyKCk7CisJCX0KKwkJCQorCX0KKworCisJLyoqCisJICogVGhlIHJlc291cmNlIGhhcyBiZWVuIHVubG9hZGVkLCBhbmQgdGhlcmUgYXJlIG5vIHJlZmVyZW5jZXMuIFRyZWF0IHRoZSByZXNvdXJjZSBsaWtlIGEgbmV3CisJICogUmVzb3VyY2UKKwkgKi8KKwkvLyBuZXZlciB1c2VkCisvLwlwcml2YXRlIHZvaWQgcmVzZXRBc05ldygpIHsKKy8vCQlyZWFkUmVmZXJlbmNlQ291bnQgPSAxOworLy8JCWlzTmV3ID0gdHJ1ZTsKKy8vCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlI3NhdmUoT2JqZWN0KQorCSAqLworCXB1YmxpYyB2b2lkIHNhdmUoTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCW5vdGlmeUFib3V0VG9TYXZlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdXBlci5zYXZlKG9wdGlvbnMpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbm90aWZ5U2F2ZUZhaWxlZCgpOworICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB0aHJvdyAoSU9FeGNlcHRpb24pIGU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigpLndyaXRlKGUpOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVNhdmVkKCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgbm90aWZ5U2F2ZWQoKSB7CisJCW5vdGlmeVNhdmVFdmVudChSRVNPVVJDRV9XQVNfU0FWRUQpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBub3RpZnlBYm91dFRvU2F2ZSgpIHsKKyAgICAgICAgbm90aWZ5U2F2ZUV2ZW50KFJFU09VUkNFX0FCT1VUX1RPX1NBVkUpOworICAgIH0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBub3RpZnlTYXZlRmFpbGVkKCkgeworICAgICAgICBub3RpZnlTYXZlRXZlbnQoUkVTT1VSQ0VfU0FWRV9GQUlMRUQpOworICAgIH0KKwkKKwlwcml2YXRlIHZvaWQgbm90aWZ5U2F2ZUV2ZW50KGludCBldmVudFR5cGUpIHsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCSAgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiA9CisJCQluZXcgTm90aWZpY2F0aW9uSW1wbChldmVudFR5cGUsIHRoaXMsIHRoaXMpCisJCQl7CisJCQkgIHB1YmxpYyBPYmplY3QgZ2V0Tm90aWZpZXIoKQorCQkJICB7CisJCQkJcmV0dXJuIFJlZmVyZW5jZWRYTUlSZXNvdXJjZUltcGwudGhpczsKKwkJCSAgfQorCQkJICBwdWJsaWMgaW50IGdldEZlYXR1cmVJRChDbGFzcyBleHBlY3RlZENsYXNzKQorCQkJICB7CisJCQkJcmV0dXJuIGV2ZW50VHlwZTsKKwkJCSAgfQorCQkJfTsKKwkJCWVOb3RpZnkobm90aWZpY2F0aW9uKTsKKwkJfQorCX0JCisKKwkvKioKKwkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZi53b3JrYmVuY2guUmVmZXJlbmNlZFJlc291cmNlI3dhc1JldmVydGVkKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB3YXNSZXZlcnRlZCgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwlwdWJsaWMgRUxpc3QgZUFkYXB0ZXJzKCkKKwkgIHsKKwkgICAgaWYgKGVBZGFwdGVycyA9PSBudWxsKQorCSAgICB7CisJICAgICAgZUFkYXB0ZXJzID0gIG5ldyBFU3luY2hyb25pemVkQWRhcHRlckxpc3QodGhpcyk7CisJICAgIH0KKwkgICAgcmV0dXJuIGVBZGFwdGVyczsKKwkgIH0KKworCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZW5kZXJlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVuZGVyZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTljMzdkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVuZGVyZXIuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEludGVyZmFjZSB0aGF0IGRlZmluZXMgdGhlIGFwaSBmb3IgcmVuZGVyaW5nIGFuIEVNRiBvYmplY3QgdG8gWE1MIGFuZCB2aWNlIHZlcnNhCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUmVuZGVyZXIgeworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYUF9TQ0hFTUFfTEFOR1VBR0UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4cC9wcm9wZXJ0aWVzL3NjaGVtYUxhbmd1YWdlIjsgLy8kTk9OLU5MUy0xJAorCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVzNDX1hNTF9TQ0hFTUEgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOyAvLyROT04tTkxTLTEkCisKKwl2b2lkIHNldFJlc291cmNlKFRyYW5zbGF0b3JSZXNvdXJjZSBhUmVzb3VyY2UpOworCisJVHJhbnNsYXRvclJlc291cmNlIGdldFJlc291cmNlKCk7CisKKwl2b2lkIGRvTG9hZChJbnB1dFN0cmVhbSBpbiwgTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworCXZvaWQgZG9TYXZlKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKwlib29sZWFuIHVzZVN0cmVhbXNGb3JJTygpOworCisJdm9pZCBwcmVwYXJlVG9BZGRDb250ZW50cygpOworCisJaW50IGdldFZlcnNpb25JRCgpOworCisJYm9vbGVhbiBpc01vZGlmaWVkKCk7CisKKwl2b2lkIGFjY2Vzc0ZvcldyaXRlKCk7CisKKwl2b2lkIGFjY2Vzc0ZvclJlYWQoKTsKKworCXZvaWQgcmVsZWFzZUZyb21SZWFkKCk7CisKKwl2b2lkIHJlbGVhc2VGcm9tV3JpdGUoKTsKKworCXZvaWQgcHJlRGVsZXRlKCk7CisKKwl2b2lkIHByZVVubG9hZCgpOworCisJYm9vbGVhbiBpc1NoYXJlZCgpOworCisJYm9vbGVhbiBpc1NoYXJlZEZvcldyaXRlKCk7CisKKwl2b2lkIHNldEJhdGNoTW9kZShib29sZWFuIGlzQmF0Y2gpOworCQorCWJvb2xlYW4gaXNCYXRjaE1vZGUoKTsKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlbmRlcmVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVuZGVyZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTljMTMzYwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlbmRlcmVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCisgKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOworCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZW5kZXJlckZhY3RvcnkgeworCisJcHVibGljIGFic3RyYWN0IFJlbmRlcmVyIGNyZWF0ZVJlbmRlcmVyKCk7CisKKwlwcml2YXRlIHN0YXRpYyBSZW5kZXJlckZhY3RvcnkgZGVmYXVsdFJlbmRlcmVyRmFjdG9yeTsKKworCXByaXZhdGUgc3RhdGljIFJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyIGRlZmF1bHRIYW5kbGVyOworCisJcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRpbmcgPSB0cnVlOworCisJLyoqCisJICogSW50ZXJlc3RlZCBwYXJ0aWVzIGNhbiB1c2UgdGhlCisJICovCisJcHVibGljIGZpbmFsIHN0YXRpYyBOb3RpZmllciBOb3RpZmljYXRpb25FbmdpbmUgPSBOb3RpZmllci5JTlNUQU5DRTsKKworCS8qKgorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFJlbmRlcmVyRmFjdG9yeSBnZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkgeworCQlpZiAoZGVmYXVsdFJlbmRlcmVyRmFjdG9yeSA9PSBudWxsKQorCQkJZGVmYXVsdFJlbmRlcmVyRmFjdG9yeSA9IGdldERlZmF1bHRIYW5kbGVyKCkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpOworCQlyZXR1cm4gZGVmYXVsdFJlbmRlcmVyRmFjdG9yeTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gZmFjdG9yeQorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeSBmYWN0b3J5KSB7CisKKwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIlxuXG4qKipTZXR0aW5nIGZhY3Rvcnk6ICIgKyBmYWN0b3J5KTsKKwkJTm90aWZpY2F0aW9uRW5naW5lLm5vdGlmeUxpc3RlbmVycyhmYWN0b3J5KTsKKwkJZGVmYXVsdFJlbmRlcmVyRmFjdG9yeSA9IGZhY3Rvcnk7CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJSZW5kZXJlckZhY3RvcnkgaW5zdGFuY2U6ICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCXB1YmxpYyBzdGF0aWMgY2xhc3MgTm90aWZpZXIgeworCisJCXByaXZhdGUgc3RhdGljIGZpbmFsIE5vdGlmaWVyIElOU1RBTkNFID0gbmV3IE5vdGlmaWVyKCk7CisKKwkJLy8gdXNlIGEgV2Vha0hhc2hNYXAgZm9yIGEgd2VhayBIYXNoU2V0CisJCXByaXZhdGUgZmluYWwgTWFwIHJlc291cmNlRmFjdG9yeUxpc3RlbmVycyA9IG5ldyBXZWFrSGFzaE1hcCgpOworCisJCXByaXZhdGUgTm90aWZpZXIoKSB7CisJCX0KKworCQlwdWJsaWMgdm9pZCBub3RpZnlMaXN0ZW5lcnMoUmVuZGVyZXJGYWN0b3J5IHJlbmRlcmVyRmFjdG9yeSkgeworCisJCQlmaW5hbCBpbnQgbGVuZ3RoID0gcmVzb3VyY2VGYWN0b3J5TGlzdGVuZXJzLnNpemUoKTsKKwkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJOb3RpZnlpbmcgIiArIGxlbmd0aCArICIgbGlzdGVuZXJzIik7CisKKwkJCWlmIChsZW5ndGggPiAwKSB7CisJCQkJLyoKKwkJCQkgKiBTaW5jZSB0aGUgcmVuZGVyZXIgZmFjdG9yaWVzIGFyZSBzaW5nbGV0b25zLCB0aGlzIHJlZmVyZW5jZSBjaGVjayBzaG91bGQgYWx3YXlzCisJCQkJICogd29yaworCQkJCSAqLworCQkJCWlmIChyZW5kZXJlckZhY3RvcnkgIT0gUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSkgeworCQkJCQlzeW5jaHJvbml6ZWQgKHJlc291cmNlRmFjdG9yeUxpc3RlbmVycykgeworCQkJCQkJZm9yIChJdGVyYXRvciBpID0gcmVzb3VyY2VGYWN0b3J5TGlzdGVuZXJzLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworCQkJCQkJCUxpc3RlbmVyIGxpc3RlbmVyID0gKExpc3RlbmVyKSBpLm5leHQoKTsKKwkJCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiTm90aWZ5aW5nIExpc3RlbmVyOiAiICsgbGlzdGVuZXIpOworCQkJCQkJCWxpc3RlbmVyLnVwZGF0ZVJlbmRlcmVyRmFjdG9yeShyZW5kZXJlckZhY3RvcnkpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoTGlzdGVuZXIgbCkgeworCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkFkZGluZyBsaXN0ZW5lcjogIiArIGwpOworCQkJc3luY2hyb25pemVkIChyZXNvdXJjZUZhY3RvcnlMaXN0ZW5lcnMpIHsKKwkJCQlyZXNvdXJjZUZhY3RvcnlMaXN0ZW5lcnMucHV0KGwsIG51bGwpOworCQkJfQorCQl9CisKKwkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXJUb1JlbW92ZSkgeworCQkJc3luY2hyb25pemVkIChyZXNvdXJjZUZhY3RvcnlMaXN0ZW5lcnMpIHsKKwkJCQlyZXNvdXJjZUZhY3RvcnlMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyVG9SZW1vdmUpOworCQkJfQorCQl9CisKKwl9CisKKwlwdWJsaWMgaW50ZXJmYWNlIExpc3RlbmVyIHsKKwkJdm9pZCB1cGRhdGVSZW5kZXJlckZhY3RvcnkoUmVuZGVyZXJGYWN0b3J5IG5ld1JlbmRlcmVyRmFjdG9yeSk7CisJfQorCisJLyoqCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzVmFsaWRhdGluZygpIHsKKwkJcmV0dXJuIHZhbGlkYXRpbmc7CisJfQorCisJLyoqCisJICogQHBhcmFtIGIKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW5nKGJvb2xlYW4gYikgeworCQl2YWxpZGF0aW5nID0gYjsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIHN0YXRpYyBSZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlciBnZXREZWZhdWx0SGFuZGxlcigpIHsKKwkJaWYgKGRlZmF1bHRIYW5kbGVyID09IG51bGwpCisJCQlkZWZhdWx0SGFuZGxlciA9IEVNRjJET01SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlci5JTlNUQU5DRTsKKwkJcmV0dXJuIGRlZmF1bHRIYW5kbGVyOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBoYW5kbGVyCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHRIYW5kbGVyKFJlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyIGhhbmRsZXIpIHsKKwkJZGVmYXVsdEhhbmRsZXIgPSBoYW5kbGVyOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1JlbmRlcmVyRmFjdG9yeURlZmF1bHRIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NWRmNGYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIENyZWF0ZWQgb24gRGVjIDEsIDIwMDMKKyAqCisgKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCisgKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKKworCisvKioKKyAqIEBhdXRob3Igc2NoYWNoZXIKKyAqIAorICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCisgKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKKyAqLworcHVibGljIGludGVyZmFjZSBSZW5kZXJlckZhY3RvcnlEZWZhdWx0SGFuZGxlciB7CisKKwlSZW5kZXJlckZhY3RvcnkgZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpOworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwODUwZTkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9SZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yLmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yIHsKKwkKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgZGVzY3JpcHRvciBpcyBhcHBsaWNhYmxlIHRvIHRoZSBnaXZlbiBmaWxlVVJJLgorCSAqIAorCSAqIEBwYXJhbSBmaWxlVVJJIFRoZSBVUkkgb2YgdGhlIGZpbGUgdG8gYmUgbG9hZGVkCisJICogQHJldHVybiBUcnVlIGlmIHRoZSBjdXJyZW50IGRlc2NyaXB0b3IgZGVjbGFyZXMgYSByZXNvdXJjZSBmYWN0b3J5IGFwcGxpY2FibGUgdG8gdGhlIGdpdmVuIFVSSS4KKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0VuYWJsZWRGb3IoVVJJIGZpbGVVUkkpOworCQorCS8qKgorCSAqIFRoZSBjb250ZW50VHlwZSBpcyBvbmUgb3B0aW9uYWwgd2F5IHRoYXQgYSBSZXNvdXJjZUZhY3RvcnkKKwkgKiBtaWdodCBhcHBseSB0byBhIFVSSS4gQ2xpZW50cyBzaG91bGQgY2FsbCB7QGxpbmsgaXNFbmFibGVkRm9yfSAKKwkgKiBpbnN0ZWFkIG9mIGNvbXBhcmluZyB0aGUgY29udGVudCBUeXBlcyB3aGVuIHNlYXJjaGluZyBmb3IgYW4KKwkgKiBhcHBsaWNhYmxlIGRlc2NyaXB0b3IgZnJvbSBhIHNldC4gIAorCSAqIAorCSAqIDxwPjxiPlN1YmNsYXNzZXMgbWF5IHJldHVybiBudWxsLihvcHRpb25hbCk8L2I+PC9wPgorCSAqICAKKwkgKiBAcmV0dXJuIFRoZSBjb250ZW50IHR5cGUgdGhhdCB0aGlzIGRlc2NyaXB0b3IgaXMgYXBwbGljYWJsZSB0by4KKwkgKi8KKwlwdWJsaWMgSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCl7CisJCXJldHVybiBudWxsOworCX0KKwkKKwkvKioKKwkgKiBJbiB0aGUgY2FzZSB3aGVyZSBtb3JlIHRoYW4gb25lIGZhY3RvcnkgaXMgZGVmaW5lZCBmb3IgdGhlIHNhbWUgZmlsZU5hbWUsIAorCSAqIGFuZCBjcmVhdGlvbiBpcyBwYXNzZWQgYSB1cmkgb25seSBhIGRlZmF1bHQgZmFjdG9yeSBpcyBuZWVkZWQKKwkgKiAKKwkgKiAgCisJICogQHJldHVybiBUaGUgYm9vbGVhbiBkZXNjcmliaW5nIHRoZSBkZWZhdWx0IGZhY3RvcnkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoKXsKKwkJcmV0dXJuIHRydWU7CisJfQorCQorCS8qKgorCSAqIFRoZSBzaG9ydCBzZWdtZW50IGlzIG9uZSBwb3NzaWJsZSB3YXkgdGhhdCBhIFJlc291cmNlRmFjdG9yeQorCSAqIG1pZ2h0IGFwcGx5IHRvIGEgVVJJLiBDbGllbnRzIHNob3VsZCBjYWxsIHtAbGluayBpc0VuYWJsZWRGb3J9IAorCSAqIGluc3RlYWQgb2YgY29tcGFyaW5nIHRoZSBzaG9ydCBzZWdtZW50cyB3aGVuIHNlYXJjaGluZyBmb3IgYW4KKwkgKiBhcHBsaWNhYmxlIGRlc2NyaXB0b3IgZnJvbSBhIHNldC4gIAorCSAqIAorCSAqIDxwPjxiPlN1YmNsYXNzZXMgbWF5IE5PVCByZXR1cm4gbnVsbCB1bmxlc3MgdGhleSBhbHNvIG92ZXJyaWRlCisJICoge0BsaW5rICNoYXNoQ29kZSgpfSBhbmQge0BsaW5rICNlcXVhbHMoT2JqZWN0KX0uPC9iPjwvcD4KKwkgKiAgCisJICogQHJldHVybiBUaGUgc2hvcnQgc2VnbWVudCB0aGF0IHRoaXMgZGVzY3JpcHRvciBpcyBhcHBsaWNhYmxlIHRvLgorCSAqLworCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0U2hvcnRTZWdtZW50KCk7CisJCisJCisJLyoqCisJICogVGhlIGNvcnJlY3QgaW5zdGFuY2Ugb2YgUmVzb3VyY2UuRmFjdG9yeS4gVGhlIGluc3RhbmNlIHJldHVybmVkCisJICogbWF5IG9yIG1heSBub3QgYmUgdW5pcXVlLCBzbyBpZiB5b3UgcmVxdWlyZSB0aGUgc2FtZSBpbnN0YW5jZSAKKwkgKiBmb3IgZWFjaCBjYWxsLCB5b3Ugc2hvdWxkIGNhY2hlIHRoZSB2YWx1ZSByZXR1cm5lZCB0aGUgZmlyc3QKKwkgKiB0aW1lIGZyb20gdGhpcyBtZXRob2QuIAorCSAqIAorCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgUmVzb3VyY2UuRmFjdG9yeS4KKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3QgUmVzb3VyY2UuRmFjdG9yeSBjcmVhdGVGYWN0b3J5KCk7CisJCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJcmV0dXJuIGdldFNob3J0U2VnbWVudCgpLmhhc2hDb2RlKCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworCQlpZihvIGluc3RhbmNlb2YgUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvcikKKwkJCXJldHVybiBnZXRTaG9ydFNlZ21lbnQoKS5lcXVhbHMoKChSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yKW8pLmdldFNob3J0U2VnbWVudCgpKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1Jvb3RUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Sb290VHJhbnNsYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NjQwZTkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9Sb290VHJhbnNsYXRvci5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworCitwdWJsaWMgY2xhc3MgUm9vdFRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIHsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yIGZvciBSb290VHJhbnNsYXRvci4KKwkgKiAKKwkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKKwkgKiBAcGFyYW0gZUNsYXNzCisJICovCisJcHVibGljIFJvb3RUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRUNsYXNzIGVDbGFzcykgeworCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgZUNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI3NldE1PRlZhbHVlKE5vdGlmaWVyLCBPYmplY3QsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNT0ZWYWx1ZShOb3RpZmllciBvd25lciwgT2JqZWN0IHZhbHVlLCBpbnQgbmV3SW5kZXgpIHsKKwkJKChSZXNvdXJjZSkgb3duZXIpLmdldENvbnRlbnRzKCkuYWRkKG5ld0luZGV4LCAoRU9iamVjdCl2YWx1ZSk7CisJfQorCisJLyoqCisJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNyZW1vdmVNT0ZWYWx1ZShOb3RpZmllciwgT2JqZWN0KQorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZU1PRlZhbHVlKE5vdGlmaWVyIG93bmVyLCBPYmplY3QgdmFsdWUpIHsKKwkJKChSZXNvdXJjZSkgb3duZXIpLmdldENvbnRlbnRzKCkucmVtb3ZlKHZhbHVlKTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI3NldE1PRlZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAorCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNT0ZWYWx1ZShSZXNvdXJjZSByZXMsIE9iamVjdCB2YWx1ZSkgeworCQlpZiAocmVzICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkKKwkJCXJlcy5nZXRDb250ZW50cygpLmFkZCgoRU9iamVjdCl2YWx1ZSk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNpc011bHRpVmFsdWVkKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc011bHRpVmFsdWVkKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvU291cmNlTGlua1RyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1NvdXJjZUxpbmtUcmFuc2xhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVkNjk3YgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1NvdXJjZUxpbmtUcmFuc2xhdG9yLmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQ3JlYXRlZCBvbiBBcHIgMSwgMjAwMworICoKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CisKKy8qKgorICogQGF1dGhvciBzY2hhY2hlcgorICovCitwdWJsaWMgY2xhc3MgU291cmNlTGlua1RyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIHsKKworCisJLyoqCisJICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCisJICogQHBhcmFtIGFGZWF0dXJlCisJICogQHBhcmFtIHBhdGgKKwkgKi8KKwlwdWJsaWMgU291cmNlTGlua1RyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIFRyYW5zbGF0b3JQYXRoIHBhdGgpIHsKKwkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBwYXRoKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKKwkgKiBAcGFyYW0gYUZlYXR1cmUKKwkgKiBAcGFyYW0gcGF0aAorCSAqLworCXB1YmxpYyBTb3VyY2VMaW5rVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgVHJhbnNsYXRvclBhdGggcGF0aCwgaW50IHN0eWxlKSB7CisJCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSwgcGF0aCk7CisJCWZTdHlsZSB8PSBzdHlsZTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gZG9tTmFtZUFuZFBhdGgKKwkgKiBAcGFyYW0gYUZlYXR1cmUKKwkgKiBAcGFyYW0gc3R5bGUKKwkgKi8KKwlwdWJsaWMgU291cmNlTGlua1RyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIGludCBzdHlsZSkgeworCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUsIHN0eWxlKTsKKwl9CisKKwlwdWJsaWMgT2JqZWN0IGNvbnZlcnRTdHJpbmdUb1ZhbHVlKFN0cmluZyBzdHJWYWx1ZSwgRU9iamVjdCBvd25lcikgeworCisJCU9iamVjdCB2YWx1ZSA9IG51bGw7CisJCWlmIChzdHJWYWx1ZSAhPSBudWxsKQorCQkJLy8gRmluZCB0aGUgb2JqZWN0IHdpdGggdGhlIG5hbWUgdGhhdCBtYXRjaGVzIG1hdGNoTmFtZQorCQkJdmFsdWUgPSBmVHJhbnNsYXRvclBhdGhzWzBdLmZpbmRPYmplY3Qob3duZXIsIHN0clZhbHVlLnRyaW0oKSk7CisJCWlmICgoZlN0eWxlICYgVHJhbnNsYXRvci5TVFJJTkdfUkVTVUxUX09LKSAhPSAwKQorCQkJcmV0dXJuICgodmFsdWUgIT0gbnVsbCkgPyB2YWx1ZSA6IHN0clZhbHVlKTsKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCXB1YmxpYyBTdHJpbmcgY29udmVydFZhbHVlVG9TdHJpbmcoT2JqZWN0IHZhbHVlLCBFT2JqZWN0IG93bmVyKSB7CisJCVRyYW5zbGF0b3JQYXRoIHBhdGggPSBmVHJhbnNsYXRvclBhdGhzWzBdOworCQlPYmplY3QgYXR0clZhbHVlID0gcGF0aC5nZXRMYXN0TWFwKCkuZ2V0TU9GVmFsdWUoKEVPYmplY3QpIHZhbHVlKTsKKwkJcmV0dXJuIHBhdGguZ2V0TGFzdE1hcCgpLmNvbnZlcnRWYWx1ZVRvU3RyaW5nKGF0dHJWYWx1ZSwgb3duZXIpOworCX0KKworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvU3RhdGljUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvU3RhdGljUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYWY0ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9TdGF0aWNSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKKworLyoqCisgKiBEZWNsYXJlcyBhIHN1YmNsYXNzIHRvIGNyZWF0ZSBSZXNvdXJjZS5GYWN0b3J5KGllcykgZnJvbSBhbiBleHRlbnNpb24uIAorICovCitjbGFzcyBTdGF0aWNSZXNvdXJjZUZhY3RvcnlEZXNjcmlwdG9yIGV4dGVuZHMgUmVzb3VyY2VGYWN0b3J5RGVzY3JpcHRvciB7CisJCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc2hvcnRTZWdtZW50OworCXByaXZhdGUgZmluYWwgUmVzb3VyY2UuRmFjdG9yeSBmYWN0b3J5OworCQorCS8qKgorCSAqIAorCSAqIEBwYXJhbSBzaG9ydFNlZ21lbnQgQSBub24tbnVsbCBuYW1lIG9mIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZmFjdG9yeQorCSAqIEBwYXJhbSBmYWN0b3J5IEEgbm9uLW51bGwgUmVzb3VyY2UuRmFjdG9yeSB0aGF0IGNhbiBsb2FkIGZpbGVzIG9mIHRoZSBnaXZlbiBuYW1lCisJICovCisJcHVibGljIFN0YXRpY1Jlc291cmNlRmFjdG9yeURlc2NyaXB0b3IoU3RyaW5nIHNob3J0U2VnbWVudCwgUmVzb3VyY2UuRmFjdG9yeSBmYWN0b3J5KSB7CisJCUFzc2VydC5pc05vdE51bGwoc2hvcnRTZWdtZW50KTsKKwkJQXNzZXJ0LmlzTm90TnVsbChmYWN0b3J5KTsKKwkJdGhpcy5zaG9ydFNlZ21lbnQgPSBzaG9ydFNlZ21lbnQ7CisJCXRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7CisJfSAgCisKKwlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWRGb3IoVVJJIGZpbGVVUkkpIHsKKwkJLyogc2hvcnRTZWdtZW50IG11c3QgYmUgbm9uLW51bGwgZm9yIHRoZSBkZXNjcmlwdG9yIHRvIGJlIGNyZWF0ZWQsIAorCQkgKiBhIHZhbGlkYXRpb24gY2hlY2sgaW4gaW5pdCgpIHZlcmlmaWVzIHRoaXMgcmVxdWlyZW1lbnQgKi8KKwkJaWYoZmlsZVVSSSAhPSBudWxsICYmIGZpbGVVUkkubGFzdFNlZ21lbnQoKSAhPSBudWxsKQorCQkJcmV0dXJuIHNob3J0U2VnbWVudC5lcXVhbHMoZmlsZVVSSS5sYXN0U2VnbWVudCgpKTsKKwkJcmV0dXJuIGZhbHNlOworCX0gCisJCisJcHVibGljIFJlc291cmNlLkZhY3RvcnkgY3JlYXRlRmFjdG9yeSgpIHsKKwkJIHJldHVybiBmYWN0b3J5OwkJCQorCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U2hvcnRTZWdtZW50KCkgeworCQlyZXR1cm4gc2hvcnRTZWdtZW50OworCX0gIAorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMjgwNzQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yLmphdmEKQEAgLTAsMCArMSw3OTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKKworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVN0cnVjdHVyYWxGZWF0dXJlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV4dGVuZGVkRWNvcmVVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5GZWF0dXJlVmFsdWVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKworCitwdWJsaWMgY2xhc3MgVHJhbnNsYXRvciB7CisKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBOT19TVFlMRSA9IDA7CisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRE9NX0FUVFJJQlVURSA9IDE7CisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRU1QVFlfVEFHID0gMSA8PCAxOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENEQVRBX0NPTlRFTlQgPSAxIDw8IDI7CisJLyoqCisJICogU3R5bGUgYml0IHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIGVuZCB0YWcgc2hvdWxkIE5PVCBiZSBpbmRlbnRlZDsgYnkgZGVmYXVsdCBpdCBpcy4KKwkgKi8KKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBFTkRfVEFHX05PX0lOREVOVCA9IDEgPDwgMzsKKwkvKioKKwkgKiBTdHlsZSBiaXQgdGhhdCBpbmRpY2F0ZXMgdGhhdCBib29sZWFucyBzaG91bGQgTk9UIGJlIGNvbnZlcnRlZCBhcyAiVHJ1ZSIgYW5kICJGYWxzZSI7IGRlZmF1bHQKKwkgKiBpcyB0aGF0IHRoZXkgYXJlCisJICovCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQk9PTEVBTl9MT1dFUkNBU0UgPSAxIDw8IDQ7CisJLyoqCisJICogU3R5bGUgYml0IHRoYXQgaW5kaWNhdGVzIGFuIGVudW0gdmFsdWUgY29udGFpbnMgaHlwaGVucyBJZiB0aGlzIGlzIHRydWUsIHRoZW4gaW50ZXJuYWxseSB0aGUKKwkgKiBoeXBoZW5zIGFyZSByZXBsYWNlZCB3aXRoIHVuZGVyc2NvcmVzCisJICovCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRU5VTV9GRUFUVVJFX1dJVEhfSFlQSEVOUyA9IDEgPDwgNTsKKworCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IE9CSkVDVF9NQVAgPSAxIDw8IDY7CisJcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgQk9PTEVBTl9GRUFUVVJFID0gMSA8PCA3OworCisJcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgU0hBUkVEX1JFRkVSRU5DRSA9IDEgPDwgODsKKworCS8qKgorCSAqIEluZGljYXRlcyB0aGF0IHRoZSBmZWF0dXJlIG1heSBiZSBzaWduaWZpY2FudCBldmVuIGlmIGl0IGlzIGVtcHR5CisJICovCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRU1QVFlfQ09OVEVOVF9JU19TSUdOSUZJQ0FOVCA9IDEgPDwgOTsKKworCS8qKgorCSAqIFVzZWQgdG8gaW5kaWNhdGUgdGhhdCBmZWF0dXJlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIGNvbW1lbnQgbm9kZQorCSAqLworCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IENPTU1FTlRfRkVBVFVSRSA9IDEgPDwgMTA7CisKKwkvKioKKwkgKiBJZiB0aGUgdmFsdWUgaXMgbnVsbCwgdGhlbiBhbiBlVW5zZXQoKSB3aWxsIGJlIGludm9rZWQgb24gdGhlIGZlYXR1cmUKKwkgKi8KKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBVTlNFVF9JRl9OVUxMID0gMSA8PCAxMTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgZWxlbWVudCBjb250ZW50cyBhcyBhIFN0cmluZyBpZiB0aGUgZmVhdHVyZSBpcyB1bnJlc29sdmVhYmxlIChVc2VkIGJ5IHRoZQorCSAqIFNvdXJjZUxpbmtUcmFuc2xhdG9yKQorCSAqLworCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNUUklOR19SRVNVTFRfT0sgPSAxIDw8IDEyOworCisJcHJvdGVjdGVkIFN0cmluZ1tdIGZET01OYW1lczsKKwlwcm90ZWN0ZWQgU3RyaW5nIGZET01QYXRoID0gIiI7IC8vJE5PTi1OTFMtMSQKKwlwcm90ZWN0ZWQgTWFwIHJlYWRBaGVhZE5hbWVzOworCXByb3RlY3RlZCBpbnQgZlN0eWxlID0gTk9fU1RZTEU7CisJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOworCXByb3RlY3RlZCBUcmFuc2xhdG9yUGF0aFtdIGZUcmFuc2xhdG9yUGF0aHM7CisJcHJvdGVjdGVkIEVDbGFzcyBlbWZDbGFzczsKKwlwcm90ZWN0ZWQgU3RyaW5nIGZOYW1lU3BhY2UgPSAiIjsgLy8kTk9OLU5MUy0xJAorCS8vIGFkZGVkIGJ5IE1ERQorCXByb3RlY3RlZCBTdHJpbmcgZG9tTmFtZUFuZFBhdGggPSBudWxsOworCisJLyoqCisJICogSW5kaWNhdGVzIGlmIGFueSBvZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBUcmFuc2xhdG9yIGFyZSB0aGVtc2VsdmVzIERlcGVuZGVuY3lUcmFuc2xhdG9ycworCSAqLworCXByb3RlY3RlZCBCb29sZWFuIGlzRGVwZW5kZW5jeVBhcmVudDsKKwlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGRlcGVuZGVuY3lGZWF0dXJlOworCXByb3RlY3RlZCBzdGF0aWMgRWNvcmVQYWNrYWdlIEVDT1JFX1BBQ0tBR0UgPSBFY29yZVBhY2thZ2UuZUlOU1RBTkNFOworCisJLy8gVXNlIHRoaXMgaWRlbnRpZmllciBmb3IgdGhlIERPTU5hbWUgd2hlbiB0aGUgYXR0cmlidXRlCisJLy8gdmFsdWUgaXMgdG8gYmUgZXh0cmFjdGVkIGRpcmVjdGx5IGZyb20gdGhlIHRleHQgb2YgdGhlIG5vZGUuCisJLy8gVGhpcyBpcyByYXJlLCBidXQgb2NjdXJzIGluIHRoZSB3ZWIueG1sIGluIHRoZSBjYXNlIG9mIGEKKwkvLyBXZWxjb21lRmlsZS4KKwlzdGF0aWMgZmluYWwgcHVibGljIFN0cmluZyBURVhUX0FUVFJJQlVURV9WQUxVRSA9ICIkVEVYVF9BVFRSSUJVVEVfVkFMVUUiOyAvLyROT04tTkxTLTEkCisKKwlzdGF0aWMgZmluYWwgcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBDT05UQUlORVJfRkVBVFVSRSA9IG5ldyBDb250YWluZXJGZWF0dXJlKCk7CisKKwlzdGF0aWMgZmluYWwgcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBST09UX0ZFQVRVUkUgPSBuZXcgUm9vdEZlYXR1cmUoKTsKKworCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgQ29udGFpbmVyRmVhdHVyZSBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZUltcGwgeworCQlwcm90ZWN0ZWQgQ29udGFpbmVyRmVhdHVyZSgpIHsKKwkJCXN1cGVyKCk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFJvb3RGZWF0dXJlIGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlSW1wbCB7CisJCXByb3RlY3RlZCBSb290RmVhdHVyZSgpIHsKKwkJCXN1cGVyKCk7CisJCX0KKwl9CisKKwlwdWJsaWMgVHJhbnNsYXRvciBmaW5kQ2hpbGQoU3RyaW5nIHRhZ05hbWUsIE9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uSUQpIHsKKworCQlUcmFuc2xhdG9yIHJlc3VsdCA9IG51bGw7CisJCVRyYW5zbGF0b3JbXSBtYXBzID0gZ2V0Q2hpbGRyZW4odGFyZ2V0LCB2ZXJzaW9uSUQpOworCisJCWlmIChtYXBzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFwcy5sZW5ndGg7IGkrKykgeworCQkJCVRyYW5zbGF0b3IgbWFwID0gbWFwc1tpXTsKKwkJCQlpZiAobWFwLmlzTWFwRm9yKHRhZ05hbWUpKSB7CisJCQkJCXJlc3VsdCA9IG1hcDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgeworCQkJVmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeSBmYWN0b3J5ID0gZ2V0VmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeSgpOworCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCAmJiBmYWN0b3J5LmFjY2VwdHModGFnTmFtZSkpIHsKKwkJCQlyZXN1bHQgPSBmYWN0b3J5LmNyZWF0ZSh0YWdOYW1lKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIFV0aWxpdHkgbWV0aG9kIHRvIHN0cmluZyB0b2dldGhlciBhcnJheXMgb2YgY2hpbGRyZW4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIE9iamVjdFtdIGNvbmNhdChPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5MikgeworCQlPYmplY3RbXSByZXN1bHQgPSAoT2JqZWN0W10pIGphdmEubGFuZy5yZWZsZWN0LkFycmF5Lm5ld0luc3RhbmNlKGFycmF5MS5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKSwgYXJyYXkxLmxlbmd0aCArIGFycmF5Mi5sZW5ndGgpOworCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MSwgMCwgcmVzdWx0LCAwLCBhcnJheTEubGVuZ3RoKTsKKwkJU3lzdGVtLmFycmF5Y29weShhcnJheTIsIDAsIHJlc3VsdCwgYXJyYXkxLmxlbmd0aCwgYXJyYXkyLmxlbmd0aCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHVibGljIHN0YXRpYyBPYmplY3RbXSBjb25jYXQoT2JqZWN0W10gYXJyYXkxLCBPYmplY3Qgb2JqZWN0MikgeworCQlPYmplY3RbXSBuZXdBcnJheSA9IG5ldyBPYmplY3RbXXtvYmplY3QyfTsKKwkJcmV0dXJuIGNvbmNhdChhcnJheTEsIG5ld0FycmF5KTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlUGFyZW50QW5kVGV4dEF0dHJpYnV0ZVRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBwYXJlbnRGZWF0dXJlLCBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlKSB7CisJCUdlbmVyaWNUcmFuc2xhdG9yIHBhcmVudCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihkb21OYW1lLCBwYXJlbnRGZWF0dXJlLCBFTkRfVEFHX05PX0lOREVOVCk7CisJCXBhcmVudC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltde25ldyBUcmFuc2xhdG9yKFRFWFRfQVRUUklCVVRFX1ZBTFVFLCBjaGlsZEZlYXR1cmUpfSk7CisJCXJldHVybiBwYXJlbnQ7CisJfQorCisJcHVibGljIFRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFQ2xhc3MgZUNsYXNzKSB7CisJCWluaXRpYWxpemVET01OYW1lQW5kUGF0aChkb21OYW1lQW5kUGF0aCk7CisJCXNldEVNRkNsYXNzKGVDbGFzcyk7CisJfQorCisJcHVibGljIFRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKKwkJaW5pdGlhbGl6ZURPTU5hbWVBbmRQYXRoKGRvbU5hbWVBbmRQYXRoKTsKKwkJc2V0RmVhdHVyZShhRmVhdHVyZSk7CisJfQorCisJcHVibGljIFRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIEVDbGFzcyBlQ2xhc3MpIHsKKwkJdGhpcyhkb21OYW1lQW5kUGF0aCwgYUZlYXR1cmUpOworCQlzZXRFTUZDbGFzcyhlQ2xhc3MpOworCX0KKworCXB1YmxpYyBUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBUcmFuc2xhdG9yUGF0aCBwYXRoKSB7CisJCXRoaXMoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBuZXcgVHJhbnNsYXRvclBhdGhbXXtwYXRofSk7CisJfQorCisJcHVibGljIFRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIFRyYW5zbGF0b3JQYXRoW10gcGF0aHMpIHsKKwkJaW5pdGlhbGl6ZURPTU5hbWVBbmRQYXRoKGRvbU5hbWVBbmRQYXRoKTsKKwkJZlRyYW5zbGF0b3JQYXRocyA9IHBhdGhzOworCQlzZXRGZWF0dXJlKGFGZWF0dXJlKTsKKwl9CisKKwlwdWJsaWMgVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgaW50IHN0eWxlKSB7CisJCWluaXRpYWxpemVET01OYW1lQW5kUGF0aChkb21OYW1lQW5kUGF0aCk7CisJCWZTdHlsZSA9IHN0eWxlOworCQlzZXRGZWF0dXJlKGFGZWF0dXJlKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIEVjb3JlUGFja2FnZSBnZXRFY29yZVBhY2thZ2UoKSB7CisJCXJldHVybiBFY29yZVBhY2thZ2UuZUlOU1RBTkNFOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0RE9NTmFtZShPYmplY3QgdmFsdWUpIHsKKwkJcmV0dXJuIGZET01OYW1lc1swXTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nW10gZ2V0RE9NTmFtZXMoKSB7CisJCXJldHVybiBmRE9NTmFtZXM7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRET01QYXRoKCkgeworCQlyZXR1cm4gZkRPTVBhdGg7CisJfQorCisJcHVibGljIGJvb2xlYW4gaGFzRE9NUGF0aCgpIHsKKwkJcmV0dXJuIGZET01QYXRoICE9IG51bGwgJiYgZkRPTVBhdGgubGVuZ3RoKCkgIT0gMDsKKwl9CisKKwlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmUoKSB7CisJCXJldHVybiBmZWF0dXJlOworCX0KKworCS8qKgorCSAqIFBhcnNlIHRoZSBET00gbmFtZXMgYW5kIHBhdGggb3V0IG9mIDxkb21OYW1lQW5kUGF0aD5hbmQgc2V0IHRoZSBhcHByb3ByaWF0ZSBmaWVsZHMuCisJICovCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURPTU5hbWVBbmRQYXRoKFN0cmluZyBkb21OYW1lQW5kUGF0aEFyZykgeworCQlpZiAoZG9tTmFtZUFuZFBhdGhBcmcgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJaW50IGlueCA9IGRvbU5hbWVBbmRQYXRoQXJnLmxhc3RJbmRleE9mKCcvJyk7CisJCWlmIChpbnggIT0gLTEpIHsKKwkJCWZET01OYW1lcyA9IHBhcnNlRE9NTmFtZXMoZG9tTmFtZUFuZFBhdGhBcmcuc3Vic3RyaW5nKGlueCArIDEpKTsKKwkJCWZET01QYXRoID0gZG9tTmFtZUFuZFBhdGhBcmcuc3Vic3RyaW5nKDAsIGlueCk7CisJCX0gZWxzZSB7CisJCQlmRE9NTmFtZXMgPSBwYXJzZURPTU5hbWVzKGRvbU5hbWVBbmRQYXRoQXJnKTsKKwkJCWZET01QYXRoID0gIiI7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQkvLyBhZGRlZCBieSBNREUKKwkJdGhpcy5kb21OYW1lQW5kUGF0aCA9IGRvbU5hbWVBbmRQYXRoQXJnOworCisJfQorCisJLyoqCisJICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIG5vZGUgc2hvdWxkIGJlIHdyaXR0ZW4gYXMgYW4gZW1wdHkgdGFnOyBlZywgPGRpc3RyaWJ1dGFibGUvPgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQ0RBVEFDb250ZW50KCkgeworCQlyZXR1cm4gKGZTdHlsZSAmIENEQVRBX0NPTlRFTlQpICE9IDA7CisJfQorCisJLyoqCisJICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIERPTU5hbWUgcmVwcmVzZW50cyBhIHN1YiBlbGVtZW50IG5hbWUgb3IgYW4gYXR0cmlidXRlIG5hbWUKKwkgKiAKKwkgKiBAcmV0dXJuIGJvb2xlYW4gVHJ1ZSBpZiB0aGUgRE9NTmFtZSBpcyBhbiBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0RPTUF0dHJpYnV0ZSgpIHsKKwkJcmV0dXJuIChmU3R5bGUgJiBET01fQVRUUklCVVRFKSAhPSAwOworCX0KKworCS8qKgorCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBub2RlIHNob3VsZCBiZSB3cml0dGVuIGFzIGFuIGVtcHR5IHRhZzsgZWcsIDxkaXN0cmlidXRhYmxlLz4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5VGFnKCkgeworCQlyZXR1cm4gKGZTdHlsZSAmIEVNUFRZX1RBRykgIT0gMDsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0Jvb2xlYW5VcHBlcmNhc2UoKSB7CisJCXJldHVybiAoZlN0eWxlICYgQk9PTEVBTl9GRUFUVVJFKSAhPSAwICYmIChmU3R5bGUgJiBCT09MRUFOX0xPV0VSQ0FTRSkgPT0gMDsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0Jvb2xlYW5GZWF0dXJlKCkgeworCQlyZXR1cm4gKGZTdHlsZSAmIEJPT0xFQU5fRkVBVFVSRSkgIT0gMDsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBzaG91bGRJbmRlbnRFbmRUYWcoKSB7CisJCXJldHVybiAoZlN0eWxlICYgRU5EX1RBR19OT19JTkRFTlQpID09IDA7CisJfQorCisJcHVibGljIGJvb2xlYW4gc2hvdWxkSW5kZW50RW5kVGFnKE5vZGUgbm9kZSkgeworCQlyZXR1cm4gc2hvdWxkSW5kZW50RW5kVGFnKCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNFbXB0eUNvbnRlbnRTaWduaWZpY2FudCgpIHsKKwkJcmV0dXJuICgoZlN0eWxlICYgRU1QVFlfVEFHKSAhPSAwKSB8fCAoKGZTdHlsZSAmIEVNUFRZX0NPTlRFTlRfSVNfU0lHTklGSUNBTlQpICE9IDApOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG1hcCBpcyB0byBhbm90aGVyIE1PRiBvYmplY3QgKG5vdCBhIHByaW1pdGl2ZSkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc09iamVjdE1hcCgpIHsKKwkJcmV0dXJuIChmU3R5bGUgJiBPQkpFQ1RfTUFQKSAhPSAwOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG1hcCBpcyBmb3IgYSBzaGFyZWQgcmVmZXJlbmNlCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTaGFyZWQoKSB7CisJCXJldHVybiAoZlN0eWxlICYgU0hBUkVEX1JFRkVSRU5DRSkgIT0gMDsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0VudW1XaXRoSHlwaGVucygpIHsKKwkJcmV0dXJuIChmU3R5bGUgJiBFTlVNX0ZFQVRVUkVfV0lUSF9IWVBIRU5TKSAhPSAwOworCX0KKworCS8qKgorCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBtYXAgcmVwcmVzZW50cyBhIGNhc2Ugd2hlcmUgdGhlIHRleHQgb2YgdGhlIERPTU5vZGUgcmVwcmVzZW50cyB0aGUKKwkgKiBvYmplY3RzIG9uZSBhbmQgb25seSBhdHRyaWJ1dGUgdmFsdWUuIEFuIGV4YW1wbGUgb2YgdGhpcyBjYXNlIGlzIGEgPHdlbGNvbWUtZmlsZT5maWxlLnR4dAorCSAqIDwvd2VsY29tZS1maWxlPi4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0RPTVRleHRWYWx1ZSgpIHsKKwkJcmV0dXJuIGZET01OYW1lc1swXSA9PSBURVhUX0FUVFJJQlVURV9WQUxVRTsKKwl9CisKKwkvKioKKwkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaWQgaXMgdGhlIG1vZiBhdHRyaWJ1dGUgdGhhdCBzaG91bGQgYmUgc2V0LgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzSURNYXAoKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaWQgaXMgdGhlIG1vZiBhdHRyaWJ1dGUgdGhhdCBzaG91bGQgYmUgc2V0LgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTGlua01hcCgpIHsKKwkJcmV0dXJuIGZUcmFuc2xhdG9yUGF0aHMgIT0gbnVsbDsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1RhcmdldExpbmtNYXAoKSB7CisJCXJldHVybiBpc0xpbmtNYXAoKSAmJiAhaXNPYmplY3RNYXAoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIG1hcCBpcyB0aGUgb25lIHJlcHJlc2VudGluZyBhIG5vZGUgd2l0aCB0aGUgbmFtZSA8ZG9tTmFtZT4uIEJ5IGRlZmF1bHQKKwkgKiB0aGlzIG1ldGhvZCBzaW1wbHkgY29tcGFyZXMgdGhlIERPTSBuYW1lIG9mIHRoZSBtYXAgYWdhaW5zdCB0aGUgPGRvbU5hbWU+cGFyYW1ldGVyCisJICogCisJICogQHJldHVybiBib29sZWFuCisJICogQHBhcmFtIGRvbU5hbWUKKwkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc01hcEZvcihTdHJpbmcgZG9tTmFtZSkgeworCQlpZiAoZG9tTmFtZS5lcXVhbHMoZ2V0RE9NUGF0aCgpKSkKKwkJCXJldHVybiB0cnVlOworCQlmb3IgKGludCBpID0gMDsgaSA8IGZET01OYW1lcy5sZW5ndGg7IGkrKykgeworCQkJaWYgKGRvbU5hbWUuZXF1YWxzKGZET01OYW1lc1tpXSkpCisJCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzTWFwRm9yKE9iamVjdCBhRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJcmV0dXJuIGZlYXR1cmUgPT0gYUZlYXR1cmU7CisJfQorCisJLyoqCisJICogSW5kaWNhdGVzIHdoZXRoZXIgZmVhdHVyZSBiZWluZyBtYXBwZWQgaXMgYSBjb2xsZWN0aW9uLgorCSAqIAorCSAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIGlmIHRoZSBmZWF0dXJlIGlzIG11bHRpIHZhbHVlZC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc011bHRpVmFsdWVkKCkgeworCQlpZiAoZmVhdHVyZSAhPSBudWxsKQorCQkJcmV0dXJuIGZlYXR1cmUuaXNNYW55KCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBQYXJzZXMgY29tbWEgc2VwYXJhdGVkIG5hbWVzIGZyb20gPGRvbU5hbWVzU3RyaW5nPi4gUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBuYW1lcy4KKwkgKiAKKwkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmdbXQorCSAqIEBwYXJhbSBkb21OYW1lc1N0cmluZworCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZworCSAqLworCXByb3RlY3RlZCBTdHJpbmdbXSBwYXJzZURPTU5hbWVzKFN0cmluZyBkb21OYW1lc1N0cmluZykgeworCQlpbnQgc3RhcnRJbnggPSAwOworCQlpbnQgaW54ID0gZG9tTmFtZXNTdHJpbmcuaW5kZXhPZignLCcpOworCQlBcnJheUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoMSk7CisJCXdoaWxlIChpbnggIT0gLTEpIHsKKwkJCXJlc3VsdHMuYWRkKGRvbU5hbWVzU3RyaW5nLnN1YnN0cmluZyhzdGFydElueCwgaW54KSk7CisJCQlzdGFydElueCA9IGlueCArIDE7CisJCQlpbnggPSBkb21OYW1lc1N0cmluZy5pbmRleE9mKCcsJywgc3RhcnRJbngpOworCQl9CisJCWlmIChzdGFydElueCA9PSAwKQorCQkJcmVzdWx0cy5hZGQoZG9tTmFtZXNTdHJpbmcpOworCQllbHNlCisJCQlyZXN1bHRzLmFkZChkb21OYW1lc1N0cmluZy5zdWJzdHJpbmcoc3RhcnRJbngpKTsKKwkJcmV0dXJuIChTdHJpbmdbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0cy5zaXplKCldKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCVN0cmluZyBjbiA9IGdldENsYXNzKCkuZ2V0TmFtZSgpOworCQlpbnQgaSA9IGNuLmxhc3RJbmRleE9mKCcuJyk7CisJCWNuID0gY24uc3Vic3RyaW5nKCsraSwgY24ubGVuZ3RoKCkpOworCQlzYi5hcHBlbmQoY24pOworCQlzYi5hcHBlbmQoJygnKTsKKwkJc2IuYXBwZW5kKGZET01OYW1lc1swXSk7CisJCWZvciAoaW50IGogPSAxOyBqIDwgZkRPTU5hbWVzLmxlbmd0aDsgaisrKSB7CisJCQlzYi5hcHBlbmQoJ3wnKTsKKwkJCXNiLmFwcGVuZChmRE9NTmFtZXNbal0pOworCQl9CisJCXNiLmFwcGVuZCgnLCcpOworCQlzYi5hcHBlbmQoaGFzaENvZGUoKSk7CisJCXNiLmFwcGVuZCgnKScpOworCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiBHZXRzIHRoZSBUcmFuc2xhdG9yUGF0aC4KKwkgKiAKKwkgKiBAcmV0dXJuIFJldHVybnMgYSBUcmFuc2xhdG9yUGF0aAorCSAqLworCXB1YmxpYyBUcmFuc2xhdG9yUGF0aFtdIGdldFRyYW5zbGF0b3JQYXRocygpIHsKKwkJcmV0dXJuIGZUcmFuc2xhdG9yUGF0aHM7CisJfQorCisJLyoKKwkgKiBAc2VlIE9iamVjdCNlcXVhbHMoT2JqZWN0KQorCSAqLworCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIFRyYW5zbGF0b3IpKQorCQkJcmV0dXJuIGZhbHNlOworCQlUcmFuc2xhdG9yIG1hcEluZm8gPSAoVHJhbnNsYXRvcikgb2JqZWN0OworCQlyZXR1cm4gZkRPTU5hbWVzLmVxdWFscyhtYXBJbmZvLmdldERPTU5hbWVzKCkpICYmIChmZWF0dXJlID09IG51bGwgJiYgbWFwSW5mby5nZXRGZWF0dXJlKCkgPT0gbnVsbCB8fCBmZWF0dXJlLmVxdWFscyhtYXBJbmZvLmdldEZlYXR1cmUoKSkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGlzTWFuYWdlZEJ5UGFyZW50LgorCSAqIAorCSAqIEByZXR1cm4gYm9vbGVhbgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTWFuYWdlZEJ5UGFyZW50KCkgeworCQlyZXR1cm4gZ2V0Q2hpbGRyZW4obnVsbCwgLTEpID09IG51bGw7CisJfQorCisJLyoKKwkgKiBJbiB0aGUgOTklIGNhc2UgdGhlcmUgaXMgb25seSBvbmUgbm9kZSBuYW1lIHRvIGJlIGNvbmNlcm5lZCB3aXRoLCBidXQgc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUKKwkgKiBmb3IgdGhlIGNhc2VzIHdoZXJlIG11bHRpcGxlIGRvbSBuYW1lcyBtYXAgdG8gb25lIGZlYXR1cmUKKwkgKi8KKwlwdWJsaWMgRU9iamVjdCBjcmVhdGVFTUZPYmplY3QoU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSkgeworCQlpZiAoZW1mQ2xhc3MgPT0gbnVsbCkgeworCQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCWlmIChpc09iamVjdE1hcCgpKQorCQkJCXJldHVybiBjcmVhdGVFTUZPYmplY3QoZmVhdHVyZSk7CisJCX0KKwkJcmV0dXJuIGNyZWF0ZUVNRk9iamVjdChlbWZDbGFzcyk7CisJfQorCisJcHVibGljIHN0YXRpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKKwkJaWYgKGFGZWF0dXJlID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKworCQlyZXR1cm4gY3JlYXRlRU1GT2JqZWN0KCgoRVJlZmVyZW5jZSkgYUZlYXR1cmUpLmdldEVSZWZlcmVuY2VUeXBlKCkpOworCX0KKworCXB1YmxpYyBzdGF0aWMgRU9iamVjdCBjcmVhdGVFTUZPYmplY3QoRUNsYXNzIGFuRUNsYXNzKSB7CisJCWlmIChhbkVDbGFzcyA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCXJldHVybiBhbkVDbGFzcy5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKS5jcmVhdGUoYW5FQ2xhc3MpOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRleHRWYWx1ZUlmTmVjZXNzYXJ5KFN0cmluZyB0ZXh0VmFsdWUsIE5vdGlmaWVyIG93bmVyLCBpbnQgdmVyc2lvbklkKSB7CisJCVRyYW5zbGF0b3IgdGV4dFRyYW5zbGF0b3IgPSB0aGlzLmZpbmRDaGlsZChUcmFuc2xhdG9yLlRFWFRfQVRUUklCVVRFX1ZBTFVFLCBvd25lciwgdmVyc2lvbklkKTsKKwkJaWYgKHRleHRUcmFuc2xhdG9yICE9IG51bGwpIHsKKwkJCU9iamVjdCBvYmplY3RWYWx1ZSA9IHRleHRUcmFuc2xhdG9yLmNvbnZlcnRTdHJpbmdUb1ZhbHVlKHRleHRWYWx1ZSwgKEVPYmplY3QpIG93bmVyKTsKKwkJCXRleHRUcmFuc2xhdG9yLnNldE1PRlZhbHVlKG93bmVyLCBvYmplY3RWYWx1ZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDaGVjayB0byBzZWUgaWYgZmVhdHVyZSBpcyB2YWxpZCBvbiBhIHBhcnRpY3VsYXIgbW9mT2JqZWN0LgorCSAqIAorCSAqIEByZXR1cm4gYm9vbGVhbiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmVhdHVyZSBzcGVjaWZpZWQgZXhpc3RzIG9uIHRoZSBNT0Ygb2JqZWN0LgorCSAqIEBwYXJhbSBlbWZPYmplY3QKKwkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0CisJICovCisJcHVibGljIGJvb2xlYW4gZmVhdHVyZUV4aXN0cyhFT2JqZWN0IGVtZk9iamVjdCkgeworCQlpZiAoZmVhdHVyZSA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCisJCXJldHVybiBlbWZPYmplY3QuZUNsYXNzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKGZlYXR1cmUuZ2V0TmFtZSgpKSAhPSBudWxsOworCX0KKworCS8qKgorCSAqIFRyYW5zbGF0b3JzIHdoaWNoIGRvIG5vdCBoYXZlIGEgZmVhdHVyZSBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2Qgd2l0aCBjdXN0b20gYmVoYXZpb3IuCisJICovCisJcHVibGljIFN0cmluZyBleHRyYWN0U3RyaW5nVmFsdWUoRU9iamVjdCBlbWZPYmplY3QpIHsKKwkJaWYgKGlzRW1wdHlUYWcoKSAmJiBmZWF0dXJlID09IG51bGwpCisJCQlyZXR1cm4gIiI7IC8vRmFrZSBpdCBvdXQgd2l0aCBhIHZhbHVlIC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIE9iamVjdCBjb252ZXJ0U3RyaW5nVG9WYWx1ZShTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lLCBTdHJpbmcgdmFsdWUsIE5vdGlmaWVyIG93bmVyKSB7CisJCU9iamVjdCByZXN1bHQgPSBudWxsOworCQl0cnkgeworCisJCQlpZiAoIXRoaXMuaXNNYW5hZ2VkQnlQYXJlbnQoKSkgeworCQkJCXJlc3VsdCA9IGNyZWF0ZUVNRk9iamVjdChub2RlTmFtZSwgcmVhZEFoZWFkTmFtZSk7CisJCQl9IGVsc2UgeworCQkJCXJlc3VsdCA9IGNvbnZlcnRTdHJpbmdUb1ZhbHVlKHZhbHVlLCAoRU9iamVjdCkgb3duZXIpOworCQkJfQorCisJCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjY2UpIHsKKworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogQ29udmVydHMgYSBzdHJpbmcgdmFsdWUgdG8gdGhlIGFwcHJvcHJpYXRlIHR5cGUuCisJICogCisJICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0IFRoZSBjb252ZXJ0ZWQgdmFsdWUKKwkgKiBAcGFyYW0gc3RyVmFsdWUKKwkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LgorCSAqLworCXB1YmxpYyBPYmplY3QgY29udmVydFN0cmluZ1RvVmFsdWUoU3RyaW5nIHN0clZhbHVlLCBFT2JqZWN0IG93bmVyKSB7CisJCWlmIChmZWF0dXJlID09IG51bGwpCisJCQlyZXR1cm4gc3RyVmFsdWU7CisJCWlmIChzdHJWYWx1ZSAhPSBudWxsKSB7CisJCQlpZiAoaXNFbnVtV2l0aEh5cGhlbnMoKSkKKwkJCQlzdHJWYWx1ZSA9IHN0clZhbHVlLnJlcGxhY2UoJy0nLCAnXycpOworCQkJaWYgKCFpc0NEQVRBQ29udGVudCgpKSB7CisJCQkJc3RyVmFsdWUgPSBzdHJWYWx1ZS50cmltKCk7CisJCQl9CisJCX0KKwkJT2JqZWN0IHZhbHVlID0gRmVhdHVyZVZhbHVlQ29udmVydGVyLkRFRkFVTFQuY29udmVydFZhbHVlKHN0clZhbHVlLCBmZWF0dXJlKTsKKwkJaWYgKHZhbHVlID09IG51bGwpIHsKKwkJCWlmIChpc0VtcHR5VGFnKCkgJiYgIWlzRE9NQXR0cmlidXRlKCkgJiYgIWlzRE9NVGV4dFZhbHVlKCkgJiYgaXNCb29sZWFuRmVhdHVyZSgpKQorCQkJCXJldHVybiBCb29sZWFuLlRSVUU7CisJCQlFT2JqZWN0IGNvbnZlcnRUb1R5cGUgPSBmZWF0dXJlLmdldEVUeXBlKCk7CisJCQlpZiAoY29udmVydFRvVHlwZSA9PSBudWxsKQorCQkJCXZhbHVlID0gc3RyVmFsdWU7CisJCQllbHNlIGlmIChjb252ZXJ0VG9UeXBlLmVxdWFscyhnZXRFY29yZVBhY2thZ2UoKS5nZXRFU3RyaW5nKCkpKSB7CisJCQkJdmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJCXJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBhIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHR5cGUgdG8gYSBzdHJpbmcgdmFsdWUuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIGZvciBzcGVjaWFsCisJICogY2FzZXMgd2hlcmUgc3BlY2lhbCBjb252ZXJzaW9uIG5lZWRzIHRvIG9jY3VyIGJhc2VkIG9uIHRoZSBmZWF0dXJlIGFuZCBvciBvYmplY3QgdHlwZS4KKwkgKiAKKwkgKiBAcmV0dXJuIFN0cmluZyBUaGUgY29udmVydGVkIHZhbHVlCisJICogQHBhcmFtIHZhbHVlCisJICogICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0IFRoZSBvYmplY3QgdG8gY29udmVydC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRWYWx1ZVRvU3RyaW5nKE9iamVjdCB2YWx1ZSwgRU9iamVjdCBvd25lcikgeworCQlpZiAoaXNFbXB0eVRhZygpIHx8IHZhbHVlID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJZWxzZSBpZiAoaXNFbnVtV2l0aEh5cGhlbnMoKSkKKwkJCXJldHVybiB2YWx1ZS50b1N0cmluZygpLnJlcGxhY2UoJ18nLCAnLScpOworCQllbHNlIGlmIChpc0Jvb2xlYW5VcHBlcmNhc2UoKSkKKwkJCXJldHVybiAoKEJvb2xlYW4pIHZhbHVlKS5ib29sZWFuVmFsdWUoKSA/ICJUcnVlIiA6ICJGYWxzZSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJCXJldHVybiB2YWx1ZS50b1N0cmluZygpOworCX0KKworCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0VmFyaWFibGVDaGlsZHJlbihOb3RpZmllciB0YXJnZXQsIGludCB2ZXJzaW9uKSB7CisJCVRyYW5zbGF0b3JbXSByZXN1bHRzID0gbnVsbDsKKwkJVmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeSBmYWN0b3J5ID0gZ2V0VmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeSgpOworCQlpZiAoZmFjdG9yeSAhPSBudWxsKSB7CisJCQlMaXN0IHZhcmlhYmxlVHJhbnNsYXRvcnMgPSBmYWN0b3J5LmNyZWF0ZSh0YXJnZXQpOworCQkJaWYgKHZhcmlhYmxlVHJhbnNsYXRvcnMgIT0gbnVsbCAmJiB2YXJpYWJsZVRyYW5zbGF0b3JzLnNpemUoKSA+IDApIHsKKwkJCQlPYmplY3RbXSB2dG9hID0gdmFyaWFibGVUcmFuc2xhdG9ycy50b0FycmF5KCk7CisKKwkJCQlyZXN1bHRzID0gbmV3IFRyYW5zbGF0b3JbdnRvYS5sZW5ndGhdOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykKKwkJCQkJcmVzdWx0c1tpXSA9IChUcmFuc2xhdG9yKSB2dG9hW2ldOworCQkJfQorCisJCX0KKwkJaWYgKHJlc3VsdHMgPT0gbnVsbCkKKwkJCXJlc3VsdHMgPSBuZXcgVHJhbnNsYXRvclswXTsKKwkJcmV0dXJuIHJlc3VsdHM7CisJfQorCisJLyoqCisJICogUmV0dXJucyBudWxsIGJ5IGRlZmF1bHQ7IHN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRvIHJldHVybiBzcGVjaWZpYyBjaGlsZHJlbgorCSAqLworCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb25JRCkgeworCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oKTsKKwl9CisKKwlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgTU9GIGNoaWxkcmVuIHRoYXQgY3VycmVudGx5IGV4aXN0IGZvciB0aGUgdmFsdWVzIG9mIGFuIGF0dHJpYnV0ZS4KKwkgKi8KKwlwdWJsaWMgTGlzdCBnZXRNT0ZDaGlsZHJlbihFT2JqZWN0IG1vZk9iamVjdCkgeworCQlpZiAoZmVhdHVyZSA9PSBudWxsKQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CisJCU9iamVjdCB2YWx1ZSA9IGdldE1PRlZhbHVlKG1vZk9iamVjdCk7CisJCUxpc3QgcmVzdWx0ID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKKwkJaWYgKGlzTXVsdGlWYWx1ZWQoKSkKKwkJCXJlc3VsdCA9IChMaXN0KSB2YWx1ZTsKKwkJZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkKKwkJCXJlc3VsdCA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodmFsdWUpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXB1YmxpYyBPYmplY3QgZ2V0TU9GVmFsdWUoRU9iamVjdCBtb2ZPYmplY3QpIHsKKwkJaWYgKGZlYXR1cmUgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQlyZXR1cm4gbW9mT2JqZWN0LmVHZXQoZmVhdHVyZSk7CisJfQorCisJLyoqCisJICogU2V0cyBhIHZhbHVlIG9mIGEgZmVhdHVyZSBpbiBhIG1vZiBvYmplY3QuCisJICovCisJcHVibGljIHZvaWQgc2V0TU9GVmFsdWUoTm90aWZpZXIgb3duZXIsIE9iamVjdCB2YWx1ZSwgaW50IG5ld0luZGV4KSB7CisJCWlmIChmZWF0dXJlICE9IG51bGwpIHsKKwkJCWlmICgoZlN0eWxlICYgVU5TRVRfSUZfTlVMTCkgIT0gMCAmJiB2YWx1ZSA9PSBudWxsKQorCQkJCUV4dGVuZGVkRWNvcmVVdGlsLmVVbnNldE9yUmVtb3ZlKChFT2JqZWN0KSBvd25lciwgZmVhdHVyZSwgdmFsdWUpOworCQkJZWxzZQorCQkJCUV4dGVuZGVkRWNvcmVVdGlsLmVTZXRPckFkZCgoRU9iamVjdCkgb3duZXIsIGZlYXR1cmUsIHZhbHVlLCBuZXdJbmRleCk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRNT0ZWYWx1ZShOb3RpZmllciBvd25lciwgT2JqZWN0IHZhbHVlKSB7CisJCWlmIChvd25lciBpbnN0YW5jZW9mIEVPYmplY3QpIHsKKwkJCXNldE1PRlZhbHVlKChFT2JqZWN0KSBvd25lciwgdmFsdWUpOworCQl9IGVsc2UgaWYgKG93bmVyIGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKKwkJCXNldE1PRlZhbHVlKChSZXNvdXJjZSkgb3duZXIsIHZhbHVlKTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHNldE1PRlZhbHVlKEVPYmplY3QgZW1mT2JqZWN0LCBPYmplY3QgdmFsdWUpIHsKKwkJLy8JCWlmIChmZWF0dXJlICE9IG51bGwpCisJCS8vCQkJZW1mT2JqZWN0LmVTZXQoZmVhdHVyZSwgdmFsdWUpOworCQlzZXRNT0ZWYWx1ZShlbWZPYmplY3QsIHZhbHVlLCAtMSk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNzZXRNT0ZWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKKwkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCisJICovCisJcHVibGljIHZvaWQgc2V0TU9GVmFsdWUoUmVzb3VyY2UgcmVzLCBPYmplY3QgdmFsdWUpIHsKKwkJaWYgKHJlcyAhPSBudWxsICYmIHZhbHVlICE9IG51bGwpCisJCQlyZXMuZ2V0Q29udGVudHMoKS5hZGQoKEVPYmplY3QpdmFsdWUpOworCX0KKworCXB1YmxpYyB2b2lkIHJlbW92ZU1PRlZhbHVlKE5vdGlmaWVyIG93bmVyLCBPYmplY3QgdmFsdWUpIHsKKwkJaWYgKGZlYXR1cmUgIT0gbnVsbCkKKwkJCUV4dGVuZGVkRWNvcmVVdGlsLmVVbnNldE9yUmVtb3ZlKChFT2JqZWN0KSBvd25lciwgZmVhdHVyZSwgdmFsdWUpOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzU2V0TU9GVmFsdWUoRU9iamVjdCBlbWZPYmplY3QpIHsKKwkJYm9vbGVhbiBpc1NldCA9IGZlYXR1cmUgIT0gbnVsbCAmJiBlbWZPYmplY3QuZUlzU2V0KGZlYXR1cmUpOworCQlpZiAoaXNFbXB0eVRhZygpKQorCQkJcmV0dXJuIGlzU2V0ICYmICgoQm9vbGVhbikgZW1mT2JqZWN0LmVHZXQoZmVhdHVyZSkpLmJvb2xlYW5WYWx1ZSgpOworCQlyZXR1cm4gaXNTZXQ7CisJfQorCisJcHVibGljIHZvaWQgdW5TZXRNT0ZWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCkgeworCQlpZiAoZmVhdHVyZSAhPSBudWxsKQorCQkJZW1mT2JqZWN0LmVVbnNldChmZWF0dXJlKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBjbGVhckxpc3QoRU9iamVjdCBtb2ZPYmplY3QpIHsKKwkJaWYgKGZlYXR1cmUgIT0gbnVsbCkKKwkJCSgoTGlzdCkgbW9mT2JqZWN0LmVHZXQoZmVhdHVyZSkpLmNsZWFyKCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0RmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKKwkJdGhpcy5mZWF0dXJlID0gYUZlYXR1cmU7CisJCWlmIChmZWF0dXJlID09IG51bGwpCisJCQlyZXR1cm47CisJCS8vVGhpcyB3YXkgYW4gaW5zdGFuY2UgY2hlY2sgaGFwcGVucyBvbmx5IG9uY2UKKwkJaWYgKGFGZWF0dXJlIGluc3RhbmNlb2YgRVJlZmVyZW5jZSkgeworCQkJZlN0eWxlIHw9IE9CSkVDVF9NQVA7CisJCQlpZiAoISgoRVJlZmVyZW5jZSkgYUZlYXR1cmUpLmlzQ29udGFpbm1lbnQoKSkKKwkJCQlmU3R5bGUgfD0gU0hBUkVEX1JFRkVSRU5DRTsKKwkJfQorCisJCWlmIChnZXRFY29yZVBhY2thZ2UoKS5nZXRFQm9vbGVhbigpID09IGZlYXR1cmUuZ2V0RVR5cGUoKSkKKwkJCWZTdHlsZSB8PSBCT09MRUFOX0ZFQVRVUkU7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0RU1GQ2xhc3MoRUNsYXNzIGFuRUNsYXNzKSB7CisJCXRoaXMuZW1mQ2xhc3MgPSBhbkVDbGFzczsKKwkJaWYgKGFuRUNsYXNzICE9IG51bGwpCisJCQlmU3R5bGUgfD0gT0JKRUNUX01BUDsKKworCX0KKworCXB1YmxpYyBib29sZWFuIGhhc1JlYWRBaGVhZE5hbWVzKCkgeworCQlyZXR1cm4gcmVhZEFoZWFkTmFtZXMgIT0gbnVsbCAmJiAhcmVhZEFoZWFkTmFtZXMuaXNFbXB0eSgpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgcmVhZCBhaGVhZCBuYW1lcywgaWYgdGhleSBhcmUgZGVmaW5lZCwgZm9yIGEgZ2l2ZW4gcGFyZW50IG5vZGUgbmFtZS4gVGhpcyBpcyB1c2VkCisJICogd2hlbiBjcmVhdGlvbiBvZiBhIHNwZWNpZmljIEVNRiBvYmplY3QgaXMgZGVwZW5kZW50IG9uIHRoZSB2YWx1ZSBvZiBhIGNoaWxkIG5vZGUuCisJICovCisJcHVibGljIFJlYWRBaGVhZEhlbHBlciBnZXRSZWFkQWhlYWRIZWxwZXIoU3RyaW5nIHBhcmVudE5hbWUpIHsKKwkJaWYgKHJlYWRBaGVhZE5hbWVzID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJcmV0dXJuIChSZWFkQWhlYWRIZWxwZXIpIHJlYWRBaGVhZE5hbWVzLmdldChwYXJlbnROYW1lKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRSZWFkQWhlYWRIZWxwZXIoUmVhZEFoZWFkSGVscGVyIGhlbHBlcikgeworCQlpZiAocmVhZEFoZWFkTmFtZXMgPT0gbnVsbCkKKwkJCXJlYWRBaGVhZE5hbWVzID0gbmV3IEhhc2hNYXAoMyk7CisJCXJlYWRBaGVhZE5hbWVzLnB1dChoZWxwZXIuZ2V0UGFyZW50RE9NTmFtZSgpLCBoZWxwZXIpOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzRGVwZW5kZW5jeUNoaWxkKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRGVwZW5kZW5jeVBhcmVudCgpIHsKKwkJaWYgKGlzRGVwZW5kZW5jeVBhcmVudCA9PSBudWxsKSB7CisJCQlpc0RlcGVuZGVuY3lQYXJlbnQgPSBCb29sZWFuLkZBTFNFOworCQkJVHJhbnNsYXRvcltdIHRoZUNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4obnVsbCwgLTEpOworCQkJaWYgKHRoZUNoaWxkcmVuICE9IG51bGwpIHsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRoZUNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCQkJCS8vRm9yIG5vdyB3ZSBhc3N1bWUgb25lCisJCQkJCWlmICh0aGVDaGlsZHJlbltpXS5pc0RlcGVuZGVuY3lDaGlsZCgpKSB7CisJCQkJCQlpc0RlcGVuZGVuY3lQYXJlbnQgPSBCb29sZWFuLlRSVUU7CisJCQkJCQlkZXBlbmRlbmN5RmVhdHVyZSA9IHRoZUNoaWxkcmVuW2ldLmdldERlcGVuZGVuY3lGZWF0dXJlKCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIGlzRGVwZW5kZW5jeVBhcmVudC5ib29sZWFuVmFsdWUoKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXREZXBlbmRlbmN5RmVhdHVyZSgpIHsKKwkJcmV0dXJuIGRlcGVuZGVuY3lGZWF0dXJlOworCX0KKworCXB1YmxpYyBFT2JqZWN0IGJhc2ljR2V0RGVwZW5kZW5jeU9iamVjdChFT2JqZWN0IHBhcmVudCkgeworCQlyZXR1cm4gKEVPYmplY3QpIHBhcmVudC5lR2V0KGRlcGVuZGVuY3lGZWF0dXJlKTsKKwl9CisKKwkvKioKKwkgKiBVc2Ugd2hlbiB0aGUgRE9NIHBhdGggaXMgbm90IG51bGwsIGFuZCB0aGVyZSBhcmUgbm8gY2hpbGRyZW4uIERlZmF1bHQgaXMgZmFsc2UsIGJ1dAorCSAqIHN1YmNsYXNzZXMgbWF5IHdpc2ggdG8gb3ZlcnJpZGUKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBzaG91bGRSZW5kZXJFbXB0eURPTVBhdGgoRU9iamVjdCBlT2JqZWN0KSB7CisJCXJldHVybiBpc0VtcHR5Q29udGVudFNpZ25pZmljYW50KCk7CisJfQorCisJLyoqCisJICogVXNlIHdoZW4gdGhlIHRyYW5zbGF0b3IgdG9sZXJhdGVzIHBhcmVudCBub2RlcyB0aGF0IHJlbGF0ZSB0byB0aGUgRE9NIHBhdGgsIGFuZCBubyBjaGlsZHJlbjsKKwkgKiBkZWZhdWx0IGlzIGRvIG5vdGhpbmcKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNT0ZWYWx1ZUZyb21FbXB0eURPTVBhdGgoRU9iamVjdCBlT2JqZWN0KSB7CisKKwl9CisKKwkvKioKKwkgKiBOYW1lc3BhY2UgZm9yIHRoZSBhdHRyaWJ1dGVzCisJICogCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZVNwYWNlKCkgeworCQlyZXR1cm4gZk5hbWVTcGFjZTsKKwl9CisKKwkvKioKKwkgKiBTZXQgdGhlIG5hbWVzcGFjZSBmb3IgdGhlIGRvbSBhdHRyaWJ1dGUKKwkgKiAKKwkgKiBAcGFyYW0gc3RyaW5nCisJICovCisJcHVibGljIHZvaWQgc2V0TmFtZVNwYWNlKFN0cmluZyBzdHJpbmcpIHsKKwkJZk5hbWVTcGFjZSA9IHN0cmluZzsKKwl9CisKKwlwdWJsaWMgVmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeSBnZXRWYXJpYWJsZVRyYW5zbGF0b3JGYWN0b3J5KCkgeworCQlpZiAoaXNPYmplY3RNYXAoKSkKKwkJCXJldHVybiBEZWZhdWx0VHJhbnNsYXRvckZhY3RvcnkuSU5TVEFOQ0U7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzRW51bUZlYXR1cmUoKSB7CisJCXJldHVybiBmZWF0dXJlICE9IG51bGwgJiYgRUNPUkVfUEFDS0FHRS5nZXRFRW51bSgpLmlzSW5zdGFuY2UoZmVhdHVyZS5nZXRFVHlwZSgpKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1Vuc2V0dGFibGUoKSB7CisJCXJldHVybiBmZWF0dXJlICE9IG51bGwgJiYgZmVhdHVyZS5pc1Vuc2V0dGFibGUoKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0RhdGFUeXBlKCkgeworCQlyZXR1cm4gZmVhdHVyZSAhPSBudWxsICYmIGZlYXR1cmUuZ2V0RVR5cGUoKSBpbnN0YW5jZW9mIEVEYXRhVHlwZTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNDb21tZW50KCkgeworCQlyZXR1cm4gKGZTdHlsZSAmIENPTU1FTlRfRkVBVFVSRSkgIT0gMDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1RyYW5zbGF0b3JGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1RyYW5zbGF0b3JGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTIwNjdkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvckZpbHRlci5qYXZhCkBAIC0wLDAgKzEsMjIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCisgKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQ3JlYXRlZCBvbiBTZXAgMjEsIDIwMDMKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworCisKKy8qCisgKiBUcmFuc2xhdG9yIGZpbHRlcnMgY2FuIGJlIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIE9iamVjdCBhbmQgQXR0cmlidXRlIFRyYW5zbGF0b3JzIHdpdGhvdXQKKyAqIGJyZWFraW5nIHRoZW0gb3V0IGludG8gc2VwZXJhdGUgZGF0YSBzdHJ1Y3R1cmVzLiBUaGUgRmlsdGVyIHdpbGwgcmVseSBvbiB0aGUgdW5kZXJseWluZyBkYXRhCisgKiBzdHJ1Y3R1cmUgdXNlZCB0byBzdG9yZSB0aGUgY2hpbGRyZW4gb2YgdGhlIGdpdmVuIFRyYW5zbGF0b3IuCisgKiAKKyAqIGdldE5leHRDaGlsZCgpIHdpbGwgcmV0dXJuIG51bGwgd2hlbiBubyBvdGhlciB0cmFuc2xhdG9ycyBvZiB0aGUgZ2l2ZW4gZ2VucmUgYXJlIGF2YWlsYWJsZS4KKyAqIAorICogVGhlIHByb2Nlc3NpbmcgaGludHMgd2hpY2ggYXJlIGNyZWF0ZWQgYW5kIHRoZW4gcGFzc2VkIHRvIGdldE5leHQqVHJhbnNsYXRvcigpIHN0b3JlIGluZm9ybWF0aW9uCisgKiB0aGF0IG5lZWRzIHRvIGJlIHBlcnNpc3RlZCBiZXR3ZWVuIGNhbGxzLiBUaGUgY3JlYXRlUHJvY2Vzc2luZ0hpbnRzKCkgd2lsbCBjcmVhdGUgYSBwcm9wZXJseQorICogaW5pdGlhbGl6ZWQgYXJyYXkuIFRoZSBjb25zdGFudHMgTkVYVF9TVEFSVF9ISU5UX0lORFggYW5kIE1PREVfSElOVF9JTkRYIHByb3ZpZGUgcG9pbnRlcnMgaW50bworICogdGhlIGFycmF5IGZvciB0aGUgTkVYVF9TVEFSVCBwb3NpdGlvbiBhbmQgdGhlIHByb3BlciBtb2RlIHRvIG9wZXJhdGUgaW4KKyAqIChTVEFOREFSRF9UUkFOU0xBVE9SU19NT0RFIG9yCisgKiAgCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUcmFuc2xhdG9yRmlsdGVyIHsKKworCXByb3RlY3RlZCBmaW5hbCBUcmFuc2xhdG9yIHRyYW5zbGF0b3I7CisJcHJvdGVjdGVkIGZpbmFsIGludCB2ZXJzaW9uOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkVYVF9TVEFSVF9ISU5UX0lORFggPSAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfSElOVF9JTkRYID0gMTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQU5EQVJEX1RSQU5TTEFUT1JTX01PREUgPSAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBUklBQkxFX1RSQU5TTEFUT1JTX01PREUgPSAxOworCisJLyoKKwkgKiBUaGVzZSBUcmFuc2xhdG9yRmlsdGVycyBhcmUgdXNlZCBpbiBhIHN0YXRlbGVzcyBtb2RlLiBPbmx5IHRoZWlyIHNjYW5OZXh0VHJhbnNsYXRvcigpIG1ldGhvZHMKKwkgKiB3aWxsIGJlIGludm9rZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yRmlsdGVyIG9iamVjdFRyYW5zbGF0b3JGaWx0ZXIgPSBuZXcgT2JqZWN0VHJhbnNsYXRvckZpbHRlcihudWxsLCAtMSk7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvckZpbHRlciBhdHRyaWJ1dGVUcmFuc2xhdG9yRmlsdGVyID0gbmV3IEF0dHJpYnV0ZVRyYW5zbGF0b3JGaWx0ZXIobnVsbCwgLTEpOworCisKKwlwcm90ZWN0ZWQgaW50IG1vZGUgPSBTVEFOREFSRF9UUkFOU0xBVE9SU19NT0RFOworCXByb3RlY3RlZCBpbnQgaW5kZXggPSAtMTsKKworCXByb3RlY3RlZCBUcmFuc2xhdG9yIGNhY2hlZFBlZWtBaGVhZFRyYW5zbGF0b3IgPSBudWxsOworCisJcHVibGljIFRyYW5zbGF0b3JGaWx0ZXIoVHJhbnNsYXRvciB0cmFucywgaW50IHZlcnNpb24pIHsKKwkJdGhpcy50cmFuc2xhdG9yID0gdHJhbnM7CisJCXRoaXMudmVyc2lvbiA9IHZlcnNpb247CisJfQorCisJLyoqCisJICogQ2FsbGluZyBwZWVrIHR3aWNlIHdpbGwgYWR2YW5jZSB0aGUgY3VycmVudCBjaGlsZAorCSAqLworCXB1YmxpYyBUcmFuc2xhdG9yIHBlZWtOZXh0Q2hpbGQoRU9iamVjdCB0YXJnZXQpIHsKKwkJY2FjaGVkUGVla0FoZWFkVHJhbnNsYXRvciA9IGdldE5leHRDaGlsZCh0YXJnZXQpOworCQlyZXR1cm4gY2FjaGVkUGVla0FoZWFkVHJhbnNsYXRvcjsKKwl9CisKKwkvKioKKwkgKiBnZXROZXh0Q2hpbGQoKSB3aWxsIHJldHVybiBudWxsIHdoZW4gbm8gb3RoZXIgdHJhbnNsYXRvcnMgb2YgdGhlIGdpdmVuIGdlbnJlIGFyZSBhdmFpbGFibGUuCisJICovCisJcHVibGljIFRyYW5zbGF0b3IgZ2V0TmV4dENoaWxkKEVPYmplY3QgdGFyZ2V0KSB7CisKKwkJVHJhbnNsYXRvciByZXN1bHQgPSBudWxsOworCQlpZiAoY2FjaGVkUGVla0FoZWFkVHJhbnNsYXRvciAhPSBudWxsKSB7CisJCQlyZXN1bHQgPSBjYWNoZWRQZWVrQWhlYWRUcmFuc2xhdG9yOworCQkJY2FjaGVkUGVla0FoZWFkVHJhbnNsYXRvciA9IG51bGw7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisKKwkJaW50IGZvdW5kID0gMDsKKwkJVHJhbnNsYXRvciBjaGlsZHJlbltdID0gbnVsbDsKKwkJc3dpdGNoIChtb2RlKSB7CisJCQljYXNlIFNUQU5EQVJEX1RSQU5TTEFUT1JTX01PREUgOgorCQkJCWNoaWxkcmVuID0gdGhpcy50cmFuc2xhdG9yLmdldENoaWxkcmVuKHRhcmdldCwgdGhpcy52ZXJzaW9uKTsKKworCQkJCS8qIExvb2sgZm9yIHRoZSBuZXh0IEF0dHJpYnV0ZSBUcmFuc2xhdG9yICovCisJCQkJZm91bmQgPSBzY2FuTmV4dFRyYW5zbGF0b3IoY2hpbGRyZW4sIHRoaXMuaW5kZXgpOworCisJCQkJaWYgKGZvdW5kID49IDApIHsKKwkJCQkJLyoKKwkJCQkJICogSWYgZm91bmQsICgxKSB1cGRhdGUgdGhlIHJlc3VsdCwgKDIpIHVwZGF0ZSB0aGUgaW5kZXggc28gd2UgY2FuIHNraXAgYWhlYWQgb24KKwkJCQkJICogdGhlIG5leHQgaW52b2NhdGlvbiAoMykgZXNjYXBlIHRoZSBWQVJJQUJMRV9UUkFOU0xBVE9SUyBwcm9jZXNzaW5nCisJCQkJCSAqLworCQkJCQlyZXN1bHQgPSBjaGlsZHJlbltmb3VuZF07CisJCQkJCXRoaXMuaW5kZXggPSBmb3VuZDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8qCisJCQkJICogUmVzZXQgdGhlIGluZGV4LiBETyBOT1QgQlJFQUsuIEFsbG93IGVudHJ5IGludG8gVkFSSUFCTEVfVFJBTlNMQVRPUlMgY2FzZQorCQkJCSAqLworCQkJCXRoaXMuaW5kZXggPSAtMTsKKwkJCQkvKgorCQkJCSAqIHVwZGF0ZSB0aGUgbW9kZSB0byBWQVJJQUJMRV9UUkFOU0xBVE9SUyBzbyB3ZSBjYW4gc2tpcCB0byBpdCBkaXJlY3RseSBuZXh0IHRpbWUKKwkJCQkgKi8KKwkJCQl0aGlzLm1vZGUgPSBWQVJJQUJMRV9UUkFOU0xBVE9SU19NT0RFOworCQkJY2FzZSBWQVJJQUJMRV9UUkFOU0xBVE9SU19NT0RFIDoKKwkJCQljaGlsZHJlbiA9IHRoaXMudHJhbnNsYXRvci5nZXRWYXJpYWJsZUNoaWxkcmVuKHRhcmdldCwgdGhpcy52ZXJzaW9uKTsKKwkJCQlmb3VuZCA9IHNjYW5OZXh0VHJhbnNsYXRvcihjaGlsZHJlbiwgdGhpcy5pbmRleCk7CisJCQkJaWYgKGZvdW5kID49IDApIHsKKwkJCQkJLyoKKwkJCQkJICogSWYgZm91bmQsICgxKSB1cGRhdGUgdGhlIHJlc3VsdCwgKDIpIHVwZGF0ZSB0aGUgaW5kZXggc28gd2UgY2FuIHNraXAgYWhlYWQgb24KKwkJCQkJICogdGhlIG5leHQgaW52b2NhdGlvbgorCQkJCQkgKi8KKwkJCQkJcmVzdWx0ID0gY2hpbGRyZW5bZm91bmRdOworCQkJCQl0aGlzLmluZGV4ID0gZm91bmQ7CisJCQkJfQorCisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gY3JlYXRlUHJvY2Vzc2luZ0hpbnRzKCkgeworCQlyZXR1cm4gbmV3IGludFtdey0xLCBTVEFOREFSRF9UUkFOU0xBVE9SU19NT0RFfTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgZ2V0TmV4dEF0dHJpYnV0ZVRyYW5zbGF0b3IoVHJhbnNsYXRvciB0cmFuc2xhdG9yLCBpbnQgc3RhcnRIaW50LCBpbnRbXSBuZXh0SGludCwgRU9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uKSB7CisKKwkJcmV0dXJuIFRyYW5zbGF0b3JGaWx0ZXIuZ2V0TmV4dENoaWxkKHRyYW5zbGF0b3IsIHN0YXJ0SGludCwgbmV4dEhpbnQsIHRhcmdldCwgdmVyc2lvbiwgYXR0cmlidXRlVHJhbnNsYXRvckZpbHRlcik7CisJfQorCisJcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIGdldE5leHRPYmplY3RUcmFuc2xhdG9yKFRyYW5zbGF0b3IgdHJhbnNsYXRvciwgaW50IHN0YXJ0SGludCwgaW50W10gbmV4dEhpbnQsIEVPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbikgeworCisJCXJldHVybiBUcmFuc2xhdG9yRmlsdGVyLmdldE5leHRDaGlsZCh0cmFuc2xhdG9yLCBzdGFydEhpbnQsIG5leHRIaW50LCB0YXJnZXQsIHZlcnNpb24sIG9iamVjdFRyYW5zbGF0b3JGaWx0ZXIpOworCX0KKworCS8qKgorCSAqIGdldE5leHRDaGlsZCgpIHRha2VzIGhpbnRzIG9uIHdoZXJlIHRvIGJlZ2luIGluIHRoZSBjaGlsZHJlbiBhcnJheSBvZiB0aGUgZ2l2ZW4gVHJhbnNsYXRvci4KKwkgKiBXaGVuIGl0IGZpbmRzIHRoZSB0cmFuc2xhdG9yLCBpdCB3aWxsIHVwZGF0ZSB0aGUgaGludHMgYXJyYXkgd2l0aCB0aGUgc3RhcnQgaGludCBmb3IgdGhlIG5leHQKKwkgKiBpbnZvY2F0aW9uKGhpbnRzWzBdKSBhbmQgd2hlbiBuZWNlc3NhcnkgaXQgd2lsbCB1c2UgdXBkYXRlIHRoZSBtb2RlIChoaW50c1sxXSkgdG8gZWl0aGVyCisJICogU1RBTkRBUkRfVFJBTlNMQVRPUlMgb3IgVkFSSUFCTEVfVFJBTlNMQVRPUlMuCisJICogCisJICogQHBhcmFtIHRyYW5zbGF0b3IKKwkgKiBAcGFyYW0gc3RhcnRIaW50CisJICogQHBhcmFtIGhpbnRzCisJICogICAgICAgICAgICBhIHR3by1lbGVtZW50IGFycmF5OiBoaW50c1swXSB3aWxsIGJlIHVwZGF0ZWQgd2l0aCB0aGUgbmV4dCBzdGFydEhpbnQgYW5kIGhpbnRzWzFdCisJICogICAgICAgICAgICB3aWxsIGJlIHVzZWQgdG8gc3RvcmUgdGhlIG1vZGUuCisJICogQHBhcmFtIHRhcmdldAorCSAqIEBwYXJhbSB2ZXJzaW9uCisJICogQHBhcmFtIHRyYW5zbGF0b3JGaWx0ZXIKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yIGdldE5leHRDaGlsZChUcmFuc2xhdG9yIHRyYW5zbGF0b3IsIGludCBzdGFydEhpbnQsIGludFtdIGhpbnRzLCBFT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb24sIFRyYW5zbGF0b3JGaWx0ZXIgdHJhbnNsYXRvckZpbHRlcikgeworCisJCVRyYW5zbGF0b3IgcmVzdWx0ID0gbnVsbDsKKworCQlpbnQgaW5kZXggPSBzdGFydEhpbnQ7CisJCVRyYW5zbGF0b3IgY2hpbGRyZW5bXSA9IG51bGw7CisKKwkJc3dpdGNoIChoaW50c1tNT0RFX0hJTlRfSU5EWF0pIHsKKwkJCWNhc2UgU1RBTkRBUkRfVFJBTlNMQVRPUlNfTU9ERSA6CisJCQkJY2hpbGRyZW4gPSB0cmFuc2xhdG9yLmdldENoaWxkcmVuKHRhcmdldCwgdmVyc2lvbik7CisJCQkJaWYgKGNoaWxkcmVuICE9IG51bGwgJiYgc3RhcnRIaW50IDwgY2hpbGRyZW4ubGVuZ3RoKSB7CisKKwkJCQkJLyogTG9vayBmb3IgdGhlIG5leHQgQXR0cmlidXRlIFRyYW5zbGF0b3IgKi8KKwkJCQkJaW5kZXggPSB0cmFuc2xhdG9yRmlsdGVyLnNjYW5OZXh0VHJhbnNsYXRvcihjaGlsZHJlbiwgaW5kZXgpOworCisJCQkJCWlmIChpbmRleCA+PSAwKSB7CisJCQkJCQkvKgorCQkJCQkJICogSWYgZm91bmQsICgxKSB1cGRhdGUgdGhlIHJlc3VsdCwgKDIpIHVwZGF0ZSB0aGUgaW5kZXggc28gd2UgY2FuIHNraXAKKwkJCQkJCSAqIGFoZWFkIG9uIHRoZSBuZXh0IGludm9jYXRpb24gKDMpIGVzY2FwZSB0aGUgVkFSSUFCTEVfVFJBTlNMQVRPUlMKKwkJCQkJCSAqIHByb2Nlc3NpbmcKKwkJCQkJCSAqLworCQkJCQkJcmVzdWx0ID0gY2hpbGRyZW5baW5kZXhdOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJLyoKKwkJCQkJICogRE8gTk9UIEJSRUFLIHdlIHdpbGwgZGVmYXVsdCB0byBWQVJJQUJMRSBUUkFOU0xBVE9SUyBNT0RFIHNvIHdlIG11c3QgcmVzZXQKKwkJCQkJICogdGhlIHN0YXJ0SGludCBhcHByb3ByaWF0ZWx5CisJCQkJCSAqLworCQkJCQlzdGFydEhpbnQgPSAtMTsKKwkJCQl9CisKKwkJCWNhc2UgVkFSSUFCTEVfVFJBTlNMQVRPUlNfTU9ERSA6CisJCQkJaGludHNbTU9ERV9ISU5UX0lORFhdID0gVkFSSUFCTEVfVFJBTlNMQVRPUlNfTU9ERTsKKwkJCQkvKgorCQkJCSAqIFJlc2V0IHRoZSBpbmRleC4KKwkJCQkgKi8KKwkJCQlpbmRleCA9IHN0YXJ0SGludDsKKwkJCQljaGlsZHJlbiA9IHRyYW5zbGF0b3IuZ2V0VmFyaWFibGVDaGlsZHJlbih0YXJnZXQsIHZlcnNpb24pOworCQkJCWlmIChjaGlsZHJlbiAhPSBudWxsICYmIGNoaWxkcmVuLmxlbmd0aCA+IDAgJiYgc3RhcnRIaW50IDwgY2hpbGRyZW4ubGVuZ3RoKSB7CisJCQkJCWluZGV4ID0gdHJhbnNsYXRvckZpbHRlci5zY2FuTmV4dFRyYW5zbGF0b3IoY2hpbGRyZW4sIGluZGV4KTsKKwkJCQkJcmVzdWx0ID0gKGluZGV4ID49IDApID8gY2hpbGRyZW5baW5kZXhdIDogbnVsbDsKKwkJCQl9CisJCX0KKworCQloaW50c1tORVhUX1NUQVJUX0hJTlRfSU5EWF0gPSAocmVzdWx0ID09IG51bGwgJiYgY2hpbGRyZW4gIT0gbnVsbCkgPyBjaGlsZHJlbi5sZW5ndGggOiBpbmRleDsKKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCisJcHVibGljIGFic3RyYWN0IGludCBzY2FuTmV4dFRyYW5zbGF0b3IoVHJhbnNsYXRvcltdIGNoaWxkcmVuLCBpbnQgc3RhcnQpOworCisJLyoqCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7CisJCXJldHVybiBpbmRleDsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIGludCBnZXRNb2RlKCkgeworCQlyZXR1cm4gbW9kZTsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yUGF0aC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvclBhdGguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmQ4NDNlCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvclBhdGguamF2YQpAQCAtMCwwICsxLDk0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCisgKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOworCisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworCisKK3B1YmxpYyBjbGFzcyBUcmFuc2xhdG9yUGF0aCB7CisJcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBtYXBJbmZvUGF0aDsKKworCS8qKgorCSAqIENvbnN0cnVjdCB3aXRoIGFuIGFycmF5IG9mIFRyYW5zbGF0b3IgdGhhdCBzcGVjaWZpZXMgdGhlIHBhdGggdG8gZm9sbG93IGZyb20gYW4gb2JqZWN0IHRvCisJICogYW5vdGhlciBvYmplY3QKKwkgKi8KKwlwdWJsaWMgVHJhbnNsYXRvclBhdGgoVHJhbnNsYXRvcltdIHBhdGgpIHsKKwkJbWFwSW5mb1BhdGggPSBwYXRoOworCX0KKworCXB1YmxpYyBMaXN0IGZpbmRPYmplY3RzKEVPYmplY3Qgc3RhcnRPYmplY3QpIHsKKwkJT2JqZWN0IGN1ciA9IHN0YXJ0T2JqZWN0OworCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcEluZm9QYXRoLmxlbmd0aDsgaSsrKSB7CisJCQlUcmFuc2xhdG9yIGN1ck1hcCA9IG1hcEluZm9QYXRoW2ldOworCQkJaWYgKGN1ciBpbnN0YW5jZW9mIEVPYmplY3QpIHsKKwkJCQlFU3RydWN0dXJhbEZlYXR1cmUgY3VyQXR0ciA9IGN1ck1hcC5nZXRGZWF0dXJlKCk7CisJCQkJaWYgKGN1ckF0dHIgPT0gVHJhbnNsYXRvci5DT05UQUlORVJfRkVBVFVSRSkgeworCQkJCQljdXJBdHRyID0gKChFT2JqZWN0KSBjdXIpLmVDb250YWlubWVudEZlYXR1cmUoKTsKKwkJCQkJY3VyID0gKChFT2JqZWN0KSBjdXIpLmVDb250YWluZXIoKTsKKwkJCQl9IGVsc2UgaWYgKGN1ckF0dHIgPT0gVHJhbnNsYXRvci5ST09UX0ZFQVRVUkUpIHsKKwkJCQkJY3VyID0gKChUcmFuc2xhdG9yUmVzb3VyY2UpIHN0YXJ0T2JqZWN0LmVSZXNvdXJjZSgpKS5nZXRSb290T2JqZWN0KCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJY3VyID0gKChFT2JqZWN0KSBjdXIpLmVHZXQoY3VyQXR0cik7CisJCQkJfQorCQkJCWlmIChjdXJNYXAuaXNNdWx0aVZhbHVlZCgpKSB7CisJCQkJCXJldHVybiAoTGlzdCkgY3VyOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgT2JqZWN0IGZpbmRPYmplY3QoRU9iamVjdCBzdGFydE9iamVjdCwgT2JqZWN0IG1hdGNoVmFsdWUpIHsKKwkJTGlzdCBvYmplY3RzID0gZmluZE9iamVjdHMoc3RhcnRPYmplY3QpOworCQlpZiAob2JqZWN0cyA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCXJldHVybiBmaW5kT2JqZWN0KG9iamVjdHMsIGdldExhc3RNYXAoKSwgbWF0Y2hWYWx1ZSk7CisJfQorCisJcHJpdmF0ZSBPYmplY3QgZmluZE9iamVjdChMaXN0IG9iamVjdExpc3QsIFRyYW5zbGF0b3IgbWFwLCBPYmplY3QgbWF0Y2hWYWx1ZSkgeworCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvYmplY3RMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworCQkJRU9iamVjdCBtb2ZPYmplY3QgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7CisJCQlPYmplY3QgY3VyTWF0Y2hWYWx1ZSA9IG1vZk9iamVjdC5lR2V0KG1hcC5nZXRGZWF0dXJlKCkpOworCQkJaWYgKG1hdGNoVmFsdWUuZXF1YWxzKGN1ck1hdGNoVmFsdWUpKQorCQkJCXJldHVybiBtb2ZPYmplY3Q7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIFRyYW5zbGF0b3IgZ2V0TGFzdE1hcCgpIHsKKwkJcmV0dXJuIG1hcEluZm9QYXRoW21hcEluZm9QYXRoLmxlbmd0aCAtIDFdOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCisJICovCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlTdHJpbmcgY24gPSBnZXRDbGFzcygpLmdldE5hbWUoKTsKKwkJaW50IGkgPSBjbi5sYXN0SW5kZXhPZignLicpOworCQljbiA9IGNuLnN1YnN0cmluZygrK2ksIGNuLmxlbmd0aCgpKTsKKwkJc2IuYXBwZW5kKGNuKTsKKwkJc2IuYXBwZW5kKCcoJyk7CisJCXNiLmFwcGVuZChtYXBJbmZvUGF0aFswXSk7CisJCWZvciAoaW50IGogPSAxOyBqIDwgbWFwSW5mb1BhdGgubGVuZ3RoOyBqKyspIHsKKwkJCXNiLmFwcGVuZCgnXG4nKTsKKwkJCXNiLmFwcGVuZChtYXBJbmZvUGF0aFtqXSk7CisJCX0KKwkJc2IuYXBwZW5kKCcpJyk7CisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1RyYW5zbGF0b3JSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvclJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJjOWM0NwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1RyYW5zbGF0b3JSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKKyAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7CisKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVN0cnVjdHVyYWxGZWF0dXJlSW1wbDsKK2ltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKKworcHVibGljIGludGVyZmFjZSBUcmFuc2xhdG9yUmVzb3VyY2UgZXh0ZW5kcyBSZWZlcmVuY2VkUmVzb3VyY2UgeworCS8qCisJICogbXVzdCBtYWtlIGEgc3ViY2xhc3MgYmVjYXVzZSB0aGUgY29uc3RydWN0b3IgZm9yIEVTdHJ1Y3R1cmFsRmVhdHVyZSBpcyBwcm90ZWN0ZWQKKwkgKi8KKwlzdGF0aWMgY2xhc3MgRG9jVHlwZUZlYXR1cmUgZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmVJbXBsIHsKKwkJcHJvdGVjdGVkIERvY1R5cGVGZWF0dXJlKCkgeworCQkJc3VwZXIoKTsKKwkJfQorCX0KKworCisJRVN0cnVjdHVyYWxGZWF0dXJlIERPQ19UWVBFX0ZFQVRVUkUgPSBuZXcgRG9jVHlwZUZlYXR1cmUoKTsKKworCS8qKgorCSAqIFRoZSBwdWJsaWMgaWQgb2YgdGhlIFhNTCBkb2N1bWVudCwgaWYgc3BlY2lmaWVkLgorCSAqLworCVN0cmluZyBnZXRQdWJsaWNJZCgpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBFTGlzdC4KKwkgKi8KKwlFT2JqZWN0IGdldFJvb3RPYmplY3QoKTsKKworCS8qKgorCSAqIFRoZSBzeXN0ZW0gaWQgb2YgdGhlIFhNTCBkb2N1bWVudCwgaWYgc3BlY2lmaWVkLgorCSAqLworCVN0cmluZyBnZXRTeXN0ZW1JZCgpOworCisJLyoqCisJICogU2V0cyB0aGUgcHVibGljIGlkIGFuZCBzeXN0ZW0gaWQgb2YgdGhlIFhNTCBkb2N1bWVudC4KKwkgKi8KKwl2b2lkIHNldERvY3R5cGVWYWx1ZXMoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpOworCisJLyoqCisJICogU2V0cyB0aGUgZGVmYXVsdCBwdWJsaWMvc3lzdGVtIGlkcyBpZiBuZWNlc3NhcnkKKwkgKi8KKwl2b2lkIHNldERlZmF1bHRzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBuYW1lIHRoYXQgd2lsbCBiZSBpbiB0aGUgZG9jdW1lbnQgdHlwZSBoZWFkZXIgb2YgdGhlIHNlcmlhbGl6ZWQgeG1sIGZpbGUKKwkgKi8KKwlTdHJpbmcgZ2V0RG9jdHlwZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgWE1MIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudAorCSAqLworCVN0cmluZyBnZXRYTUxWZXJzaW9uKCk7CisKKwlUcmFuc2xhdG9yIGdldFJvb3RUcmFuc2xhdG9yKCk7CisKKwkvKioKKwkgKiBFbnRpdHkgcmVzb2x2ZXIgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIHVzaW5nIHN0YW5kYXJkIHBhcnNlcnMgdG8gcmVhZCB0aGUgcmVzb3VyY2UKKwkgKi8KKwlFbnRpdHlSZXNvbHZlciBnZXRFbnRpdHlSZXNvbHZlcigpOworCisJYm9vbGVhbiB1c2VzRFREKCk7CisKKwlwdWJsaWMgaW50IGdldFZlcnNpb25JRCgpOworCisJdm9pZCBzZXRWZXJzaW9uSUQoaW50IGkpOworCisJUmVuZGVyZXIgZ2V0UmVuZGVyZXIoKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBhNDUwYgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1RyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCisgKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5IGV4dGVuZHMgUmVmZXJlbmNlZFhNSUZhY3RvcnlJbXBsIGltcGxlbWVudHMgUmVuZGVyZXJGYWN0b3J5Lkxpc3RlbmVyIHsKKworCXByb3RlY3RlZCBSZW5kZXJlckZhY3RvcnkgcmVuZGVyZXJGYWN0b3J5OworCXByaXZhdGUgYm9vbGVhbiBsaXN0ZW5pbmdGb3JVcGRhdGVzID0gZmFsc2U7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvciBmb3IgVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeS4KKwkgKi8KKwlwdWJsaWMgVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkgYVJlbmRlcmVyRmFjdG9yeSwgYm9vbGVhbiBsaXN0ZW5pbmdGb3JVcGRhdGVzKSB7CisJCXN1cGVyKCk7CisJCXJlbmRlcmVyRmFjdG9yeSA9IGFSZW5kZXJlckZhY3Rvcnk7CisJCXNldExpc3RlbmluZ0ZvclVwZGF0ZXMobGlzdGVuaW5nRm9yVXBkYXRlcyk7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0b3IgZm9yIFRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkuCisJICovCisJcHVibGljIFRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkoUmVuZGVyZXJGYWN0b3J5IGFSZW5kZXJlckZhY3RvcnkpIHsKKwkJdGhpcyhhUmVuZGVyZXJGYWN0b3J5LCB0cnVlKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRMaXN0ZW5pbmdGb3JVcGRhdGVzKGJvb2xlYW4gc2hvdWxkQmVMaXN0ZW5pbmdGb3JVcGRhdGVzKSB7CisKKwkJaWYgKHRoaXMubGlzdGVuaW5nRm9yVXBkYXRlcyBeIHNob3VsZEJlTGlzdGVuaW5nRm9yVXBkYXRlcykgeworCQkJaWYgKCFzaG91bGRCZUxpc3RlbmluZ0ZvclVwZGF0ZXMpCisJCQkJUmVuZGVyZXJGYWN0b3J5Lk5vdGlmaWNhdGlvbkVuZ2luZS5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKKwkJCWVsc2UKKwkJCQlSZW5kZXJlckZhY3RvcnkuTm90aWZpY2F0aW9uRW5naW5lLmFkZExpc3RlbmVyKHRoaXMpOworCisJCQl0aGlzLmxpc3RlbmluZ0ZvclVwZGF0ZXMgPSBzaG91bGRCZUxpc3RlbmluZ0ZvclVwZGF0ZXM7CisJCX0KKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0xpc3RlbmluZ0ZvclVwZGF0ZXMoKSB7CisJCXJldHVybiB0aGlzLmxpc3RlbmluZ0ZvclVwZGF0ZXM7CisJfQorCisJcHVibGljIFJlc291cmNlIGRvQ3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgeworCQlSZW5kZXJlciBhUmVuZGVyZXIgPSByZW5kZXJlckZhY3RvcnkuY3JlYXRlUmVuZGVyZXIoKTsKKwkJcmV0dXJuIGNyZWF0ZVJlc291cmNlKHVyaSwgYVJlbmRlcmVyKTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXJGYWN0b3J5Lkxpc3RlbmVyI3VwZGF0ZVJlbmRlcmVyRmFjdG9yeShjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyRmFjdG9yeSkKKwkgKi8KKwlwdWJsaWMgdm9pZCB1cGRhdGVSZW5kZXJlckZhY3RvcnkoUmVuZGVyZXJGYWN0b3J5IG5ld1JlbmRlcmVyRmFjdG9yeSkgeworCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiVXBkYXRpbmcgcmVuZGVyZXIgZmFjdG9yeSIpOworCQlyZW5kZXJlckZhY3RvcnkgPSBuZXdSZW5kZXJlckZhY3Rvcnk7CisJfQorCisJcHJvdGVjdGVkIGFic3RyYWN0IFRyYW5zbGF0b3JSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpLCBSZW5kZXJlciBhUmVuZGVyZXIpOworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvclJlc291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVHJhbnNsYXRvclJlc291cmNlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMDk0MzQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9UcmFuc2xhdG9yUmVzb3VyY2VJbXBsLmphdmEKQEAgLTAsMCArMSwzOTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuU3RyaW5nVXRpbDsKK2ltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIFRyYW5zbGF0b3JSZXNvdXJjZUltcGwgZXh0ZW5kcyBSZWZlcmVuY2VkWE1JUmVzb3VyY2VJbXBsIGltcGxlbWVudHMgVHJhbnNsYXRvclJlc291cmNlLCBJUm9vdE9iamVjdFJlc291cmNleworCXN0YXRpYyBmaW5hbCBwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIElEX0ZFQVRVUkUgPSBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVDbGFzc19FSURBdHRyaWJ1dGUoKTsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VOQ09ESU5HID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVkVSU0lPTiA9ICIxLjAiOyAvLyROT04tTkxTLTEkCisJcHJvdGVjdGVkIFJlbmRlcmVyIHJlbmRlcmVyOworCS8qKgorCSAqIFRoZSBwdWJsaWMgSWQgdG8gdXNlIGF0IHRoZSBoZWFkIG9mIHRoZSBkb2N1bWVudC4KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHB1YmxpY0lkOworCS8qKgorCSAqIFRoZSBzeXN0ZW0gSWQgdG8gdXNlIGF0IHRoZSBoZWFkIG9mIHRoZSBkb2N1bWVudC4KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHN5c3RlbUlkOworCXByb3RlY3RlZCBTdHJpbmcgeG1sVmVyc2lvbjsKKwkvLyBEZWZhdWx0IHRoZSByZXNvdXJjZXMgdG8gSjJFRSAxLjQKKwlwcm90ZWN0ZWQgaW50IHZlcnNpb25JRDsKKworCS8qKgorCSAqIEBkZXByZWNhdGVkIHNpbmNlIDQvMjkvMjAwMyAtIHVzZWQgZm9yIGNvbXBhdGliaWxpdHkgU3ViY2xhc3NlcyBzaG91bGQKKwkgKiAgICAgICAgICAgICBiZSB1c2luZyB0aGUgUmVuZGVyZXJzIGFuZCB0cmFuc2xhdG9yIGZyYW1ld29yaworCSAqLworCXB1YmxpYyBUcmFuc2xhdG9yUmVzb3VyY2VJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIEBkZXByZWNhdGVkIHNpbmNlIDQvMjkvMjAwMyAtIHVzZWQgZm9yIGNvbXBhdGliaWxpdHkgU3ViY2xhc3NlcyBzaG91bGQKKwkgKiAgICAgICAgICAgICBiZSB1c2luZyB0aGUgUmVuZGVyZXJzIGFuZCB0cmFuc2xhdG9yIGZyYW1ld29yaworCSAqLworCXB1YmxpYyBUcmFuc2xhdG9yUmVzb3VyY2VJbXBsKFVSSSB1cmkpIHsKKwkJc3VwZXIodXJpKTsKKwl9CisKKwlwdWJsaWMgVHJhbnNsYXRvclJlc291cmNlSW1wbChVUkkgdXJpLCBSZW5kZXJlciBhUmVuZGVyZXIpIHsKKwkJc3VwZXIodXJpKTsKKwkJc2V0UmVuZGVyZXIoYVJlbmRlcmVyKTsKKwkJdmVyc2lvbklEID0gZ2V0RGVmYXVsdFZlcnNpb25JRCgpOworCX0KKworCXB1YmxpYyBUcmFuc2xhdG9yUmVzb3VyY2VJbXBsKFJlbmRlcmVyIGFSZW5kZXJlcikgeworCQlzdXBlcigpOworCQlzZXRSZW5kZXJlcihhUmVuZGVyZXIpOworCX0KKworCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEVuY29kaW5nKCkgeworCQlpZiAoc3VwZXIuZ2V0RW5jb2RpbmcoKSA9PSBudWxsKQorCQkJc2V0RW5jb2RpbmcoREVGQVVMVF9FTkNPRElORyk7CisJCXJldHVybiBzdXBlci5nZXRFbmNvZGluZygpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKSB7CisJCXJldHVybiBwdWJsaWNJZDsKKwl9CisJCisJLyoqCisJICogUmV0dXJuIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBFTGlzdC4KKwkgKi8KKwlwdWJsaWMgRU9iamVjdCBnZXRSb290T2JqZWN0KCkgeworCQlpZiAoY29udGVudHMgPT0gbnVsbCB8fCBjb250ZW50cy5pc0VtcHR5KCkpCisJCQlyZXR1cm4gbnVsbDsKKwkJcmV0dXJuIChFT2JqZWN0KSBnZXRDb250ZW50cygpLmdldCgwKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCkgeworCQlyZXR1cm4gc3lzdGVtSWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0RG9jdHlwZVZhbHVlcyhTdHJpbmcgYVB1YmxpY0lkLCBTdHJpbmcgYVN5c3RlbUlkKSB7CisJCWJvb2xlYW4gY2hhbmdlZCA9ICEoU3RyaW5nVXRpbC5zdHJpbmdzRXF1YWwocHVibGljSWQsIGFQdWJsaWNJZCkgJiYgU3RyaW5nVXRpbC5zdHJpbmdzRXF1YWwoc3lzdGVtSWQsIGFTeXN0ZW1JZCkpOworCQlwdWJsaWNJZCA9IGFQdWJsaWNJZDsKKwkJc3lzdGVtSWQgPSBhU3lzdGVtSWQ7CisJCWlmIChjaGFuZ2VkKSB7CisJCQllTm90aWZ5KG5ldyBOb3RpZmljYXRpb25JbXBsKE5vdGlmaWNhdGlvbi5TRVQsIG51bGwsIG51bGwpIHsKKwkJCQlwdWJsaWMgT2JqZWN0IGdldEZlYXR1cmUoKSB7CisJCQkJCXJldHVybiBET0NfVFlQRV9GRUFUVVJFOworCQkJCX0KKworCQkJCXB1YmxpYyBPYmplY3QgZ2V0Tm90aWZpZXIoKSB7CisJCQkJCXJldHVybiBUcmFuc2xhdG9yUmVzb3VyY2VJbXBsLnRoaXM7CisJCQkJfQorCQkJfSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB4bWxWZXJzaW9uLgorCSAqIAorCSAqIEByZXR1cm4gU3RyaW5nCisJICovCisJcHVibGljIFN0cmluZyBnZXRYTUxWZXJzaW9uKCkgeworCQlpZiAoeG1sVmVyc2lvbiA9PSBudWxsKQorCQkJeG1sVmVyc2lvbiA9IERFRkFVTFRfVkVSU0lPTjsKKwkJcmV0dXJuIHhtbFZlcnNpb247CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgeG1sVmVyc2lvbi4KKwkgKiAKKwkgKiBAcGFyYW0geG1sVmVyc2lvbgorCSAqICAgICAgICAgICAgVGhlIHhtbFZlcnNpb24gdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0WE1MVmVyc2lvbihTdHJpbmcgeG1sVmVyc2lvbikgeworCQl0aGlzLnhtbFZlcnNpb24gPSB4bWxWZXJzaW9uOworCX0KKworCXByb3RlY3RlZCB2b2lkIGJhc2ljRG9Mb2FkKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJLy8gbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQlib29sZWFuIGlzVHJhY2tpbmdNb2RzID0gaXNUcmFja2luZ01vZGlmaWNhdGlvbigpOworCQl0cnkgeworCQkJaWYgKGlzVHJhY2tpbmdNb2RzKQorCQkJCXNldFRyYWNraW5nTW9kaWZpY2F0aW9uKGZhbHNlKTsKKwkJCXJlbmRlcmVyLmRvTG9hZChpbnB1dFN0cmVhbSwgb3B0aW9ucyk7CisJCX0KKwkJZmluYWxseSB7CisJCQlpZiAoaXNUcmFja2luZ01vZHMpCisJCQkJc2V0VHJhY2tpbmdNb2RpZmljYXRpb24odHJ1ZSk7CisJCX0KKwkJLy8gbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJLy8gcmVjb3JkVGltZSgiTG9hZCIsIHN0YXJ0LCBlbmQpOworCX0KKworCXB1YmxpYyB2b2lkIHNhdmUoTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChyZW5kZXJlci51c2VTdHJlYW1zRm9ySU8oKSkgeworICAgICAgICAgICAgc3VwZXIuc2F2ZShvcHRpb25zKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5vdGlmeUFib3V0VG9TYXZlKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRvU2F2ZSgoT3V0cHV0U3RyZWFtKW51bGwsIG9wdGlvbnMpOworICAgICAgICAgICAgICAgIG5vdGlmeVNhdmVkKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICBub3RpZnlTYXZlRmFpbGVkKCk7CisgICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKElPRXhjZXB0aW9uKSBlOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigpLndyaXRlKGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm90aWZ5U2F2ZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworCisJLyoqCisJICogQHNlZSBjb20uaWJtLmV0b29scy54bWkuaGVscGVycy5Db21wYXRpYmlsaXR5WE1JUmVzb3VyY2VJbXBsI2RvU2F2ZShPdXRwdXRTdHJlYW0sCisJICogICAgICBNYXApCisJICovCisJcHVibGljIHZvaWQgZG9TYXZlKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkvLyBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCXJlbmRlcmVyLmRvU2F2ZShvdXRwdXRTdHJlYW0sIG9wdGlvbnMpOworCQlzZXRNb2RpZmllZChmYWxzZSk7CisJCS8vIGxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCS8vIHJlY29yZFRpbWUoIlNhdmUiLCBzdGFydCwgZW5kKTsKKwl9CisKKwkvLyBwcml2YXRlIHZvaWQgcmVjb3JkVGltZShTdHJpbmcgdHlwZSwgbG9uZyBzdGFydCwgbG9uZyBlbmQpIHsKKwkvLyBTeXN0ZW0ub3V0LnByaW50bG4ocmVuZGVyZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXHQiICsgdHlwZSArICJcdCIgKworCS8vIChlbmQgLSBzdGFydCkgKworCS8vICJcdFx0XHRtcyIgKyAiXHQiICsgKCggdGhpcy5nZXRWZXJzaW9uSUQoKSkgLyAxMC4wKSArICJcdCIgKyB0aGlzKTsKKwkvLyAvLyROT04tTkxTLTEkCisJLy8gLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAorCS8vIH0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbCNkb1VubG9hZCgpCisJICovCisJcHJvdGVjdGVkIHZvaWQgZG9VbmxvYWQoKSB7CisJCXJlbmRlcmVyLnByZVVubG9hZCgpOworCQlzdXBlci5kb1VubG9hZCgpOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKSArIGdldFVSSSgpLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVuZGVyZXIuCisJICogCisJICogQHJldHVybiBSZW5kZXJlcgorCSAqLworCXB1YmxpYyBSZW5kZXJlciBnZXRSZW5kZXJlcigpIHsKKwkJcmV0dXJuIHJlbmRlcmVyOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHJlbmRlcmVyLgorCSAqIAorCSAqIEBwYXJhbSByZW5kZXJlcgorCSAqICAgICAgICAgICAgVGhlIHJlbmRlcmVyIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlbmRlcmVyKFJlbmRlcmVyIHJlbmRlcmVyKSB7CisJCXRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjsKKwkJaWYgKHJlbmRlcmVyLmdldFJlc291cmNlKCkgIT0gdGhpcykKKwkJCXJlbmRlcmVyLnNldFJlc291cmNlKHRoaXMpOworCX0KKworCS8qKgorCSAqIEZvciBjb21wYXRpYmlsaXR5IG9mIG9sZCBzdWJ0eXBlIHJlc291cmNlcywgcmV0dXJucyB0aGUgc3VwZXIKKwkgKiBpbXBsZW1lbnRhdGlvbgorCSAqIAorCSAqIEByZXR1cm4KKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3QgcHJpbUdldENvbnRlbnRzKCkgeworCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudHMoKTsKKwl9CisKKwlwdWJsaWMgRUxpc3QgZ2V0Q29udGVudHMoKSB7CisJCXdhaXRGb3JSZXNvdXJjZVRvTG9hZElmTmVjZXNzYXJ5KCk7CisJCWlmIChjb250ZW50cyA9PSBudWxsKSB7CisJCQlpbml0aWFsaXplQ29udGVudHMoKTsKKwkJfQorCQlyZXR1cm4gY29udGVudHM7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNvbnRlbnRzKCkgeworCQljb250ZW50cyA9IG5ldyBSZXNvdXJjZUltcGwuQ29udGVudHNFTGlzdCgpIHsKKwkJCXB1YmxpYyBib29sZWFuIGFkZChPYmplY3Qgb2JqZWN0KSB7CisJCQkJcmVuZGVyZXIucHJlcGFyZVRvQWRkQ29udGVudHMoKTsKKwkJCQlyZXR1cm4gc3VwZXIuYWRkKG9iamVjdCk7CisJCQl9CisKKwkJCXB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKKwkJCQlyZW5kZXJlci5wcmVwYXJlVG9BZGRDb250ZW50cygpOworCQkJCXJldHVybiBzdXBlci5hZGRBbGwoY29sbGVjdGlvbik7CisJCQl9CisJCX07CisJfQorCisJcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoKSB7CisJCWlmIChzeXN0ZW1JZCAhPSBudWxsICYmIHB1YmxpY0lkICE9IG51bGwpCisJCQlyZXR1cm47CisJCVN0cmluZyBwdWJJZCA9IHB1YmxpY0lkID09IG51bGwgPyBnZXREZWZhdWx0UHVibGljSWQoKSA6IHB1YmxpY0lkOworCQlTdHJpbmcgc3lzSWQgPSBzeXN0ZW1JZCA9PSBudWxsID8gZ2V0RGVmYXVsdFN5c3RlbUlkKCkgOiBzeXN0ZW1JZDsKKwkJc2V0RG9jdHlwZVZhbHVlcyhwdWJJZCwgc3lzSWQpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbCNpbml0KCkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgeworCQlzdXBlci5pbml0KCk7CisJCXNldEVuY29kaW5nKERFRkFVTFRfRU5DT0RJTkcpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgbnVsbCBieSBkZWZhdWx0OyBzdWJjbGFzc2VzIGNhbiBvdmVycmlkZQorCSAqIAorCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5UcmFuc2xhdG9yUmVzb3VyY2UjY3JlYXRlRW50aXR5UmVzb2x2ZXIoKQorCSAqLworCXB1YmxpYyBFbnRpdHlSZXNvbHZlciBnZXRFbnRpdHlSZXNvbHZlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREZWZhdWx0UHVibGljSWQoKTsKKworCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RGVmYXVsdFN5c3RlbUlkKCk7CisKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IGdldERlZmF1bHRWZXJzaW9uSUQoKTsKKworCS8qKgorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgaW50IGdldFZlcnNpb25JRCgpIHsKKwkJcmV0dXJuIHZlcnNpb25JRDsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gaQorCSAqLworCXB1YmxpYyB2b2lkIHNldFZlcnNpb25JRChpbnQgaSkgeworCQl2ZXJzaW9uSUQgPSBpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5UcmFuc2xhdG9yUmVzb3VyY2UjdXNlc0RURCgpCisJICovCisJcHVibGljIGJvb2xlYW4gdXNlc0RURCgpIHsKKwkJcmV0dXJuIGdldFB1YmxpY0lkKCkgIT0gbnVsbCAmJiBnZXRTeXN0ZW1JZCgpICE9IG51bGw7CisJfQorCisJLyoqCisJICogT3ZlcnJpZGRlbiB0byBub3RpZnkgd2hlbiB0aGUgSUQgZ2V0cyBzZXQ7IG5lZWQgdGhpcyB0byBwdXNoIGl0IGludG8KKwkgKiB0aGUgcmVzb3VyY2UKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2Ujc2V0SUQoRU9iamVjdCwgU3RyaW5nKQorCSAqLworCXB1YmxpYyB2b2lkIHNldElEKEVPYmplY3QgZU9iamVjdCwgU3RyaW5nIGlkKSB7CisJCVN0cmluZyBvbGRJZCA9IGdldElEKGVPYmplY3QpOworCQlzdXBlci5zZXRJRChlT2JqZWN0LCBpZCk7CisJCWVPYmplY3QuZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCkgZU9iamVjdCwgTm90aWZpY2F0aW9uLlNFVCwgSURfRkVBVFVSRSwgb2xkSWQsIGlkKSk7CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2QgaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBleHRlbnQgYXNzb2NpYXRlZCB3aXRoIHRoZQorCSAqIHJlc291cmNlIGhhcyBiZWVuIG1vZGlmaWVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgaXQgd2FzIGxvYWRlZCBvciBzYXZlZC4KKwkgKiAKKwkgKiBAcmV0dXJuIGJvb2xlYW4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWVkKCkgeworCQlyZXR1cm4gc3VwZXIuaXNNb2RpZmllZCgpIHx8IHJlbmRlcmVyLmlzTW9kaWZpZWQoKTsKKwl9CisKKwkvKgorCSAqIE92ZXJyaWRlbiB0byBnaXZlIHRoZSByZW5kZXJlciBhIGhvb2sKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlZmVyZW5jZWRSZXNvdXJjZSNhY2Nlc3NGb3JXcml0ZSgpCisJICovCisJcHVibGljIHZvaWQgYWNjZXNzRm9yV3JpdGUoKSB7CisJCXJlbmRlcmVyLmFjY2Vzc0ZvcldyaXRlKCk7CisJCXN1cGVyLmFjY2Vzc0ZvcldyaXRlKCk7CisJfQorCisJLyoKKwkgKiBPdmVycmlkZW4gdG8gZ2l2ZSB0aGUgcmVuZGVyZXIgYSBob29rCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZWZlcmVuY2VkUmVzb3VyY2UjYWNjZXNzRm9yUmVhZCgpCisJICovCisJcHVibGljIHZvaWQgYWNjZXNzRm9yUmVhZCgpIHsKKwkJcmVuZGVyZXIuYWNjZXNzRm9yUmVhZCgpOworCQlzdXBlci5hY2Nlc3NGb3JSZWFkKCk7CisJfQorCisJcHVibGljIHZvaWQgcmVsZWFzZUZyb21SZWFkKCkgeworCQlyZW5kZXJlci5yZWxlYXNlRnJvbVJlYWQoKTsKKwkJc3VwZXIucmVsZWFzZUZyb21SZWFkKCk7CisJfQorCisJcHVibGljIHZvaWQgcmVsZWFzZUZyb21Xcml0ZSgpIHsKKwkJcmVuZGVyZXIucmVsZWFzZUZyb21Xcml0ZSgpOworCQlzdXBlci5yZWxlYXNlRnJvbVdyaXRlKCk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYud29ya2JlbmNoLlJlZmVyZW5jZWRYTUlSZXNvdXJjZUltcGwjcHJlRGVsZXRlKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBwcmVEZWxldGUoKSB7CisJCXN1cGVyLnByZURlbGV0ZSgpOworCQlyZW5kZXJlci5wcmVEZWxldGUoKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZCgpIHsKKwkJcmV0dXJuIHN1cGVyLmlzU2hhcmVkKCkgfHwgcmVuZGVyZXIuaXNTaGFyZWQoKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZEZvcldyaXRlKCkgeworCQlyZXR1cm4gc3VwZXIuaXNTaGFyZWRGb3JXcml0ZSgpIHx8IHJlbmRlcmVyLmlzU2hhcmVkRm9yV3JpdGUoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBsb2FkKE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkKKwkJCWlmIChpc0xvYWRlZCgpKQorCQkJCXJldHVybjsKKwkJCQorCQkJaWYgKHJlbmRlcmVyLnVzZVN0cmVhbXNGb3JJTygpKSB7CisJCQkJc3VwZXIubG9hZChvcHRpb25zKTsKKwkJCX0KKwkJCWVsc2UgaWYgKCFpc0xvYWRlZCgpKSB7CisJCQkJaXNTaGFyZWQoKTsKKwkJCQlsb2FkRXhpc3Rpbmcob3B0aW9ucyk7CisJCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVW5zdXBwb3J0ZWRGZWF0dXJlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9VbnN1cHBvcnRlZEZlYXR1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2M1ODY0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVW5zdXBwb3J0ZWRGZWF0dXJlLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQ3JlYXRlZCBvbiBBcHIgMTMsIDIwMDQKKyAqCisgKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KKyAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVBdHRyaWJ1dGVJbXBsOworCisvKioKKyAqIEBhdXRob3IgY2JyaWRnaGEKKyAqIAorICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0KKyAqIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCisgKi8KK3B1YmxpYyBjbGFzcyBVbnN1cHBvcnRlZEZlYXR1cmUgZXh0ZW5kcyBFQXR0cmlidXRlSW1wbCB7CisJLyoqCisJICogVGhpcyBpcyB1c2VkIHRvIGNhcHR1cmUgZmVhdHVyZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Vuc3VwcG9ydGVkKEVDbGFzcyBhbkVDbGFzcywgU3RyaW5nIGZlYXR1cmVOYW1lKSB7CisKKwkJaWYgKGZlYXR1cmVOYW1lLmVxdWFscygiaXNaZXJvUGFyYW1zIikgJiYgYW5FQ2xhc3MuZ2V0TmFtZSgpLmVxdWFscygiTWV0aG9kRWxlbWVudCIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCXJldHVybiB0cnVlOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIFVuc3VwcG9ydGVkRmVhdHVyZSgpIHsKKwkJc3VwZXIoKTsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1ZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1ZhcmlhYmxlVHJhbnNsYXRvckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTRlZWY5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvVmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIENyZWF0ZWQgb24gQXVnIDIwLCAyMDAzCisgKgorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7CisKKworLyoqCisgKiBAYXV0aG9yIHNjaGFjaGVyCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVmFyaWFibGVUcmFuc2xhdG9yRmFjdG9yeSB7CisJLyoqIFJldHVybnMgd2hldGhlciBhIFRyYW5zbGF0b3Igc2hvdWxkIGJlIGNyZWF0ZWQgZm9yIHRoZSBnaXZlbiBET00gbmFtZSAqLworCWJvb2xlYW4gYWNjZXB0cyhTdHJpbmcgZG9tTmFtZSk7CisKKwkvKiogUmV0dXJucyB3aGV0aGVyIGEgVHJhbnNsYXRvciBzaG91bGQgYmUgY3JlYXRlZCBmb3IgdGhlIGdpdmVuIGZlYXR1cmUgKi8KKwlib29sZWFuIGFjY2VwdHMoTm90aWZpY2F0aW9uIG5vdGlmKTsKKworCVRyYW5zbGF0b3IgY3JlYXRlKE5vdGlmaWNhdGlvbiBub3RpZik7CisKKwkvKiogQ3JlYXRlcyBhIG5ldyBUcmFuc2xhdG9yIGZvciB0aGUgRE9NIG5hbWUgKi8KKwlUcmFuc2xhdG9yIGNyZWF0ZShTdHJpbmcgZG9tTmFtZSk7CisKKwkvKiogQ3JlYXRlcyB2YXJpYWJsZSB0cmFuc2xhdG9ycyBmb3IgYW4gRU1GIG9iamVjdCB0byBiZSByZW5kZXJlZCAqLworCUxpc3QgY3JlYXRlKE5vdGlmaWVyIHRhcmdldCk7CisKKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3Jlc291cmNlL1hNTEVuY29kZXJEZWNvZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9YTUxFbmNvZGVyRGVjb2Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YjdmM2IKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi9yZXNvdXJjZS9YTUxFbmNvZGVyRGVjb2Rlci5qYXZhCkBAIC0wLDAgKzEsMTcwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIENyZWF0ZWQgb24gTWF5IDIwLCAyMDA0CisgKgorICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCisgKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cworICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlOworCisvKioKKyAqIEBhdXRob3IgbWRlbGRlcgorICogIAorICovCitwdWJsaWMgY2xhc3MgWE1MRW5jb2RlckRlY29kZXIgeworCisJLyoqCisJICogIAorCSAqLworCXB1YmxpYyBYTUxFbmNvZGVyRGVjb2RlcigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBJZGVudGlmaWVzIHRoZSBsYXN0IHByaW50YWJsZSBjaGFyYWN0ZXIgaW4gdGhlIFVuaWNvZGUgcmFuZ2UgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhlCisJICogZW5jb2RpbmcgdXNlZCB3aXRoIHRoaXMgc2VyaWFsaXplci4gRm9yIDgtYml0IGVuY29kaW5ncyB0aGlzIHdpbGwgYmUgZWl0aGVyIDB4N0Ugb3IgMHhGRi4gRm9yCisJICogMTYtYml0IGVuY29kaW5ncyB0aGlzIHdpbGwgYmUgMHhGRkZGLiBDaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBwcmludGFibGUgd2lsbCBiZSBlc2NhcGVkIHVzaW5nCisJICogY2hhcmFjdGVyIHJlZmVyZW5jZXMuCisJICovCisJcHJpdmF0ZSBpbnQgX2xhc3RQcmludGFibGUgPSAweEZGRkU7CisKKwlwcm90ZWN0ZWQgc3RhdGljIFhNTEVuY29kZXJEZWNvZGVyIF9zaW5nbGV0b247CisKKworCS8qKgorCSAqIFJldHVybnMgYSBkZWNvZGVkIHZlcnNpb24gb2YgdGhlIHZhbHVlLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZGVjb2RlKFN0cmluZyB2YWx1ZSkgeworCQkvLyBOT1RfSU1QTEVNRU5URUQKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCisJLyoqCisJICogRXNjYXBlcyBhIHN0cmluZyBzbyBpdCBtYXkgYmUgcHJpbnRlZCBhcyB0ZXh0IGNvbnRlbnQgb3IgYXR0cmlidXRlIHZhbHVlLiBOb24gcHJpbnRhYmxlCisJICogY2hhcmFjdGVycyBhcmUgZXNjYXBlZCB1c2luZyBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4gV2hlcmUgdGhlIGZvcm1hdCBzcGVjaWZpZXMgYSBkZWF1bHQgZW50aXR5CisJICogcmVmZXJlbmNlLCB0aGF0IHJlZmVyZW5jZSBpcyB1c2VkIChlLmcuIDx0dD4mYW1wO2x0OzwvdHQ+KS4KKwkgKiAKKwkgKiBAcGFyYW0gc291cmNlCisJICogICAgICAgICAgICBUaGUgc3RyaW5nIHRvIGVzY2FwZQorCSAqLworCXB1YmxpYyBjaGFyW10gZW5jb2RlKGNoYXJbXSB2YWx1ZSkgeworCQlib29sZWFuIHVubW9kaWZpZWQgPSB0cnVlOworCQlTdHJpbmdCdWZmZXIgc2J1ZiA9IG5ldyBTdHJpbmdCdWZmZXIodmFsdWUubGVuZ3RoKTsKKwkJU3RyaW5nIGNoYXJSZWYgPSBudWxsOworCQljaGFyIGNoOworCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgKytpKSB7CisJCQljaCA9IHZhbHVlW2ldOworCQkJLy8gSWYgdGhlcmUgaXMgYSBzdWl0YWJsZSBlbnRpdHkgcmVmZXJlbmNlIGZvciB0aGlzCisJCQkvLyBjaGFyYWN0ZXIsIHByaW50IGl0LiBUaGUgbGlzdCBvZiBhdmFpbGFibGUgZW50aXR5CisJCQkvLyByZWZlcmVuY2VzIGlzIGFsbW9zdCBidXQgbm90IGlkZW50aWNhbCBiZXR3ZWVuCisJCQkvLyBYTUwgYW5kIEhUTUwuCisJCQljaGFyUmVmID0gZ2V0RW50aXR5UmVmKGNoKTsKKwkJCWlmIChjaGFyUmVmICE9IG51bGwpIHsKKwkJCQlzYnVmLmFwcGVuZCgnJicpOworCQkJCXNidWYuYXBwZW5kKGNoYXJSZWYpOworCQkJCXNidWYuYXBwZW5kKCc7Jyk7CisJCQkJdW5tb2RpZmllZCA9IGZhbHNlOworCQkJfSBlbHNlIGlmICgoY2ggPj0gJyAnICYmIGNoIDw9IF9sYXN0UHJpbnRhYmxlICYmIGNoICE9IDB4RjcpIHx8IGNoID09ICdcbicgfHwgY2ggPT0gJ1xyJyB8fCBjaCA9PSAnXHQnKSB7CisJCQkJLy8gSWYgdGhlIGNoYXJhY3RlciBpcyBub3QgcHJpbnRhYmxlLCBwcmludCBhcyBjaGFyYWN0ZXIKKwkJCQkvLyByZWZlcmVuY2UuCisJCQkJLy8gTm9uIHByaW50YWJsZXMgYXJlIGJlbG93IEFTQ0lJIHNwYWNlIGJ1dCBub3QgdGFiIG9yIGxpbmUKKwkJCQkvLyB0ZXJtaW5hdG9yLCBBU0NJSSBkZWxldGUsIG9yIGFib3ZlIGEgY2VydGFpbiBVbmljb2RlCisJCQkJLy8gdGhyZXNob2xkLgorCQkJCXNidWYuYXBwZW5kKGNoKTsKKwkJCX0gZWxzZSB7CisJCQkJc2J1Zi5hcHBlbmQoIiYjIik7Ly8kTk9OLU5MUy0xJAorCQkJCXNidWYuYXBwZW5kKEludGVnZXIudG9TdHJpbmcoY2gpKTsKKwkJCQlzYnVmLmFwcGVuZCgnOycpOworCQkJCXVubW9kaWZpZWQgPSBmYWxzZTsKKwkJCX0KKwkJfQorCQlpZiAodW5tb2RpZmllZCkKKwkJCXJldHVybiB2YWx1ZTsKKwkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW3NidWYubGVuZ3RoKCldOworCQlzYnVmLmdldENoYXJzKDAsIHNidWYubGVuZ3RoKCksIHJlc3VsdCwgMCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogRXNjYXBlcyBhIHN0cmluZyBzbyBpdCBtYXkgYmUgcHJpbnRlZCBhcyB0ZXh0IGNvbnRlbnQgb3IgYXR0cmlidXRlIHZhbHVlLiBOb24gcHJpbnRhYmxlCisJICogY2hhcmFjdGVycyBhcmUgZXNjYXBlZCB1c2luZyBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4gV2hlcmUgdGhlIGZvcm1hdCBzcGVjaWZpZXMgYSBkZWF1bHQgZW50aXR5CisJICogcmVmZXJlbmNlLCB0aGF0IHJlZmVyZW5jZSBpcyB1c2VkIChlLmcuIDx0dD4mYW1wO2x0OzwvdHQ+KS4KKwkgKiAKKwkgKiBAcGFyYW0gc291cmNlCisJICogICAgICAgICAgICBUaGUgc3RyaW5nIHRvIGVzY2FwZQorCSAqLworCXB1YmxpYyBTdHJpbmcgZW5jb2RlKFN0cmluZyB2YWx1ZSkgeworCQlTdHJpbmdCdWZmZXIgc2J1ZiA9IG5ldyBTdHJpbmdCdWZmZXIodmFsdWUubGVuZ3RoKCkpOworCQlTdHJpbmcgY2hhclJlZiA9IG51bGw7CisJCWNoYXIgY2g7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoKCk7ICsraSkgeworCQkJY2ggPSB2YWx1ZS5jaGFyQXQoaSk7CisJCQkvLyBJZiB0aGVyZSBpcyBhIHN1aXRhYmxlIGVudGl0eSByZWZlcmVuY2UgZm9yIHRoaXMKKwkJCS8vIGNoYXJhY3RlciwgcHJpbnQgaXQuIFRoZSBsaXN0IG9mIGF2YWlsYWJsZSBlbnRpdHkKKwkJCS8vIHJlZmVyZW5jZXMgaXMgYWxtb3N0IGJ1dCBub3QgaWRlbnRpY2FsIGJldHdlZW4KKwkJCS8vIFhNTCBhbmQgSFRNTC4KKwkJCWNoYXJSZWYgPSBnZXRFbnRpdHlSZWYoY2gpOworCQkJaWYgKGNoYXJSZWYgIT0gbnVsbCkgeworCQkJCXNidWYuYXBwZW5kKCcmJyk7CisJCQkJc2J1Zi5hcHBlbmQoY2hhclJlZik7CisJCQkJc2J1Zi5hcHBlbmQoJzsnKTsKKwkJCX0gZWxzZSBpZiAoKGNoID49ICcgJyAmJiBjaCA8PSBfbGFzdFByaW50YWJsZSAmJiBjaCAhPSAweEY3KSB8fCBjaCA9PSAnXG4nIHx8IGNoID09ICdccicgfHwgY2ggPT0gJ1x0JykgeworCQkJCS8vIElmIHRoZSBjaGFyYWN0ZXIgaXMgbm90IHByaW50YWJsZSwgcHJpbnQgYXMgY2hhcmFjdGVyCisJCQkJLy8gcmVmZXJlbmNlLgorCQkJCS8vIE5vbiBwcmludGFibGVzIGFyZSBiZWxvdyBBU0NJSSBzcGFjZSBidXQgbm90IHRhYiBvciBsaW5lCisJCQkJLy8gdGVybWluYXRvciwgQVNDSUkgZGVsZXRlLCBvciBhYm92ZSBhIGNlcnRhaW4gVW5pY29kZQorCQkJCS8vIHRocmVzaG9sZC4KKwkJCQlzYnVmLmFwcGVuZChjaCk7CisJCQl9IGVsc2UgeworCQkJCXNidWYuYXBwZW5kKCImIyIpOy8vJE5PTi1OTFMtMSQKKwkJCQlzYnVmLmFwcGVuZChJbnRlZ2VyLnRvU3RyaW5nKGNoKSk7CisJCQkJc2J1Zi5hcHBlbmQoJzsnKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc2J1Zi50b1N0cmluZygpOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzY2FwZShTdHJpbmcgdmFsdWUpIHsKKwkJaWYgKF9zaW5nbGV0b24gPT0gbnVsbCkgeworCQkJX3NpbmdsZXRvbiA9IG5ldyBYTUxFbmNvZGVyRGVjb2RlcigpOworCQl9CisJCXJldHVybiBfc2luZ2xldG9uLmVuY29kZSh2YWx1ZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc3VpdGFibGUgZW50aXR5IHJlZmVyZW5jZSBmb3IgdGhpcyBjaGFyYWN0ZXIgdmFsdWUsIG9yIG51bGwgaWYgbm8gc3VjaCBlbnRpdHkKKwkgKiBleGlzdHMuIENhbGxpbmcgdGhpcyBtZXRob2Qgd2l0aCA8dHQ+JyZhbXA7JzwvdHQ+IHdpbGwgcmV0dXJuIDx0dD4iJmFtcDthbXA7IjwvdHQ+LgorCSAqIAorCSAqIEBwYXJhbSBjaAorCSAqICAgICAgICAgICAgQ2hhcmFjdGVyIHZhbHVlCisJICogQHJldHVybiBDaGFyYWN0ZXIgZW50aXR5IG5hbWUsIG9yIG51bGwKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldEVudGl0eVJlZihjaGFyIGNoKSB7CisJCS8vIEVuY29kZSBzcGVjaWFsIFhNTCBjaGFyYWN0ZXJzIGludG8gdGhlIGVxdWl2YWxlbnQgY2hhcmFjdGVyCisJCS8vIHJlZmVyZW5jZXMuCisJCS8vIFRoZXNlIGZpdmUgYXJlIGRlZmluZWQgYnkgZGVmYXVsdCBmb3IgYWxsIFhNTCBkb2N1bWVudHMuCisJCXN3aXRjaCAoY2gpIHsKKwkJCWNhc2UgJzwnIDoKKwkJCQlyZXR1cm4gImx0IjsvLyROT04tTkxTLTEkCisJCQljYXNlICc+JyA6CisJCQkJcmV0dXJuICJndCI7Ly8kTk9OLU5MUy0xJAorCQkJY2FzZSAnIicgOgorCQkJCXJldHVybiAicXVvdCI7Ly8kTk9OLU5MUy0xJAorCQkJY2FzZSAnXCcnIDoKKwkJCQlyZXR1cm4gImFwb3MiOy8vJE5PTi1OTFMtMSQKKwkJCWNhc2UgJyYnIDoKKwkJCQlyZXR1cm4gImFtcCI7Ly8kTk9OLU5MUy0xJAorCQl9CisJCXJldHVybiBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9BZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9BZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmU1NTliCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0FkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvci5qYXZhCkBAIC0wLDAgKzEsMTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKKworcHVibGljIGludGVyZmFjZSBBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IgeworCisJcHVibGljIEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZUFkYXB0ZXJGYWN0b3J5KCk7CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9BZGFwdGVyRmFjdG9yeVV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9BZGFwdGVyRmFjdG9yeVV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmQ5MTczCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0FkYXB0ZXJGYWN0b3J5VXRpbC5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOworCitwdWJsaWMgY2xhc3MgQWRhcHRlckZhY3RvcnlVdGlsIHsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yIGZvciBBZGFwdGVyRmFjdG9yeVV0aWwuCisJICovCisJcHVibGljIEFkYXB0ZXJGYWN0b3J5VXRpbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgYWRhcHROZXcoTm90aWZpZXIgbmV3T2JqZWN0LCBMaXN0IGZhY3RvcmllcykgeworCQlBZGFwdGVyRmFjdG9yeSBmYWN0OworCQlmb3IgKGludCBpID0gMDsgaSA8IGZhY3Rvcmllcy5zaXplKCk7IGkrKykgeworCQkJZmFjdCA9IChBZGFwdGVyRmFjdG9yeSkgZmFjdG9yaWVzLmdldChpKTsKKwkJCWZhY3QuYWRhcHROZXcobmV3T2JqZWN0LCBudWxsKTsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVBZGFwdGVyRmFjdG9yaWVzKExpc3QgZGVzY3JpcHRvcnMsIExpc3QgZmFjdG9yaWVzKSB7CisJCUFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvciBkZXNjOworCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5zaXplKCk7IGkrKykgeworCQkJZGVzYyA9IChBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IpIGRlc2NyaXB0b3JzLmdldChpKTsKKwkJCWFkYXB0ZXJGYWN0ID0gZGVzYy5jcmVhdGVBZGFwdGVyRmFjdG9yeSgpOworCQkJaWYgKGFkYXB0ZXJGYWN0ICE9IG51bGwpCisJCQkJZmFjdG9yaWVzLmFkZChhZGFwdGVyRmFjdCk7CisJCX0KKwkJZGVzY3JpcHRvcnMuY2xlYXIoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9BcnJheVV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9BcnJheVV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDdiODhkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0FycmF5VXRpbC5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKKyAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOworCisKKworcHVibGljIGNsYXNzIEFycmF5VXRpbCB7CisKKwlwdWJsaWMgc3RhdGljIE9iamVjdFtdIGNvbmNhdChPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5MikgeworCQlDbGFzcyBjb21wb25lbnRUeXBlID0gbnVsbDsKKwkJaWYgKGFycmF5MS5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKSA9PSBhcnJheTIuZ2V0Q2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCkpCisJCQljb21wb25lbnRUeXBlID0gYXJyYXkxLmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpOworCQllbHNlCisJCQljb21wb25lbnRUeXBlID0gT2JqZWN0LmNsYXNzOworCisJCXJldHVybiBjb25jYXQoYXJyYXkxLCBhcnJheTIsIGNvbXBvbmVudFR5cGUpOworCX0KKworCXB1YmxpYyBzdGF0aWMgT2JqZWN0W10gY29uY2F0KE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyLCBDbGFzcyBjb21wb25lbnRUeXBlKSB7CisJCU9iamVjdFtdIHJlc3VsdCA9IChPYmplY3RbXSkgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkubmV3SW5zdGFuY2UoY29tcG9uZW50VHlwZSwgYXJyYXkxLmxlbmd0aCArIGFycmF5Mi5sZW5ndGgpOworCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MSwgMCwgcmVzdWx0LCAwLCBhcnJheTEubGVuZ3RoKTsKKwkJU3lzdGVtLmFycmF5Y29weShhcnJheTIsIDAsIHJlc3VsdCwgYXJyYXkxLmxlbmd0aCwgYXJyYXkyLmxlbmd0aCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHVibGljIHN0YXRpYyBPYmplY3RbXSBjb25jYXRBbGwoamF2YS51dGlsLkxpc3QgYXJyYXlzLCBDbGFzcyBjb21wb25lbnRUeXBlKSB7CisJCWludCByZXN1bHRMZW5ndGggPSAwOworCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5cy5zaXplKCk7IGkrKykgeworCQkJcmVzdWx0TGVuZ3RoICs9ICgoT2JqZWN0W10pIGFycmF5cy5nZXQoaSkpLmxlbmd0aDsKKwkJfQorCQlPYmplY3RbXSByZXN1bHQgPSAoT2JqZWN0W10pIGphdmEubGFuZy5yZWZsZWN0LkFycmF5Lm5ld0luc3RhbmNlKGNvbXBvbmVudFR5cGUsIHJlc3VsdExlbmd0aCk7CisJCWludCBwb3MgPSAwOworCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5cy5zaXplKCk7IGkrKykgeworCQkJT2JqZWN0W10gYXJyYXkgPSAoT2JqZWN0W10pIGFycmF5cy5nZXQoaSk7CisJCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIHBvcywgYXJyYXkubGVuZ3RoKTsKKwkJCXBvcyArPSBhcnJheS5sZW5ndGg7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0Fzc2VydC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0Fzc2VydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNDQ3NTEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQXNzZXJ0LmphdmEKQEAgLTAsMCArMSwxMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7CisKKworCisvKioKKyAqIDxjb2RlPkFzc2VydDwvY29kZT4gaXMgdXNlZnVsIGZvciBmb3IgZW1iZWRkaW5nIHJ1bnRpbWUgc2FuaXR5IGNoZWNrcyBpbiBjb2RlLiBUaGUgcHJlZGljYXRlCisgKiBtZXRob2RzIGFsbCB0ZXN0IGEgY29uZGl0aW9uIGFuZCB0aHJvdyBzb21lIHR5cGUgb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpZiB0aGUgY29uZGl0aW9uIGRvZXMgbm90CisgKiBob2xkLgorICogPHA+CisgKiBBc3NlcnRpb24gZmFpbHVyZSBleGNlcHRpb25zLCBsaWtlIG1vc3QgcnVudGltZSBleGNlcHRpb25zLCBhcmUgdGhyb3duIHdoZW4gc29tZXRoaW5nIGlzCisgKiBtaXNiZWhhdmluZy4gQXNzZXJ0aW9uIGZhaWx1cmVzIGFyZSBpbnZhcmlhYmx5IHVuc3BlY2lmaWVkIGJlaGF2aW9yOyBjb25zZXF1ZW50bHksIGNsaWVudHMgc2hvdWxkCisgKiBuZXZlciByZWx5IG9uIHRoZXNlIGJlaW5nIHRocm93biAoYW5kIGNlcnRhaW5seSBzaG91bGQgbm90IGJlaW5nIGNhdGNoaW5nIHRoZW0gc3BlY2lmaWNhbGx5KS4KKyAqIDwvcD4KKyAqLworLy8gVGhpcyBjbGFzcyB3YXMsIG9yaWdpbmFsbHksIGNvcGllZCBkaXJlY3RseSBmcm9tIGNvbS5pYm0uaXRwLmNvbW1vbi4KKy8vIEl0IHdhcyBjb3BpZWQgdG8gb3VyIG93biBwYWNrYWdlIGp1c3QgdG8gbWluaW1pemUgbWlub3IgZGVwZW5kZW5jaWVzCisvLyBvbiBvdGhlciBwYWNrYWdlcyBhbmQgaW50ZXJuYWwgQVBJcy4KK3B1YmxpYyBmaW5hbCBjbGFzcyBBc3NlcnQgeworCS8qIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZC4gKi8KKworCXByaXZhdGUgQXNzZXJ0KCkgeworCX0KKworCS8qKgorCSAqIEFzc2VydHMgdGhhdCBhbiBhcmd1bWVudCBpcyBsZWdhbC4gSWYgdGhlIGdpdmVuIGJvb2xlYW4gaXMgbm90IDxjb2RlPnRydWU8L2NvZGU+LCBhbgorCSAqIDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY29kZT4gaXMgdGhyb3duLgorCSAqIAorCSAqIEBwYXJhbSBleHByZXNzaW9uCisJICogICAgICAgICAgICB0aGUgb3V0Y29kZSBvZiB0aGUgY2hlY2sKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybiBpZiB0aGUgY2hlY2sgZmFpbHMpCisJICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICAgICBpZiB0aGUgbGVnYWxpdHkgdGVzdCBmYWlsZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMZWdhbChib29sZWFuIGV4cHJlc3Npb24pIHsKKwkJcmV0dXJuIGlzTGVnYWwoZXhwcmVzc2lvbiwgIiIpOy8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBBc3NlcnRzIHRoYXQgYW4gYXJndW1lbnQgaXMgbGVnYWwuIElmIHRoZSBnaXZlbiBib29sZWFuIGlzIG5vdCA8Y29kZT50cnVlPC9jb2RlPiwgYW4KKwkgKiA8Y29kZT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NvZGU+IGlzIHRocm93bi4gVGhlIGdpdmVuIG1lc3NhZ2UgaXMgaW5jbHVkZWQgaW4gdGhhdAorCSAqIGV4Y2VwdGlvbiwgdG8gYWlkIGRlYnVnZ2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gZXhwcmVzc2lvbgorCSAqICAgICAgICAgICAgdGhlIG91dGNvZGUgb2YgdGhlIGNoZWNrCisJICogQHBhcmFtIG1lc3NhZ2UKKwkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIHBhc3NlcyAoZG9lcyBub3QgcmV0dXJuIGlmIHRoZSBjaGVjayBmYWlscykKKwkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBsZWdhbGl0eSB0ZXN0IGZhaWxlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xlZ2FsKGJvb2xlYW4gZXhwcmVzc2lvbiwgU3RyaW5nIG1lc3NhZ2UpIHsKKwkJaWYgKCFleHByZXNzaW9uKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQlyZXR1cm4gZXhwcmVzc2lvbjsKKwl9CisKKwkvKioKKwkgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIG9iamVjdCBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4uIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCBzb21lIGtpbmQKKwkgKiBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gdGVzdAorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisJICogICAgICAgICAgICAgICAgaWYgdGhlIG9iamVjdCBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBpc05vdE51bGwoT2JqZWN0IG9iamVjdCkgeworCQlpc05vdE51bGwob2JqZWN0LCAiIik7Ly8kTk9OLU5MUy0xJAorCX0KKworCS8qKgorCSAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gb2JqZWN0IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPi4gSWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsIHNvbWUga2luZAorCSAqIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duLiBUaGUgZ2l2ZW4gbWVzc2FnZSBpcyBpbmNsdWRlZCBpbiB0aGF0IGV4Y2VwdGlvbiwgdG8gYWlkCisJICogZGVidWdnaW5nLgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QKKwkgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byB0ZXN0CisJICogQHBhcmFtIG1lc3NhZ2UKKwkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbgorCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisJICogICAgICAgICAgICAgICAgaWYgdGhlIG9iamVjdCBpcyA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBpc05vdE51bGwoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1lc3NhZ2UpIHsKKwkJaWYgKG9iamVjdCA9PSBudWxsKSB7CisJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIm51bGxfYXJndW1lbnQ6ICIgKyBtZXNzYWdlKTsvLyROT04tTkxTLTEkCisJCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIGJvb2xlYW4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4uIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCBzb21lIGtpbmQgb2YKKwkgKiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4KKwkgKiAKKwkgKiBAcGFyYW0gZXhwcmVzc2lvbgorCSAqICAgICAgICAgICAgdGhlIG91dGNvZGUgb2YgdGhlIGNoZWNrCisJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hlY2sgcGFzc2VzIChkb2VzIG5vdCByZXR1cm4gaWYgdGhlIGNoZWNrIGZhaWxzKQorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RydWUoYm9vbGVhbiBleHByZXNzaW9uKSB7CisJCXJldHVybiBpc1RydWUoZXhwcmVzc2lvbiwgIiIpOy8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIGJvb2xlYW4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4uIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCBzb21lIGtpbmQgb2YKKwkgKiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4gVGhlIGdpdmVuIG1lc3NhZ2UgaXMgaW5jbHVkZWQgaW4gdGhhdCBleGNlcHRpb24sIHRvIGFpZAorCSAqIGRlYnVnZ2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gZXhwcmVzc2lvbgorCSAqICAgICAgICAgICAgdGhlIG91dGNvZGUgb2YgdGhlIGNoZWNrCisJICogQHBhcmFtIG1lc3NhZ2UKKwkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIHBhc3NlcyAoZG9lcyBub3QgcmV0dXJuIGlmIHRoZSBjaGVjayBmYWlscykKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcnVlKGJvb2xlYW4gZXhwcmVzc2lvbiwgU3RyaW5nIG1lc3NhZ2UpIHsKKwkJaWYgKCFleHByZXNzaW9uKSB7CisJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoImFzc2VydGlvbiBmYWlsZWQ6ICIgKyBtZXNzYWdlKTsvLyROT04tTkxTLTEkCisJCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCk7CisJCX0KKwkJcmV0dXJuIGV4cHJlc3Npb247CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0Fzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0Fzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NGM2MGQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKKworCisvKioKKyAqIDxjb2RlPkFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbjwvY29kZT4gaXMgYSBydW50aW1lIGV4Y2VwdGlvbiB0aHJvd24gYnkgc29tZSBvZiB0aGUgbWV0aG9kcyBpbgorICogPGNvZGU+QXNzZXJ0PC9jb2RlPi4KKyAqIDxwPgorICogVGhpcyBjbGFzcyBpcyBub3QgZGVjbGFyZWQgcHVibGljIHRvIHByZXZlbnQgc29tZSBtaXN1c2VzOyBwcm9ncmFtcyB0aGF0IGNhdGNoIG9yIG90aGVyd2lzZQorICogZGVwZW5kIG9uIGFzc2VydGlvbiBmYWlsdXJlcyBhcmUgc3VzY2VwdGlibGUgdG8gdW5leHBlY3RlZCBicmVha2FnZSB3aGVuIGFzc2VydGlvbnMgaW4gdGhlIGNvZGUKKyAqIGFyZSBhZGRlZCBvciByZW1vdmVkLgorICogPC9wPgorICovCisvLyBUaGlzIGNsYXNzIHdhcywgb3JpZ2luYWxseSwgY29waWVkIGRpcmVjdGx5IGZyb20gY29tLmlibS5pdHAuY29tbW9uLgorLy8gSXQgd2FzIGNvcGllZCB0byBvdXIgb3duIHBhY2thZ2UganVzdCB0byBtaW5pbWl6ZSBtaW5vciBkZXBlbmRlbmNpZXMKKy8vIG9uIG90aGVyIHBhY2thZ2VzIGFuZCBpbnRlcm5hbCBBUElzLgorY2xhc3MgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBleGNlcHRpb24uCisJICovCisJcHVibGljIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigpIHsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLgorCSAqLworCXB1YmxpYyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oU3RyaW5nIGRldGFpbCkgeworCQlzdXBlcihkZXRhaWwpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQXNzb2NpYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Bc3NvY2lhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NWQwYzMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQXNzb2NpYXRpb24uamF2YQpAQCAtMCwwICsxLDY4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOworCisvKioKKyAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDc6Mzg6MTUgUE0pCisgKiAKKyAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKKyAqLworcHVibGljIGNsYXNzIEFzc29jaWF0aW9uIHsKKwlwcm90ZWN0ZWQgT2JqZWN0IGtleTsKKwlwcm90ZWN0ZWQgT2JqZWN0IHZhbHVlOworCisJLyoqCisJICogQXNzb2NpYXRpb24gY29uc3RydWN0b3IgY29tbWVudC4KKwkgKi8KKwlwdWJsaWMgQXNzb2NpYXRpb24oT2JqZWN0IGFLZXksIE9iamVjdCBhVmFsdWUpIHsKKwkJc2V0S2V5KGFLZXkpOworCQlzZXRWYWx1ZShhVmFsdWUpOworCX0KKworCS8qKgorCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgNzozODo0OCBQTSkKKwkgKiAKKwkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKKwkgKi8KKwlwdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRLZXkoKSB7CisJCXJldHVybiBrZXk7CisJfQorCisJLyoqCisJICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCA3OjM4OjQ4IFBNKQorCSAqIAorCSAqIEByZXR1cm4gamF2YS5sYW5nLk9iamVjdAorCSAqLworCXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldFZhbHVlKCkgeworCQlyZXR1cm4gdmFsdWU7CisJfQorCisJLyoqCisJICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCA3OjM4OjQ4IFBNKQorCSAqIAorCSAqIEBwYXJhbSBuZXdLZXkKKwkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRLZXkoamF2YS5sYW5nLk9iamVjdCBuZXdLZXkpIHsKKwkJa2V5ID0gbmV3S2V5OworCX0KKworCS8qKgorCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgNzozODo0OCBQTSkKKwkgKiAKKwkgKiBAcGFyYW0gbmV3VmFsdWUKKwkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShqYXZhLmxhbmcuT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXZhbHVlID0gbmV3VmFsdWU7CisJfQorfQorCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQ2xvbmVhYmxlUHVibGljLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQ2xvbmVhYmxlUHVibGljLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMzOWZiYwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9DbG9uZWFibGVQdWJsaWMuamF2YQpAQCAtMCwwICsxLDI2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIENyZWF0ZWQgb24gU2VwIDIyLCAyMDAzCisgKgorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CisKKy8qKgorICogSW50ZXJmYWNlIHRoYXQgZXhwb3NlcyB0aGUgY2xvbmUgbWV0aG9kLCBmb3Igb2JqZWN0cyB0aGF0IG5lZWQgdG8gZ2VuZXJpY2FsbHkgY29weSBvdGhlcgorICogY2xvbmVhYmxlIG9iamVjdHMKKyAqLworcHVibGljIGludGVyZmFjZSBDbG9uZWFibGVQdWJsaWMgZXh0ZW5kcyBDbG9uZWFibGUsIEFkYXB0ZXIuSW50ZXJuYWwgeworCU9iamVjdCBjbG9uZSgpOworCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQ29tbWFuZENvbnRleHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Db21tYW5kQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkY2I4ODMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQ29tbWFuZENvbnRleHQuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIENyZWF0ZWQgb24gQXByIDI3LCAyMDA0CisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7CisKKworCisvKioKKyAqIEBhdXRob3IgSm9obiBNb3VycmEKKyAqLworcHVibGljIGNsYXNzIENvbW1hbmRDb250ZXh0IGltcGxlbWVudHMgSUNvbW1hbmRDb250ZXh0IHsKKworCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOworCXByaXZhdGUgTWFwIHByb3BlcnRpZXM7CisJcHJpdmF0ZSBSZXNvdXJjZVNldCByZXNvdXJjZVNldDsKKworCS8qKgorCSAqIEBwYXJhbSBtb25pdG9yCisJICovCisJcHVibGljIENvbW1hbmRDb250ZXh0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQl0aGlzKG1vbml0b3IsIG51bGwsIG51bGwpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBtb25pdG9yCisJICogQHBhcmFtIGNvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzCisJICogQHBhcmFtIHJlc291cmNlU2V0CisJICovCisJcHVibGljIENvbW1hbmRDb250ZXh0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgTWFwIGNvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzLCBSZXNvdXJjZVNldCByZXNvdXJjZVNldCkgeworCQl0aGlzLm1vbml0b3IgPSBtb25pdG9yOworCQl0aGlzLnByb3BlcnRpZXMgPSBjb25maWd1cmF0aW9uUHJvcGVydGllczsKKwkJdGhpcy5yZXNvdXJjZVNldCA9IHJlc291cmNlU2V0OworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgY29tLmlibS53cy5yZC5jb21tYW5kLmZyYW1ld29yay5JQ29tbWFuZENvbnRleHQjZ2V0UHJvZ3Jlc3NNb25pdG9yKCkKKwkgKi8KKwlwdWJsaWMgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKSB7CisJCWlmIChtb25pdG9yID09IG51bGwpCisJCQltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKKwkJcmV0dXJuIG1vbml0b3I7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBjb20uaWJtLndzLnJkLmNvbW1hbmQuZnJhbWV3b3JrLklDb21tYW5kQ29udGV4dCNnZXRDb25maWd1cmF0aW9uUHJvcGVydGllcygpCisJICovCisJcHVibGljIE1hcCBnZXRDb25maWd1cmF0aW9uUHJvcGVydGllcygpIHsKKwkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKKwkJCXByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcCgpOworCQlyZXR1cm4gcHJvcGVydGllczsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIGNvbS5pYm0ud3MucmQuY29tbWFuZC5mcmFtZXdvcmsuSUNvbW1hbmRDb250ZXh0I2dldFJlc291cmNlU2V0KCkKKwkgKi8KKwlwdWJsaWMgUmVzb3VyY2VTZXQgZ2V0UmVzb3VyY2VTZXQoKSB7CisJCWlmIChyZXNvdXJjZVNldCA9PSBudWxsKQorCQkJcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7CisJCXJldHVybiByZXNvdXJjZVNldDsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQ29weUdyb3VwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvQ29weUdyb3VwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIzOTI4YwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Db3B5R3JvdXAuamF2YQpAQCAtMCwwICsxLDMyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjb3B5IGEgZ3JvdXAgb2YgUmVmT2JqZWN0cyBhbmQvb3IgUmVzb3VyY2VzLiBUaGlzIGdyb3VwIHdpbGwgZW5zdXJlIHRoYXQKKyAqIGFsbCBub24tY29tcG9zaXRlIHJlbGF0aW9uc2hpcHMgYXJlIGRlZmVycmVkIHVudGlsIGFsbCBSZXNvdXJjZXMgYW5kIFJlZk9iamVjdHMgYXJlIGNvcGllZC4gVGhpcworICogYWxsb3dzIHlvdSB0byBtYWtlIGNvcGllcyBvZiBhIGdyb3VwIG9mIG9iamVjdHMgdGhhdCBtYXkgaGF2ZSBub24tY29tcG9zaXRlIHJlbGF0aW9uc2hpcHMgYW5kCisgKiBlbnN1cmUgdGhhdCB0aGVzZSByZWxhdGlvbnNoaXBzIGFyZSBwb2ludGluZyB0byB0aGUgY29waWVkIG9iamVjdCBpZiBpdCBpcyBwYXJ0IG9mIHRoZSBncm91cAorICogKGVpdGhlciBkaXJlY3RseSBvciB0aHJvdWdoIGEgY29udGFpbm1lbnQgcmVsYXRpb25zaGlwKS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgMToyMToxNyBQTSkKKyAqIAorICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgorICovCitwdWJsaWMgY2xhc3MgQ29weUdyb3VwIHsKKwlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRJZFN1ZmZpeDsKKwlwcm90ZWN0ZWQgUmVzb3VyY2VTZXQgY29weUNvbnRleHQ7CisJcHJvdGVjdGVkIExpc3QgcmVzb3VyY2VzOworCXByb3RlY3RlZCBMaXN0IHJlZk9iamVjdHM7CisJcHJvdGVjdGVkIExpc3QgY29waWVkUmVzb3VyY2VzOworCXByb3RlY3RlZCBMaXN0IGNvcGllZFJlZk9iamVjdHM7CisJcHJvdGVjdGVkIGJvb2xlYW4gcHJlc2VydmVJZHMgPSBmYWxzZTsKKworCS8qKgorCSAqIENvcHlHcm91cCBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqLworCXB1YmxpYyBDb3B5R3JvdXAoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjI4OjE2IFBNKQorCSAqIAorCSAqIEBwYXJhbSBhUmVmT2JqZWN0CisJICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdAorCSAqLworCXB1YmxpYyBib29sZWFuIGFkZChFT2JqZWN0IGFSZWZPYmplY3QpIHsKKwkJcmV0dXJuIGFkZChhUmVmT2JqZWN0LCBudWxsKTsKKwl9CisKKwkvKioKKwkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDE6Mjg6MTYgUE0pCisJICogCisJICogQHBhcmFtIGFSZWZPYmplY3QKKwkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0CisJICovCisJcHVibGljIGJvb2xlYW4gYWRkKEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4KSB7CisJCWlmIChhUmVmT2JqZWN0ICE9IG51bGwgJiYgIWNvbnRhaW5zUmVmT2JqZWN0KGFSZWZPYmplY3QpKSB7CisJCQlnZXRSZWZPYmplY3RzKCkuYWRkKGNyZWF0ZUFzc29jaWF0aW9uKGFSZWZPYmplY3QsIGlkU3VmZml4KSk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjI3OjMyIFBNKQorCSAqIAorCSAqIEBwYXJhbSBhUmVzb3VyY2VzCisJICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGQoUmVzb3VyY2UgYVJlc291cmNlKSB7CisJCWFkZChhUmVzb3VyY2UsIG51bGwpOworCX0KKworCS8qKgorCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgMToyNzozMiBQTSkKKwkgKiAKKwkgKiBAcGFyYW0gYVJlc291cmNlcworCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlCisJICovCisJcHVibGljIHZvaWQgYWRkKFJlc291cmNlIGFSZXNvdXJjZSwgU3RyaW5nIG5ld1VyaSkgeworCQlpZiAoYVJlc291cmNlICE9IG51bGwpCisJCQlnZXRSZXNvdXJjZXMoKS5hZGQoY3JlYXRlQXNzb2NpYXRpb24oYVJlc291cmNlLCBuZXdVcmkpKTsKKwl9CisKKwkvKioKKwkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDE6Mjg6MTYgUE0pCisJICogCisJICogQHBhcmFtIGFSZWZPYmplY3QKKwkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0CisJICovCisJcHVibGljIHZvaWQgYWRkQ29waWVkKEVPYmplY3QgYVJlZk9iamVjdCkgeworCQlpZiAoYVJlZk9iamVjdCAhPSBudWxsKQorCQkJZ2V0Q29waWVkUmVmT2JqZWN0cygpLmFkZChhUmVmT2JqZWN0KTsKKwl9CisKKwkvKioKKwkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDE6Mjc6MzIgUE0pCisJICogCisJICogQHBhcmFtIGFSZXNvdXJjZXMKKwkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZQorCSAqLworCXB1YmxpYyB2b2lkIGFkZENvcGllZChSZXNvdXJjZSBhUmVzb3VyY2UpIHsKKwkJaWYgKGFSZXNvdXJjZSAhPSBudWxsKSB7CisJCQlnZXRDb3BpZWRSZXNvdXJjZXMoKS5hZGQoYVJlc291cmNlKTsKKwkJCWlmIChnZXRDb3B5Q29udGV4dCgpICE9IG51bGwpCisJCQkJZ2V0Q29weUNvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5hZGQoYVJlc291cmNlKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCBib29sZWFuIGNvbnRhaW5zKExpc3QgYXNzb2NpYXRpb25zLCBPYmplY3QgYW5PYmplY3QpIHsKKwkJaWYgKGFuT2JqZWN0ID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCWludCBzaXplID0gYXNzb2NpYXRpb25zLnNpemUoKTsKKwkJQXNzb2NpYXRpb24gYXNzb2M7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQlhc3NvYyA9IChBc3NvY2lhdGlvbikgYXNzb2NpYXRpb25zLmdldChpKTsKKwkJCWlmIChhc3NvYy5nZXRLZXkoKSA9PSBhbk9iamVjdCkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRydWUgaWYKKwkgKiAKKwkgKiBAYVJlZk9iamVjdCBoYXMgYmVlbiBhZGRlZCB0byB0aGlzIGdyb3VwLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjI4OjE2IFBNKQorCSAqIEBwYXJhbSBhUmVmT2JqZWN0CisJICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdAorCSAqLworCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zUmVmT2JqZWN0KEVPYmplY3QgYVJlZk9iamVjdCkgeworCQlyZXR1cm4gY29udGFpbnMoZ2V0UmVmT2JqZWN0cygpLCBhUmVmT2JqZWN0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdHJ1ZSBpZgorCSAqIAorCSAqIEBhUmVzb3VyY2UgaGFzIGJlZW4gYWRkZWQgdG8gdGhpcyBncm91cC4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgMToyODoxNiBQTSkKKwkgKiBAcGFyYW0gYVJlZk9iamVjdAorCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBjb250YWluc1Jlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgeworCQlyZXR1cm4gY29udGFpbnMoZ2V0UmVzb3VyY2VzKCksIGFSZXNvdXJjZSk7CisJfQorCisJcHJpdmF0ZSBBc3NvY2lhdGlvbiBjcmVhdGVBc3NvY2lhdGlvbihPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKKwkJcmV0dXJuIG5ldyBBc3NvY2lhdGlvbihrZXksIHZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgTGlzdCBvZiBSZWZPYmplY3RzIHRoYXQgd2VyZSBjb3BpZWQuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDE6MjU6NDYgUE0pCisJICogCisJICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAorCSAqLworCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRDb3BpZWRSZWZPYmplY3RzKCkgeworCQlpZiAoY29waWVkUmVmT2JqZWN0cyA9PSBudWxsKQorCQkJY29waWVkUmVmT2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJcmV0dXJuIGNvcGllZFJlZk9iamVjdHM7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhIExpc3Qgb2YgUmVzb3VyY2VzIHRoYXQgd2VyZSBjb3BpZWQuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDE6MjU6NDYgUE0pCisJICogCisJICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAorCSAqLworCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRDb3BpZWRSZXNvdXJjZXMoKSB7CisJCWlmIChjb3BpZWRSZXNvdXJjZXMgPT0gbnVsbCkKKwkJCWNvcGllZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJcmV0dXJuIGNvcGllZFJlc291cmNlczsKKwl9CisKKwkvKioKKwkgKiBUaGUgY29udGV4dCB0byBhZGQgYWxsIGNvcGllZCByZXNvdXJjZXMgaW50by4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgODowOTo0NSBQTSkKKwkgKiAKKwkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldAorCSAqLworCXB1YmxpYyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQgZ2V0Q29weUNvbnRleHQoKSB7CisJCXJldHVybiBjb3B5Q29udGV4dDsKKwl9CisKKwkvKioKKwkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDE6NDQ6NDMgUE0pCisJICogCisJICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCisJICovCisJcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RGVmYXVsdElkU3VmZml4KCkgeworCQlyZXR1cm4gZGVmYXVsdElkU3VmZml4OworCX0KKworCS8qKgorCSAqIFNob3VsZCB0aGUgaWQgYmUgY29waWVkIGluIHRoZSBjYXNlIHdoZXJlIG5vIHN1ZmZpeCBpcyBzcGVjaWZpZWQ/IERlZmF1bHRzIHRvIGZhbHNlCisJICovCisJcHVibGljIGJvb2xlYW4gZ2V0UHJlc2VydmVJZHMoKSB7CisJCXJldHVybiBwcmVzZXJ2ZUlkczsKKwl9CisKKwkvKioKKwkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDE6MjU6NDYgUE0pCisJICogCisJICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAorCSAqLworCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRSZWZPYmplY3RzKCkgeworCQlpZiAocmVmT2JqZWN0cyA9PSBudWxsKQorCQkJcmVmT2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJcmV0dXJuIHJlZk9iamVjdHM7CisJfQorCisJLyoqCisJICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjI1OjQ2IFBNKQorCSAqIAorCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKKwkgKi8KKwlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0UmVzb3VyY2VzKCkgeworCQlpZiAocmVzb3VyY2VzID09IG51bGwpCisJCQlyZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCXJldHVybiByZXNvdXJjZXM7CisJfQorCisJLyoqCisJICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjI1OjQ2IFBNKQorCSAqIAorCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKKwkgKi8KKwlwdWJsaWMgamF2YS51dGlsLkxpc3QgcHJpbUdldFJlZk9iamVjdHMoKSB7CisJCXJldHVybiByZWZPYmplY3RzOworCX0KKworCS8qKgorCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE3LzIwMDAgMToyNTo0NiBQTSkKKwkgKiAKKwkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0CisJICovCisJcHVibGljIGphdmEudXRpbC5MaXN0IHByaW1HZXRSZXNvdXJjZXMoKSB7CisJCXJldHVybiByZXNvdXJjZXM7CisJfQorCisJLyoqCisJICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjI4OjE2IFBNKQorCSAqIAorCSAqIEBwYXJhbSBhUmVmT2JqZWN0CisJICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdAorCSAqIEByZXR1cm4gYm9vbGVhbgorCSAqLworCXB1YmxpYyBib29sZWFuIHJlbW92ZShFT2JqZWN0IGFSZWZPYmplY3QpIHsKKwkJaWYgKGFSZWZPYmplY3QgIT0gbnVsbCAmJiBwcmltR2V0UmVmT2JqZWN0cygpICE9IG51bGwpIHsKKwkJCUl0ZXJhdG9yIGl0ID0gcHJpbUdldFJlZk9iamVjdHMoKS5pdGVyYXRvcigpOworCQkJQXNzb2NpYXRpb24gYXNzb2NpYXRpb247CisJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisJCQkJYXNzb2NpYXRpb24gPSAoQXNzb2NpYXRpb24pIGl0Lm5leHQoKTsKKwkJCQlpZiAoYXNzb2NpYXRpb24uZ2V0S2V5KCkgPT0gYVJlZk9iamVjdCkKKwkJCQkJcmV0dXJuIHByaW1HZXRSZWZPYmplY3RzKCkucmVtb3ZlKGFzc29jaWF0aW9uKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjI3OjMyIFBNKQorCSAqIAorCSAqIEBwYXJhbSBhUmVzb3VyY2VzCisJICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UKKwkgKiBAcmV0dXJuIGJvb2xlYW4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiByZW1vdmUoUmVzb3VyY2UgYVJlc291cmNlKSB7CisJCWlmIChhUmVzb3VyY2UgIT0gbnVsbCAmJiBwcmltR2V0UmVzb3VyY2VzKCkgIT0gbnVsbCkgeworCQkJSXRlcmF0b3IgaXQgPSBwcmltR2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsKKwkJCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uOworCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCQkJCWFzc29jaWF0aW9uID0gKEFzc29jaWF0aW9uKSBpdC5uZXh0KCk7CisJCQkJaWYgKGFzc29jaWF0aW9uLmdldEtleSgpID09IGFSZXNvdXJjZSkKKwkJCQkJcmV0dXJuIHByaW1HZXRSZXNvdXJjZXMoKS5yZW1vdmUoYXNzb2NpYXRpb24pOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBTZXQgdGhlIGNvbnRleHQgdG8gYWRkIGFsbCBjb3BpZWQgcmVzb3VyY2VzIGludG8uIENyZWF0aW9uIGRhdGU6ICgxMi8xNy8yMDAwIDg6MDk6NDUgUE0pCisJICogCisJICogQHBhcmFtIG5ld0NvcHlDb250ZXh0CisJICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuQ29udGV4dAorCSAqLworCXB1YmxpYyB2b2lkIHNldENvcHlDb250ZXh0KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldCBuZXdDb3B5Q29udGV4dCkgeworCQljb3B5Q29udGV4dCA9IG5ld0NvcHlDb250ZXh0OworCX0KKworCS8qKgorCSAqIElmIGFuIElEIHN1ZmZpeCBpcyBub3QgZGVmaW5lZCBmb3IgYSBFT2JqZWN0IHRoYXQgaXMgdG8gYmUgY29waWVkLCB0aGlzIHZhbHVlIHdpbGwgYmUgdXNlZC4KKwkgKiBDcmVhdGlvbiBkYXRlOiAoMTIvMTcvMjAwMCAxOjQ0OjQzIFBNKQorCSAqIAorCSAqIEBwYXJhbSBuZXdEZWZhdWx0SWRTdWZmaXgKKwkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREZWZhdWx0SWRTdWZmaXgoamF2YS5sYW5nLlN0cmluZyBuZXdEZWZhdWx0SWRTdWZmaXgpIHsKKwkJZGVmYXVsdElkU3VmZml4ID0gbmV3RGVmYXVsdElkU3VmZml4OworCX0KKworCS8qKgorCSAqIFNob3VsZCB0aGUgaWQgYmUgY29waWVkIGluIHRoZSBjYXNlIHdoZXJlIG5vIHN1ZmZpeCBpcyBzcGVjaWZpZWQ/CisJICovCisJcHVibGljIHZvaWQgc2V0UHJlc2VydmVJZHMoYm9vbGVhbiB2YWx1ZSkgeworCQlwcmVzZXJ2ZUlkcyA9IHZhbHVlOworCX0KKworCS8qKgorCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHRoZXkgcmVxdWlyZSBhZGRpdGlvbmFsIHByb2Nlc3NpbmcgYWZ0ZXIgdGhlIGdyb3VwCisJICogaGFzIGJlZW4gY29waWVkLgorCSAqIAorCSAqIEBwYXJhbSBjb3B5VXRpbAorCSAqLworCXB1YmxpYyB2b2lkIHBvc3RDb3B5KEV0b29sc0NvcHlVdGlsaXR5IGNvcHlVdGlsKSB7CisJfQorCit9CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9ET01Mb2FkT3B0aW9ucy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0RPTUxvYWRPcHRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVhZThhNQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9ET01Mb2FkT3B0aW9ucy5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIENyZWF0ZWQgb24gTWFyIDEyLCAyMDAzCisgKgorICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCisgKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7CisKKy8qKgorICogQGF1dGhvciBzY2hhY2hlcgorICogCisgKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKKyAqLworcHVibGljIGNsYXNzIERPTUxvYWRPcHRpb25zIHsKKwlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZTsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBhbGxvd0phdmFFbmNvZGluZ3M7CisJcHJvdGVjdGVkIGJvb2xlYW4gZXhwYW5kRW50aXR5UmVmZXJlcmVuY2VzOworCisJLyoqCisJICogQHJldHVybiBib29sZWFuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNBbGxvd0phdmFFbmNvZGluZ3MoKSB7CisJCXJldHVybiBhbGxvd0phdmFFbmNvZGluZ3M7CisJfQorCisJLyoqCisJICogQHJldHVybiBib29sZWFuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNFeHBhbmRFbnRpdHlSZWZlcmVyZW5jZXMoKSB7CisJCXJldHVybiBleHBhbmRFbnRpdHlSZWZlcmVyZW5jZXM7CisJfQorCisJLyoqCisJICogQHJldHVybiBib29sZWFuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNWYWxpZGF0ZSgpIHsKKwkJcmV0dXJuIHZhbGlkYXRlOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGFsbG93SmF2YUVuY29kaW5ncy4KKwkgKiAKKwkgKiBAcGFyYW0gYWxsb3dKYXZhRW5jb2RpbmdzCisJICogICAgICAgICAgICBUaGUgYWxsb3dKYXZhRW5jb2RpbmdzIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldEFsbG93SmF2YUVuY29kaW5ncyhib29sZWFuIGFsbG93SmF2YUVuY29kaW5ncykgeworCQl0aGlzLmFsbG93SmF2YUVuY29kaW5ncyA9IGFsbG93SmF2YUVuY29kaW5nczsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBleHBhbmRFbnRpdHlSZWZlcmVyZW5jZXMuCisJICogCisJICogQHBhcmFtIGV4cGFuZEVudGl0eVJlZmVyZXJlbmNlcworCSAqICAgICAgICAgICAgVGhlIGV4cGFuZEVudGl0eVJlZmVyZXJlbmNlcyB0byBzZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRFeHBhbmRFbnRpdHlSZWZlcmVyZW5jZXMoYm9vbGVhbiBleHBhbmRFbnRpdHlSZWZlcmVyZW5jZXMpIHsKKwkJdGhpcy5leHBhbmRFbnRpdHlSZWZlcmVyZW5jZXMgPSBleHBhbmRFbnRpdHlSZWZlcmVyZW5jZXM7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsaWRhdGUuCisJICogCisJICogQHBhcmFtIHZhbGlkYXRlCisJICogICAgICAgICAgICBUaGUgdmFsaWRhdGUgdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0VmFsaWRhdGUoYm9vbGVhbiB2YWxpZGF0ZSkgeworCQl0aGlzLnZhbGlkYXRlID0gdmFsaWRhdGU7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0RPTVV0aWxpdGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0RPTVV0aWxpdGllcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0Zjk2NjkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRE9NVXRpbGl0aWVzLmphdmEKQEAgLTAsMCArMSw3MDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKKworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7CitpbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKKworLyoqCisgKiBBIGNsYXNzIGNvbnRhaW5pbmcgY29tbW9uIGRvbSBtYW5pcHVsYXRpb24gYW5kIHNlYXJjaCBmdW5jdGlvbnMuCisgKi8KK3B1YmxpYyBjbGFzcyBET01VdGlsaXRpZXMgeworCS8vIEhhbmR5IENvbnN0YW50cworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVOVF9TVFJJTkcgPSAiXHQiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXTElORV9TVFJJTkcgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKKwkvL0hhY2sgdG8gYmUgcmVtb3ZlZCB3aGVuIHRoZSBET00gYXBpcyBjaGFuZ2Ugc3VjaCB0aGF0IHRoZXJlIGlzIGFuIGVhc2llcgorCS8vd2F5IHRvIGZsdWZmIHVwIGFuZCBzZXQgdGhlIGRvY3R5cGUKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFVNTVlfRU5USVRZX1NUUklORyA9ICJkdW1teSI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFVNTVlfRU5USVRZX05PREVfU1RSSU5HID0gIjxkdW1teS8+IjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIERvY3VtZW50QnVpbGRlciBkZWZhdWx0RG9jdW1lbnRCdWlsZGVyOworCXByaXZhdGUgc3RhdGljIEVudGl0eVJlc29sdmVyIGRlZmF1bHRFbnRpdHlSZXNvbHZlcjsKKworCS8qKgorCSAqIFJldHVybnMgYW4gaXRlcmF0b3IgdGhhdCBpdGVyYXRlcyBvdmVyIHRoZSBzdWIgbm9kZXMgb2YgYSBwYXRoLgorCSAqLworCXN0YXRpYyBwdWJsaWMgSXRlcmF0b3IgY3JlYXRlUGF0aEl0ZXJhdG9yKFN0cmluZyBwYXRoKSB7CisJCVN0cmluZyB0UGF0aCA9IHBhdGguc3RhcnRzV2l0aCgiLyIpID8gcGF0aC5zdWJzdHJpbmcoMSkgOiBwYXRoOyAvLyROT04tTkxTLTEkCisJCWlmICh0UGF0aC5sZW5ndGgoKSA9PSAwKQorCQkJdFBhdGggPSBudWxsOworCQlmaW5hbCBTdHJpbmcgYVBhdGggPSB0UGF0aDsKKworCQlyZXR1cm4gbmV3IEl0ZXJhdG9yKCkgeworCQkJaW50IHByZXZJbmRleCA9IDA7CisJCQlpbnQgY3VySW5kZXggPSAwOworCQkJU3RyaW5nIHBhdGhTdHJpbmcgPSBhUGF0aDsKKworCQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKwkJCQlyZXR1cm4gcGF0aFN0cmluZyAhPSBudWxsICYmIHByZXZJbmRleCAhPSAtMTsKKwkJCX0KKworCQkJcHVibGljIE9iamVjdCBuZXh0KCkgeworCQkJCWN1ckluZGV4ID0gcGF0aFN0cmluZy5pbmRleE9mKCcvJywgcHJldkluZGV4KTsKKwkJCQlTdHJpbmcgbm9kZVN0cmluZyA9IG51bGw7CisJCQkJaWYgKGN1ckluZGV4ICE9IC0xKQorCQkJCQlub2RlU3RyaW5nID0gcGF0aFN0cmluZy5zdWJzdHJpbmcocHJldkluZGV4LCBjdXJJbmRleCsrKTsKKwkJCQllbHNlCisJCQkJCW5vZGVTdHJpbmcgPSBwYXRoU3RyaW5nLnN1YnN0cmluZyhwcmV2SW5kZXgpOworCQkJCXByZXZJbmRleCA9IGN1ckluZGV4OworCQkJCXJldHVybiBub2RlU3RyaW5nOworCQkJfQorCisJCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisJCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJCQl9CisJCX07CisJfQorCisJLyoqCisJICogR2V0IHRoZSB0ZXh0IGZvciB0aGUgcGFzc2VkIGluIG5vZGUuCisJICovCisJc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0Q2hpbGRUZXh0KE5vZGUgbm9kZSkgeworCQlUZXh0IHRleHROb2RlID0gZ2V0Q2hpbGRUZXh0Tm9kZShub2RlKTsKKwkJaWYgKHRleHROb2RlICE9IG51bGwpCisJCQlyZXR1cm4gdGV4dE5vZGUuZ2V0RGF0YSgpOworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIHRleHQgZm9yIHRoZSBwYXNzZWQgaW4gbm9kZS4KKwkgKi8KKwlzdGF0aWMgcHVibGljIFRleHQgZ2V0Q2hpbGRUZXh0Tm9kZShOb2RlIG5vZGUpIHsKKwkJTm9kZSB0ZXh0Tm9kZSA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOworCQl3aGlsZSAodGV4dE5vZGUgIT0gbnVsbCAmJiBET01VdGlsaXRpZXMuaXNUZXh0Tm9kZSh0ZXh0Tm9kZSkpIHsKKwkJCWlmICghaXNXaGl0ZXNwYWNlKHRleHROb2RlKSkKKwkJCQlyZXR1cm4gKFRleHQpIHRleHROb2RlOworCQkJdGV4dE5vZGUgPSB0ZXh0Tm9kZS5nZXROZXh0U2libGluZygpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgaW5kZW50YXRpb24gb2YgdGhlIG5vZGUuCisJICovCisJc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0SW5kZW50U3RyaW5nKE5vZGUgbm9kZSkgeworCQlSZXZpc2l0LnRvRG8oKTsKKwkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogR2V0IHRoZSBsYXN0IG5vbi10ZXh0IGNoaWxkIG9mIGEgbm9kZS4KKwkgKiAKKwkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUgVGhlIGxhc3Qgbm9uLXRleHQgY2hpbGQgbm9kZSBvZgorCSAqIEBub2RlLgorCSAqIEBwYXJhbSBub2RlCisJICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIFRoZSBub2RlCisJICovCisJcHVibGljIHN0YXRpYyBOb2RlIGdldExhc3ROb2RlQ2hpbGQoTm9kZSBub2RlKSB7CisJCWlmIChub2RlID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJTm9kZSBjaGlsZCA9IG5vZGUuZ2V0TGFzdENoaWxkKCk7CisJCXdoaWxlIChjaGlsZCAhPSBudWxsICYmIGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpCisJCQljaGlsZCA9IGNoaWxkLmdldFByZXZpb3VzU2libGluZygpOworCQlyZXR1cm4gY2hpbGQ7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBuZXh0IG5vbi10ZXh0IHNpYmxpbmcgYWZ0ZXIgYSBub2RlLgorCSAqIAorCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZSBUaGUgZmlyc3Qgbm9uLXRleHQgc2libGluZyBub2RlIGFmdGVyCisJICogQG5vZGUuIElmIHRoZXJlIGlzIG5vIG5leHQgbm9uLXRleHQgc2libGluZywgbnVsbCBpcyByZXR1cm5lZC4KKwkgKiBAcGFyYW0gbm9kZQorCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZQorCSAqLworCXB1YmxpYyBzdGF0aWMgTm9kZSBnZXROZXh0Tm9kZVNpYmxpbmcoTm9kZSBub2RlKSB7CisJCU5vZGUgc2libGluZyA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKKwkJd2hpbGUgKHNpYmxpbmcgIT0gbnVsbCAmJiBzaWJsaW5nLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCisJCQlzaWJsaW5nID0gc2libGluZy5nZXROZXh0U2libGluZygpOworCQlyZXR1cm4gc2libGluZzsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIGZpcnN0IGNoaWxkIE5vZGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKKwkgKi8KKwlzdGF0aWMgcHVibGljIE5vZGUgZ2V0Tm9kZUNoaWxkKE5vZGUgbm9kZSwgU3RyaW5nIG5vZGVOYW1lKSB7CisJCU5vZGUgY2hpbGQgPSBudWxsOworCQlOb2RlTGlzdCBjaGlsZHJlbiA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKKwkJCU5vZGUgbiA9IGNoaWxkcmVuLml0ZW0oaSk7CisJCQlpZiAobi5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFICYmIG4uZ2V0Tm9kZU5hbWUoKS5lcXVhbHMobm9kZU5hbWUpKSB7CisJCQkJY2hpbGQgPSBuOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJldHVybiBjaGlsZDsKKwl9CisKKwkvKioKKwkgKiBUcmF2ZXJzZXMgdGhlIHBhdGggcGFzc2VkIGluIDxwYXRoTmFtZT4uIFRoZSBwYXRoIGlzIGEgc3RyaW5nIGluIHRoZSBmb3JtCisJICogJ25vZGUxL25vZGUyL25vZGUzJy4gVGhpcyBtZXRob2Qgc3RhcnRzIGF0IG5vZGUuCisJICovCisJc3RhdGljIHB1YmxpYyBOb2RlIGdldE5vZGVDaGlsZEZvclBhdGgoTm9kZSBwYXJlbnQsIFN0cmluZyBwYXRoTmFtZSkgeworCisJCU5vZGUgY3VyTm9kZSA9IHBhcmVudDsKKwkJSXRlcmF0b3IgaSA9IERPTVV0aWxpdGllcy5jcmVhdGVQYXRoSXRlcmF0b3IocGF0aE5hbWUpOworCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKKwkJCVN0cmluZyBjaGlsZCA9IChTdHJpbmcpIGkubmV4dCgpOworCQkJY3VyTm9kZSA9IERPTVV0aWxpdGllcy5nZXROb2RlQ2hpbGQoY3VyTm9kZSwgY2hpbGQpOworCQkJaWYgKGN1ck5vZGUgPT0gbnVsbCkKKwkJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gY3VyTm9kZTsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIE5vZGUgY2hpbGRyZW4gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWVzCisJICovCisJc3RhdGljIHB1YmxpYyBMaXN0IGdldE5vZGVDaGlsZHJlbihOb2RlIG5vZGUsIFN0cmluZ1tdIG5vZGVOYW1lcykgeworCQlOb2RlTGlzdCBjaGlsZE5vZGVzID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7CisJCUFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7CisJCQlOb2RlIG4gPSBjaGlsZE5vZGVzLml0ZW0oaSk7CisJCQlpZiAobi5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7CisJCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbm9kZU5hbWVzLmxlbmd0aDsgaisrKSB7CisJCQkJCWlmIChub2RlTmFtZXNbal0uZXF1YWxzKG4uZ2V0Tm9kZU5hbWUoKSkpIHsKKwkJCQkJCWZvdW5kID0gdHJ1ZTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJCWlmIChmb3VuZCkKKwkJCQkJcmVzdWx0cy5hZGQobik7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlc3VsdHM7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBOb2RlIGNoaWxkcmVuIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lCisJICovCisJc3RhdGljIHB1YmxpYyBMaXN0IGdldE5vZGVDaGlsZHJlbihOb2RlIG5vZGUsIFN0cmluZyBub2RlTmFtZSkgeworCQlOb2RlTGlzdCBjaGlsZE5vZGVzID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7CisJCUFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7CisJCQlOb2RlIG4gPSBjaGlsZE5vZGVzLml0ZW0oaSk7CisJCQlpZiAobi5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFICYmIG4uZ2V0Tm9kZU5hbWUoKS5lcXVhbHMobm9kZU5hbWUpKQorCQkJCXJlc3VsdHMuYWRkKG4pOworCQl9CisJCXJldHVybiByZXN1bHRzOworCX0KKworCS8qKgorCSAqIEdldCB0aGUgZmlyc3Qgbm9uLXRleHQgc2libGluZyBiZWZvcmUgYSBub2RlLgorCSAqIAorCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZSBUaGUgZmlyc3Qgbm9uLXRleHQgc2libGluZyBub2RlIGJlZm9yZQorCSAqIEBub2RlLiBJZiB0aGVyZSBpcyBubyBwcmV2aW91cyBub24tdGV4dCBzaWJsaW5nLCBudWxsIGlzIHJldHVybmVkLgorCSAqIEBwYXJhbSBub2RlCisJICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIFRoZSBub2RlCisJICovCisJcHVibGljIHN0YXRpYyBOb2RlIGdldFByZXZpb3VzTm9kZVNpYmxpbmcoTm9kZSBub2RlKSB7CisJCWlmIChub2RlID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJTm9kZSBzaWJsaW5nID0gbm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKKwkJd2hpbGUgKHNpYmxpbmcgIT0gbnVsbCAmJiBET01VdGlsaXRpZXMuaXNUZXh0Tm9kZShzaWJsaW5nKSkKKwkJCXNpYmxpbmcgPSBzaWJsaW5nLmdldFByZXZpb3VzU2libGluZygpOworCQlyZXR1cm4gc2libGluZzsKKwl9CisKKwkvKioKKwkgKiBHZXQgdGhlIGZpcnN0IHRleHQgbm9kZSBiZWZvcmUgYSBub2RlLgorCSAqIAorCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZSBUaGUgZmlyc3QgdGV4dCBub2RlIGJlZm9yZQorCSAqIEBub2RlLiBOdWxsIGlmIG5vIHN1Y2ggbm9kZSBleGlzdC4KKwkgKiBAcGFyYW0gbm9kZQorCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZQorCSAqLworCXB1YmxpYyBzdGF0aWMgVGV4dCBnZXRQcmV2aW91c1RleHQoTm9kZSBub2RlKSB7CisJCVRleHQgc2libGluZyA9IGdldFByZXZpb3VzVGV4dFNpYmxpbmcobm9kZSk7CisKKwkJaWYgKHNpYmxpbmcgPT0gbnVsbCAmJiBub2RlLmdldFBhcmVudE5vZGUoKSAhPSBudWxsKQorCQkJc2libGluZyA9IGdldFByZXZpb3VzVGV4dChub2RlLmdldFBhcmVudE5vZGUoKSk7CisKKwkJcmV0dXJuIHNpYmxpbmc7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBmaXJzdCB0ZXh0IHNpYmxpbmcgYmVmb3JlIGEgbm9kZS4KKwkgKiAKKwkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUgVGhlIGZpcnN0IHRleHQgc2libGluZyBub2RlIGJlZm9yZQorCSAqIEBub2RlLiBJZiB0aGVyZSBpcyBubyBwcmV2aW91cyB0ZXh0IHNpYmxpbmcsIG51bGwgaXMgcmV0dXJuZWQuCisJICogQHBhcmFtIG5vZGUKKwkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUgVGhlIG5vZGUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFRleHQgZ2V0UHJldmlvdXNUZXh0U2libGluZyhOb2RlIG5vZGUpIHsKKwkJQXNzZXJ0LmlzTm90TnVsbChub2RlKTsKKworCQlOb2RlIHNpYmxpbmcgPSBub2RlLmdldFByZXZpb3VzU2libGluZygpOworCQlOb2RlIGxhc3RUZXh0ID0gbnVsbDsKKwkJd2hpbGUgKHNpYmxpbmcgIT0gbnVsbCAmJiBzaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKKwkJCWxhc3RUZXh0ID0gc2libGluZzsKKwkJCXNpYmxpbmcgPSBzaWJsaW5nLmdldFByZXZpb3VzU2libGluZygpOworCQl9CisJCXJldHVybiAoVGV4dCkgbGFzdFRleHQ7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBmaXJzdCB0ZXh0IHNpYmxpbmcgYmVmb3JlIGEgbm9kZS4KKwkgKiAKKwkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUgVGhlIGZpcnN0IHRleHQgc2libGluZyBub2RlIGJlZm9yZQorCSAqIEBub2RlLiBJZiB0aGVyZSBpcyBubyBwcmV2aW91cyB0ZXh0IHNpYmxpbmcsIG51bGwgaXMgcmV0dXJuZWQuCisJICogQHBhcmFtIG5vZGUKKwkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUgVGhlIG5vZGUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUcmFpbGluZ1doaXRlc3BhY2UoVGV4dCBub2RlKSB7CisJCUFzc2VydC5pc05vdE51bGwobm9kZSk7CisKKwkJU3RyaW5nIHRleHQgPSBub2RlLmdldERhdGEoKTsKKwkJaWYgKHRleHQubGVuZ3RoKCkgPT0gMCkKKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAorCisJCWludCBpID0gdGV4dC5sZW5ndGgoKSAtIDE7CisJCWZvciAoOyBpID49IDA7IGktLSkgeworCQkJaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHRleHQuY2hhckF0KGkpKSkgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKCsraSk7CisJfQorCisJLyoqCisJICogSW5zZXJ0cyA8bmV3Tm9kZT5pbnRvIDxwYXJlbnQ+YWZ0ZXIgPHJlZk5vZGU+LiBJZiA8cmVmTm9kZT5pcyBudWxsIHRoZW4gdGhlIG5vZGUgaXMgaW5zZXJ0ZWQKKwkgKiB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYXJlbnQncyBjaGlsZCBub2Rlcy4KKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50CisJICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCisJICogQHBhcmFtIG5ld05vZGUKKwkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKKwkgKiBAcGFyYW0gcmVmTm9kZQorCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBpbnNlcnRBZnRlck5vZGUoTm9kZSBwYXJlbnQsIE5vZGUgbmV3Tm9kZSwgTm9kZSByZWZOb2RlKSB7CisJCU5vZGUgaW5zZXJ0QmVmb3JlTm9kZSA9IG51bGw7CisJCWlmIChyZWZOb2RlICE9IG51bGwpIHsKKwkJCWluc2VydEJlZm9yZU5vZGUgPSByZWZOb2RlLmdldE5leHRTaWJsaW5nKCk7CisJCX0KKwkJaWYgKHJlZk5vZGUgPT0gbnVsbCkKKwkJCWluc2VydEJlZm9yZU5vZGUocGFyZW50LCBuZXdOb2RlLCBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKKwkJZWxzZQorCQkJaW5zZXJ0QmVmb3JlTm9kZShwYXJlbnQsIG5ld05vZGUsIGluc2VydEJlZm9yZU5vZGUpOworCX0KKworCS8qKgorCSAqIEluc2VydCBhIDxuZXdOb2RlPmludG8gPHBhcmVudD5iZWZvcmUgPHJlZk5vZGU+LiBUaGlzIHV0aWxpdHkgbWV0aG9kIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQKKwkgKiB0aGUgaW5zZXJ0aW9uIGRvZXMgbm90IHJlc3VsdCBpbiB0d28gYWRqYWNlbnQgdGV4dCBub2Rlcy4gVGhlIERPTSBtb2RlbCBkb2VzIG5vdCBoYW5kbGUKKwkgKiBhZGphY2VudCB0ZXh0IG5vZGVzLiBUaGV5IG11c3QgYmUgam9pbmVkIHRvZ2V0aGVyLgorCSAqIAorCSAqIEBwYXJhbSBuZXdOb2RlCisJICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCisJICogQHBhcmFtIG5ld05vZGUKKwkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKKwkgKiBAcGFyYW0gcmVmTm9kZQorCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQorCSAqLworCXN0YXRpYyBwdWJsaWMgdm9pZCBpbnNlcnRCZWZvcmVOb2RlKE5vZGUgcGFyZW50LCBOb2RlIG5ld05vZGUsIE5vZGUgcmVmTm9kZSkgeworCQlpZiAobmV3Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7CisJCQlUZXh0IHRleHROZXdOb2RlID0gKFRleHQpIG5ld05vZGU7CisKKwkJCS8vIElmIHRoZSBpbnNlcnQgYmVmb3JlIG5vZGUgaXMgdGV4dCwgam9pbiBpdCB3aXRoIHRoZSBuZXcgbm9kZS4KKwkJCWlmIChyZWZOb2RlICE9IG51bGwgJiYgcmVmTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7CisJCQkJVGV4dCB0ZXh0UmVmTm9kZSA9IChUZXh0KSByZWZOb2RlOworCQkJCXRleHRSZWZOb2RlLnNldERhdGEodGV4dE5ld05vZGUuZ2V0RGF0YSgpICsgdGV4dFJlZk5vZGUuZ2V0RGF0YSgpKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQkvLyBJZiB0aGUgbm9kZSB3ZSBhcmUgaW5zZXJ0aW5nIGFmdGVyIGlzIHRleHQsCisJCQkvLyBqb2luIGl0IHdpdGggdGhlIG5ldyBub2RlLgorCQkJTm9kZSBpbnNlcnRBZnRlck5vZGUgPSAocmVmTm9kZSA9PSBudWxsKSA/IHBhcmVudC5nZXRMYXN0Q2hpbGQoKSA6IHJlZk5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7CisJCQlpZiAoaW5zZXJ0QWZ0ZXJOb2RlICE9IG51bGwgJiYgaW5zZXJ0QWZ0ZXJOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKKwkJCQlUZXh0IHRleHRJbnNlcnRBZnRlck5vZGUgPSAoVGV4dCkgaW5zZXJ0QWZ0ZXJOb2RlOworCQkJCXRleHRJbnNlcnRBZnRlck5vZGUuc2V0RGF0YSh0ZXh0SW5zZXJ0QWZ0ZXJOb2RlLmdldERhdGEoKSArIHRleHROZXdOb2RlLmdldERhdGEoKSk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCS8vIFRoZXJlIGlzIG5vIHRleHQgbm9kZSB0byBqb2luIHRvLCBzaW1wbGUgaW5zZXJ0IHRoZSBub2RlLgorCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKG5ld05vZGUsIHJlZk5vZGUpOworCX0KKworCS8qKgorCSAqIEluc2VydCBhIDxuZXdOb2RlPmludG8gPHBhcmVudD5iZWZvcmUgPHJlZk5vZGU+LiBUaGlzIG1ldGhvZCB3aWxsIGFsc28gaW5zZXJ0IHRoZSBub2RlIGJlZm9yZQorCSAqIGFueSB3aGl0ZXNwYWNlIG5vZGVzIHRoYXQgYXBwZWFyIGluIHRoZSB0cmVlIGJlZm9yZSA8cmVmTm9kZT4uIFRoaXMgbWV0aG9kIHdpbGwgYWxzbyBlbnN1cmUKKwkgKiB0aGF0IHRoZSBpbnNlcnRpb24gZG9lcyBub3QgcmVzdWx0IGluIHR3byBhZGphY2VudCB0ZXh0IG5vZGVzLiBUaGUgRE9NIG1vZGVsIGRvZXMgbm90IGhhbmRsZQorCSAqIGFkamFjZW50IHRleHQgbm9kZXMuIFRoZXkgbXVzdCBiZSBqb2luZWQgdG9nZXRoZXIuCisJICogCisJICogQHBhcmFtIG5ld05vZGUKKwkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKKwkgKiBAcGFyYW0gbmV3Tm9kZQorCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQorCSAqIEBwYXJhbSByZWZOb2RlCisJICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCisJICovCisJc3RhdGljIHB1YmxpYyB2b2lkIGluc2VydEJlZm9yZU5vZGVBbmRXaGl0ZXNwYWNlKE5vZGUgcGFyZW50LCBOb2RlIG5ld05vZGUsIE5vZGUgcmVmTm9kZSkgeworCQlOb2RlIGN1ck5vZGUgPSAocmVmTm9kZSA9PSBudWxsKSA/IHBhcmVudC5nZXRMYXN0Q2hpbGQoKSA6IHJlZk5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7CisJCU5vZGUgbGFzdE5vZGUgPSByZWZOb2RlOworCisJCXdoaWxlIChjdXJOb2RlICE9IG51bGwgJiYgKERPTVV0aWxpdGllcy5pc1doaXRlc3BhY2UoY3VyTm9kZSkgfHwgRE9NVXRpbGl0aWVzLmlzQ29tbWVudChjdXJOb2RlKSkpIHsKKwkJCWxhc3ROb2RlID0gY3VyTm9kZTsKKwkJCWN1ck5vZGUgPSBjdXJOb2RlLmdldFByZXZpb3VzU2libGluZygpOworCQl9CisKKwkJaW5zZXJ0QmVmb3JlTm9kZShwYXJlbnQsIG5ld05vZGUsIGxhc3ROb2RlKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgbm9kZSBpcyBhIHRleHQgbm9kZS4KKwkgKiAKKwkgKiBAcmV0dXJuIGJvb2xlYW4gQW5zd2VyIHRydWUgaWYgdGhlIG5vZGUgaXMgYSB0ZXh0IG5vZGUsIGZhbHNlIG90aGVyd2lzZS4KKwkgKiBAcGFyYW0gbm9kZQorCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZSB0byBjaGVjaworCSAqLworCXN0YXRpYyBwdWJsaWMgYm9vbGVhbiBpc1RleHROb2RlKE5vZGUgbm9kZSkgeworCQlBc3NlcnQuaXNOb3ROdWxsKG5vZGUpOworCQlyZXR1cm4gKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgfHwgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgdGhlIG5vZGUgaXMgZW50aXJlbHkgY29tbWVudCBvciBub3QuCisJICogCisJICogQHJldHVybiBib29sZWFuIEFuc3dlciB0cnVlIGlmIHRoZSBub2RlIGlzIHdoaXRlc3BhY2UsIGZhbHNlIG90aGVyd2lzZS4KKwkgKiBAcGFyYW0gbm9kZQorCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZSB0byBjaGVjaworCSAqLworCXN0YXRpYyBwdWJsaWMgYm9vbGVhbiBpc0NvbW1lbnQoTm9kZSBub2RlKSB7CisJCUFzc2VydC5pc05vdE51bGwobm9kZSk7CisKKwkJcmV0dXJuIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNPTU1FTlRfTk9ERTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgbm9kZSBpcyBlbnRpcmVseSB3aGl0ZXBhY2Ugb3Igbm90LgorCSAqIAorCSAqIEByZXR1cm4gYm9vbGVhbiBBbnN3ZXIgdHJ1ZSBpZiB0aGUgbm9kZSBpcyB3aGl0ZXNwYWNlLCBmYWxzZSBvdGhlcndpc2UuCisJICogQHBhcmFtIG5vZGUKKwkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUgVGhlIG5vZGUgdG8gY2hlY2sKKwkgKi8KKwlzdGF0aWMgcHVibGljIGJvb2xlYW4gaXNXaGl0ZXNwYWNlKE5vZGUgbm9kZSkgeworCQlBc3NlcnQuaXNOb3ROdWxsKG5vZGUpOworCisJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5URVhUX05PREUpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJVGV4dCB0ZXh0Tm9kZSA9IChUZXh0KSBub2RlOworCQlTdHJpbmcgdGV4dCA9IHRleHROb2RlLmdldERhdGEoKTsKKwkJaWYgKHRleHQgPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IHRleHQubGVuZ3RoKCk7IGkrKykgeworCQkJaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHRleHQuY2hhckF0KGkpKSkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiBSZW1vdmUgYWxsIHRoZSBjaGlsZHJlbiBvZiA8bm9kZT4KKwkgKi8KKwlzdGF0aWMgcHVibGljIHZvaWQgcmVtb3ZlQWxsQ2hpbGRyZW4oTm9kZSBub2RlKSB7CisJCU5vZGVMaXN0IGxpc3QgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspIHsKKwkJCW5vZGUucmVtb3ZlQ2hpbGQobGlzdC5pdGVtKGkpKTsKKwkJfQorCX0KKworCS8vIHRyYXZlcnNlcyB0aGUgRE9NIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgbm9kZSBhbmQgcmV0dXJucyBhIGxpc3QKKwkvLyBvZiBub2RlcyBtYXRjaGluZyB0aGUgc2VhcmNoIHN0cmluZworCisJc3RhdGljIHB1YmxpYyBBcnJheUxpc3QgZ2V0QWxsTm9kZXMoTm9kZSBub2RlLCBTdHJpbmcgbm9kZU5hbWUpIHsKKwkJQXJyYXlMaXN0IG5vZGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCisJCVN0cmluZ1tdIG5vZGVOYW1lcyA9IHtub2RlTmFtZX07CisJCWZpbmRBbGxOb2Rlcyhub2RlLCBub2RlTmFtZXMsIG5vZGVMaXN0KTsKKworCQlyZXR1cm4gbm9kZUxpc3Q7CisJfQorCisJLy8gdHJhdmVyc2VzIHRoZSBET00gc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBub2RlIGFuZCByZXR1cm5zIGEgbGlzdAorCS8vIG9mIG5vZGVzIG1hdGNoaW5nIHRoZSBzZWFyY2ggc3RyaW5ncworCisJc3RhdGljIHB1YmxpYyBBcnJheUxpc3QgZ2V0QWxsTm9kZXMoTm9kZSBub2RlLCBTdHJpbmdbXSBub2RlTmFtZXNBcnJheSkgeworCQlBcnJheUxpc3Qgbm9kZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisJCWZpbmRBbGxOb2Rlcyhub2RlLCBub2RlTmFtZXNBcnJheSwgbm9kZUxpc3QpOworCisJCXJldHVybiBub2RlTGlzdDsKKwl9CisKKwkvLyByZWN1cnNpdmUgaGVscGVyIGZvciBnZXRBbGxOb2RlcworCXN0YXRpYyBwcml2YXRlIHZvaWQgZmluZEFsbE5vZGVzKE5vZGUgbm9kZSwgU3RyaW5nW10gbm9kZU5hbWVzLCBBcnJheUxpc3QgcmVzdWx0cykgeworCisJCU5vZGVMaXN0IG5vZGVzID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7CisJCWlmIChub2RlcyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKKwkJCQlmb3IgKGludCBqID0gMDsgaiA8IG5vZGVOYW1lcy5sZW5ndGg7IGorKykgeworCQkJCQlpZiAobm9kZXMuaXRlbShpKS5nZXROb2RlTmFtZSgpLmVxdWFscyhub2RlTmFtZXNbal0pKSB7CisJCQkJCQlyZXN1bHRzLmFkZChub2Rlcy5pdGVtKGkpKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlmaW5kQWxsTm9kZXMobm9kZXMuaXRlbShpKSwgbm9kZU5hbWVzLCByZXN1bHRzKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHN5c3RlbSBkZWZpbmVkIEpBWFAgZG9jdW1lbnQgYnVpbGRlcgorCSAqLworCXN0YXRpYyBwdWJsaWMgRG9jdW1lbnRCdWlsZGVyIG5ld0RlZmF1bHREb2N1bWVudEJ1aWxkZXIoRE9NTG9hZE9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24geworCQlEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRiZiA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKwkJZGJmLnNldFZhbGlkYXRpbmcob3B0aW9ucy5pc1ZhbGlkYXRlKCkpOworCQlkYmYuc2V0TmFtZXNwYWNlQXdhcmUob3B0aW9ucy5pc1ZhbGlkYXRlKCkpOworCQkvKgorCQkgKiBDYXVzZXMgZXJyb3JzIGluIElCTSBKREsgdHJ5IHsgZGJmLnNldEF0dHJpYnV0ZShSZW5kZXJlci5KQVhQX1NDSEVNQV9MQU5HVUFHRSwKKwkJICogUmVud2RlcmVyLlczQ19YTUxfU0NIRU1BKTsgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHgpIHsgfQorCQkgKi8KKwkJdHJ5IHsKKwkJCWRiZi5zZXRBdHRyaWJ1dGUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy9hbGxvdy1qYXZhLWVuY29kaW5ncyIsIG5ldyBCb29sZWFuKG9wdGlvbnMuaXNBbGxvd0phdmFFbmNvZGluZ3MoKSkpOyAvLyROT04tTkxTLTEkCSAgICAgICAgCisJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZ25vcmUpIHsKKwkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coIldhcm5pbmc6IFBhcnNlciBkb2VzIG5vdCBzdXBwb3J0IFwiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL2FsbG93LWphdmEtZW5jb2RpbmdzXCIuIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQl0cnkgeworCQkJZGJmLnNldEF0dHJpYnV0ZSgiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL3ZhbGlkYXRpb24vc2NoZW1hIiwgbmV3IEJvb2xlYW4ob3B0aW9ucy5pc1ZhbGlkYXRlKCkpKTsgLy8kTk9OLU5MUy0xJAorCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWdub3JlKSB7CisJCQlkYmYuc2V0VmFsaWRhdGluZyhmYWxzZSk7CisJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKCJXYXJuaW5nOiBQYXJzZXIgZG9lcyBub3Qgc3VwcG9ydCBcImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYVwiLiBWYWxpZGF0aW9uIHdpbGwgYmUgZGlzYWJsZWQuIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlkYmYuc2V0RXhwYW5kRW50aXR5UmVmZXJlbmNlcyhvcHRpb25zLmlzRXhwYW5kRW50aXR5UmVmZXJlcmVuY2VzKCkpOworCQlEb2N1bWVudEJ1aWxkZXIgcmVzdWx0ID0gZGJmLm5ld0RvY3VtZW50QnVpbGRlcigpOworCQlyZXN1bHQuc2V0RXJyb3JIYW5kbGVyKG5ldyBFcnJvckhhbmRsZXIoKSB7CisJCQkvKgorCQkJICogKG5vbi1KYXZhZG9jKQorCQkJICogCisJCQkgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciNlcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKKwkJCSAqLworCQkJcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gYXJnMCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisJCQkJdGhyb3cgYXJnMDsKKwkJCX0KKworCQkJLyoKKwkJCSAqIChub24tSmF2YWRvYykKKwkJCSAqIAorCQkJICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjZmF0YWxFcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKKwkJCSAqLworCQkJcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBhcmcwKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKwkJCQl0aHJvdyBhcmcwOworCQkJfQorCisJCQlwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGFyZzApIHRocm93cyBTQVhFeGNlcHRpb24geworCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dXYXJuaW5nKGFyZzApOworCQkJfQorCisJCX0pOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBzdHViIGRvY3VtZW50LCB3aGVyZSB0aGUgRG9jdW1lbnRUeXBlIGlzIGRlZmluZWQgYnkgdGhlIHBhcmFtZXRlcnMuCisJICovCisJc3RhdGljIHB1YmxpYyBEb2N1bWVudCBjcmVhdGVOZXdEb2N1bWVudChTdHJpbmcgZG9jdHlwZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBnZXREZWZhdWx0RG9jdW1lbnRCdWlsZGVyKCk7CisJCUlucHV0U3RyZWFtIGluID0gY3JlYXRlSGVhZGVySW5wdXRTdHJlYW0oZG9jdHlwZSwgcHVibGljSWQsIHN5c3RlbUlkLCB0cnVlKTsKKwkJRG9jdW1lbnQgcmVzdWx0ID0gYnVpbGRlci5wYXJzZShpbik7CisJCXJlbW92ZUR1bW15RW50aXR5KHJlc3VsdCk7CisJCXJlbW92ZUV4dHJhbmVvdXNDb21tZW50cyhyZXN1bHQpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXB1YmxpYyBzdGF0aWMgRG9jdW1lbnQgbG9hZERvY3VtZW50KElucHV0U3RyZWFtIGluLCBET01Mb2FkT3B0aW9ucyBvcHRpb25zLCBFbnRpdHlSZXNvbHZlciByZXNvbHZlcikgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IERPTVV0aWxpdGllcy5uZXdEZWZhdWx0RG9jdW1lbnRCdWlsZGVyKG9wdGlvbnMpOworCQlidWlsZGVyLnNldEVudGl0eVJlc29sdmVyKHJlc29sdmVyKTsKKwkJRG9jdW1lbnQgcmVzdWx0ID0gYnVpbGRlci5wYXJzZShpbik7CisJCXJlbW92ZUV4dHJhbmVvdXNDb21tZW50cyhyZXN1bHQpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIEF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZywgdGhlIERPTSBMZXZlbCAyIEFQSXMgYXJlIG5vdCBhZHZhbmNlZCBlbm91Z2ggZm9yIHNldHRpbmcgdGhlCisJICogZG9jdW1lbnQgdHlwZTsgc28gdGhlIG9ubHkgcGFyc2VyIGluZGVwZW5kZW50IHdheSBvZiBhY2NvbXBsaXNoaW5nIHRoaXMgaXMgYnkgY3JlYXRpbmcgYQorCSAqIHN0cmVhbSBhbmQgcGFyc2luZyBpdC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtIGNyZWF0ZUhlYWRlcklucHV0U3RyZWFtKFN0cmluZyBkb2N0eXBlLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgeworCQlyZXR1cm4gY3JlYXRlSGVhZGVySW5wdXRTdHJlYW0oZG9jdHlwZSwgcHVibGljSWQsIHN5c3RlbUlkLCBmYWxzZSk7CisJfQorCisKKwkKKwlwcml2YXRlIHN0YXRpYyBJbnB1dFN0cmVhbSBjcmVhdGVIZWFkZXJJbnB1dFN0cmVhbShTdHJpbmcgZG9jdHlwZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQsIGJvb2xlYW4gaW5jbHVkZUR1bW15KSB7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisKKwkJLy8gVGhlIHByaW9yIGNvZGUgKHdoaWNoIGlzIHN0aWxsIGluIHRoZSBjYXRjaCBibG9jayksIHVzZXMKKwkJLy8gdGhlIHN5c3RlbSBkZWZhdWx0IGVuY29kaW5nIFtTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuZW5jb2RpbmciKV07CisJCS8vIG9uIFovT1MgdGhpcyBpcyBDcDEwNDcuIFRoZSBjb21iaW5hdGlvbiBvZiAiVVRGLTgiIGluIHRoZSBoZWFkZXIKKwkJLy8gYW5kICJDcDEwNDciIGluIHRoZSB3cml0ZXIgY3JlYXRlIGFuIHVudXNhYmxlIGlucHV0IHN0cmVhbS4KKworCQlQcmludFdyaXRlciB3cml0ZXI7CisKKwkJdHJ5IHsKKwkJCU91dHB1dFN0cmVhbVdyaXRlciBvdXRwdXRXcml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dHB1dFN0cmVhbSwgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKKwkJCS8vIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCisJCQl3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIob3V0cHV0V3JpdGVyKTsKKwkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisJCQkvLyBTaG91bGQgbmV2ZXIgZ2V0IGhlcmUgKGVhcmxpZXIgY29kZSkKKwkJCXdyaXRlciA9IG5ldyBQcmludFdyaXRlcihvdXRwdXRTdHJlYW0pOyAKKwkJfQorCisJCXdyaXRlSGVhZGVyKHdyaXRlciwgZG9jdHlwZSwgcHVibGljSWQsIHN5c3RlbUlkKTsKKwkJaWYgKGluY2x1ZGVEdW1teSkKKwkJCWFkZER1bW15RW50aXR5KHdyaXRlcik7CisJCXdyaXRlci5mbHVzaCgpOworCQl3cml0ZXIuY2xvc2UoKTsKKworCQlieXRlW10gYnl0ZXMgPSBvdXRwdXRTdHJlYW0udG9CeXRlQXJyYXkoKTsKKwkJcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7CisJfQorCisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlSGVhZGVyKFByaW50V3JpdGVyIHdyaXRlciwgU3RyaW5nIGRvY3R5cGUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB7CisJCXdyaXRlci53cml0ZSgiPD94bWwgdmVyc2lvbj1cIiIpOyAvLyROT04tTkxTLTEkCisJCXdyaXRlci53cml0ZSgiMS4wIik7IC8vJE5PTi1OTFMtMSQKKwkJd3JpdGVyLndyaXRlKCJcIiBlbmNvZGluZz1cIiIpOyAvLyROT04tTkxTLTEkCisJCXdyaXRlci53cml0ZSgiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAorCQl3cml0ZXIud3JpdGUoIlwiPz4iKTsgLy8kTk9OLU5MUy0xJAorCQl3cml0ZXIucHJpbnRsbigpOworCisJCWlmIChkb2N0eXBlICE9IG51bGwpIHsKKwkJCXdyaXRlci53cml0ZSgiPCFET0NUWVBFICIpOyAvLyROT04tTkxTLTEkCisJCQl3cml0ZXIud3JpdGUoZG9jdHlwZSk7CisJCQl3cml0ZXIud3JpdGUoIiBQVUJMSUMgXCIiKTsgLy8kTk9OLU5MUy0xJAorCQkJd3JpdGVyLndyaXRlKHB1YmxpY0lkKTsKKwkJCXdyaXRlci53cml0ZSgiXCIgXCIiKTsgLy8kTk9OLU5MUy0xJAorCQkJd3JpdGVyLndyaXRlKHN5c3RlbUlkKTsKKwkJCXdyaXRlci53cml0ZSgiXCI+Iik7IC8vJE5PTi1OTFMtMSQKKwkJCXdyaXRlci5wcmludGxuKCk7CisJCX0KKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZER1bW15RW50aXR5KFByaW50V3JpdGVyIHdyaXRlcikgeworCQlSZXZpc2l0LnJldmlzaXQoKTsKKwkJd3JpdGVyLnByaW50bG4oRFVNTVlfRU5USVRZX05PREVfU1RSSU5HKTsKKwkJLy9NYWpvciBoYWNrIGJlY2F1c2Ugd2UgY2FuIG5vdCBwYXJzZSBhbiBlbXB0eSBkb2N1bWVudAorCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlRHVtbXlFbnRpdHkoRG9jdW1lbnQgZG9jKSB7CisJCWRvYy5yZW1vdmVDaGlsZChnZXROb2RlQ2hpbGQoZG9jLCBEVU1NWV9FTlRJVFlfU1RSSU5HKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVFeHRyYW5lb3VzQ29tbWVudHMoRG9jdW1lbnQgZG9jKSB7CisJCS8vYW5vdGhlciBtYWpvciBoYWNrIGJlY2F1c2Ugb2YgYSBidWcgaW4gWE1MNEogNC4wLjcgdGhhdCBhZGRlZCBhbGwgdGhlCisJCS8vY29tbWVudHMgZnJvbSB0aGUgZHRkIHRvIHRoZSBkb2N1bWVudC4gQ2FuIGJlIHJlbW92ZWQgYWZ0ZXIgd2UgbW92ZSB1cAorCQkvL1hlcmNlcyBsZXZlbHMKKwkJTm9kZSBhTm9kZSA9IGRvYy5nZXRGaXJzdENoaWxkKCk7CisJCXdoaWxlIChhTm9kZSAhPSBudWxsKSB7CisJCQlOb2RlIG5leHROb2RlID0gYU5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKKwkJCWlmIChhTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQ09NTUVOVF9OT0RFKQorCQkJCWRvYy5yZW1vdmVDaGlsZChhTm9kZSk7CisJCQlhTm9kZSA9IG5leHROb2RlOworCQl9CisJfQorCisJLyoqCisJICogRm9yIHBlcmZvcm1hbmNlLCBjYWNoZSBhIHN0YXRpYyBpbnN0YW5jZSBvZiB0aGUgSkFYUCByZWdpc3RlcmVkIGRvY3VtZW50IGJ1aWxkZXIuIFZhbGlkYXRpb24KKwkgKiBpcyBkaXNhYmxlZCBmb3IgdGhpcyBpbnN0YW5jZS4gSWYgeW91IG5lZWQgdmFsaWRhdGlvbiwgdXNlCisJICoge0BsaW5rICNuZXdEZWZhdWx0RG9jdW1lbnRCdWlsZGVyKGJvb2xlYW4sIGJvb2xlYW4sIGJvb2xlYW4pfQorCSAqIAorCSAqIEByZXR1cm4gRG9jdW1lbnRCdWlsZGVyCisJICogQHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgSkFYUCBpcyBub3QgY29uZmlndXJlZCBjb3JyZWN0bHkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIERvY3VtZW50QnVpbGRlciBnZXREZWZhdWx0RG9jdW1lbnRCdWlsZGVyKCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24geworCQlpZiAoZGVmYXVsdERvY3VtZW50QnVpbGRlciA9PSBudWxsKSB7CisJCQlET01Mb2FkT3B0aW9ucyBvcHRzID0gbmV3IERPTUxvYWRPcHRpb25zKCk7CisJCQlvcHRzLnNldEFsbG93SmF2YUVuY29kaW5ncyh0cnVlKTsKKwkJCW9wdHMuc2V0RXhwYW5kRW50aXR5UmVmZXJlcmVuY2VzKHRydWUpOworCQkJb3B0cy5zZXRWYWxpZGF0ZShmYWxzZSk7CisJCQlkZWZhdWx0RG9jdW1lbnRCdWlsZGVyID0gbmV3RGVmYXVsdERvY3VtZW50QnVpbGRlcihvcHRzKTsKKwkJCWRlZmF1bHREb2N1bWVudEJ1aWxkZXIuc2V0RW50aXR5UmVzb2x2ZXIoZGVmYXVsdEVudGl0eVJlc29sdmVyKTsKKwkJCWRlZmF1bHREb2N1bWVudEJ1aWxkZXIuc2V0RXJyb3JIYW5kbGVyKG5ldyBFcnJvckhhbmRsZXIoKSB7CisJCQkJLyoKKwkJCQkgKiAobm9uLUphdmFkb2MpCisJCQkJICogCisJCQkJICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjZXJyb3Iob3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCisJCQkJICovCisJCQkJcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKworCQkJCX0KKworCQkJCS8qCisJCQkJICogKG5vbi1KYXZhZG9jKQorCQkJCSAqIAorCQkJCSAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI2ZhdGFsRXJyb3Iob3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCisJCQkJICovCisJCQkJcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24geworCisJCQkJfQorCisJCQkJLyoKKwkJCQkgKiAobm9uLUphdmFkb2MpCisJCQkJICogCisJCQkJICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjd2FybmluZyhvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKKwkJCQkgKi8KKwkJCQlwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisKKwkJCQl9CisKKwkJCX0pOworCQl9CisKKwkJcmV0dXJuIGRlZmF1bHREb2N1bWVudEJ1aWxkZXI7CisJfQorCisJLyoqCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBzdGF0aWMgRW50aXR5UmVzb2x2ZXIgZ2V0RGVmYXVsdEVudGl0eVJlc29sdmVyKCkgeworCQlyZXR1cm4gZGVmYXVsdEVudGl0eVJlc29sdmVyOworCX0KKworCS8qKgorCSAqIEBwYXJhbSByZXNvbHZlcgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZWZhdWx0RW50aXR5UmVzb2x2ZXIoRW50aXR5UmVzb2x2ZXIgcmVzb2x2ZXIpIHsKKwkJZGVmYXVsdEVudGl0eVJlc29sdmVyID0gcmVzb2x2ZXI7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRGFuZ2xpbmdIUkVGRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRGFuZ2xpbmdIUkVGRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGViZDAwNgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9EYW5nbGluZ0hSRUZFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIENyZWF0ZWQgb24gTWF5IDEyLCAyMDAzCisgKgorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKKworLyoqCisgKiBFeGNlcHRpb24gdGhyb3duIHdoZW4gYSBwcm94eSBjYW4gbm90IGJlIHJlc29sdmVkCisgKi8KK3B1YmxpYyBjbGFzcyBEYW5nbGluZ0hSRUZFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCisKKwlwdWJsaWMgRGFuZ2xpbmdIUkVGRXhjZXB0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBzCisJICovCisJcHVibGljIERhbmdsaW5nSFJFRkV4Y2VwdGlvbihTdHJpbmcgcykgeworCQlzdXBlcihzKTsKKwl9CisKKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0RlZmF1bHRGZWF0dXJlVmFsdWVDb252ZXJ0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9EZWZhdWx0RmVhdHVyZVZhbHVlQ29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE1NjY5NwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9EZWZhdWx0RmVhdHVyZVZhbHVlQ29udmVydGVyLmphdmEKQEAgLTAsMCArMSwzNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKKworCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bUxpdGVyYWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5YTUxUeXBlUGFja2FnZTsKKworLyoqCisgKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNS8xMC8yMDAxIDI6NDk6NDkgUE0pCisgKiAKKyAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKKyAqLworcHVibGljIGNsYXNzIERlZmF1bHRGZWF0dXJlVmFsdWVDb252ZXJ0ZXIgaW1wbGVtZW50cyBGZWF0dXJlVmFsdWVDb252ZXJ0ZXIgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGQUlMRURfQ09OVkVSU0lPTl9QQVRURVJOID0gV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuRmFpbGVkX3RvX2NvbnZlcnRfXzBfX3RvX19fRVJST1JfOworCisJLyoqCisJICogRGVmYXVsdEZlYXR1cmVWYWx1ZUNvbnZlcnRlciBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqLworCXB1YmxpYyBEZWZhdWx0RmVhdHVyZVZhbHVlQ29udmVydGVyKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIENvbnZlcnQKKwkgKiAKKwkgKiBAYVZhbHVlIHRvIGEgQm9vbGVhbi4KKwkgKi8KKwlwcm90ZWN0ZWQgT2JqZWN0IGNvbnZlcnRUb0Jvb2xlYW4oT2JqZWN0IGFWYWx1ZSkgeworCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQorCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZigoU3RyaW5nKSBhVmFsdWUpOworCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikKKwkJCXJldHVybiBhVmFsdWU7CisJCXJldHVybiBmYWlsZWRUb0NvbnZlcnQoYVZhbHVlLCBXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5Cb29sZWFuX1VJXyk7CisJfQorCisJLyoqCisJICogQ29udmVydAorCSAqIAorCSAqIEBhVmFsdWUgdG8gYSBCeXRlLgorCSAqLworCXByb3RlY3RlZCBPYmplY3QgY29udmVydFRvQnl0ZShPYmplY3QgYVZhbHVlKSB7CisJCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCisJCQlyZXR1cm4gQnl0ZS52YWx1ZU9mKChTdHJpbmcpIGFWYWx1ZSk7CisJCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBCeXRlKQorCQkJcmV0dXJuIGFWYWx1ZTsKKwkJcmV0dXJuIGZhaWxlZFRvQ29udmVydChhVmFsdWUsIFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLkJ5dGVfVUlfKTsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0CisJICogCisJICogQGFWYWx1ZSB0byBhIENoYXJhY3Rlci4KKwkgKi8KKwlwcm90ZWN0ZWQgT2JqZWN0IGNvbnZlcnRUb0NoYXJhY3RlcihPYmplY3QgYVZhbHVlKSB7CisJCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgJiYgKChTdHJpbmcpIGFWYWx1ZSkubGVuZ3RoKCkgPT0gMSkKKwkJCXJldHVybiBuZXcgQ2hhcmFjdGVyKCgoU3RyaW5nKSBhVmFsdWUpLmNoYXJBdCgwKSk7CisJCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpCisJCQlyZXR1cm4gYVZhbHVlOworCQlyZXR1cm4gZmFpbGVkVG9Db252ZXJ0KGFWYWx1ZSwgV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuQ2hhcmFjdGVyX1VJXyk7CisJfQorCisJLyoqCisJICogQ29udmVydAorCSAqIAorCSAqIEBhVmFsdWUgdG8gYSBEb3VibGUuCisJICovCisJcHJvdGVjdGVkIE9iamVjdCBjb252ZXJ0VG9Eb3VibGUoT2JqZWN0IGFWYWx1ZSkgeworCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7CisJCQl0cnkgeworCQkJCXJldHVybiBEb3VibGUudmFsdWVPZigoU3RyaW5nKSBhVmFsdWUpOworCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJCQlyZXR1cm4gZGVmYXVsdERvdWJsZSgpOworCQkJfQorCQl9CisJCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBEb3VibGUpCisJCQlyZXR1cm4gYVZhbHVlOworCQlyZXR1cm4gZmFpbGVkVG9Db252ZXJ0KGFWYWx1ZSwgV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuRG91YmxlX1VJXyk7CisJfQorCisJLyoqCisJICogQ29udmVydAorCSAqIAorCSAqIEBhVmFsdWUgdG8gYSBFRW51bUxpdGVyYWwuCisJICovCisJcHJvdGVjdGVkIE9iamVjdCBjb252ZXJ0VG9FbnVtKE9iamVjdCBhVmFsdWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgeworCQlFRW51bUxpdGVyYWwgbGl0ZXJhbCA9IG51bGw7CisJCUVFbnVtIGVlbnVtID0gKEVFbnVtKSBhRmVhdHVyZS5nZXRFVHlwZSgpOworCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQorCQkJbGl0ZXJhbCA9IGVlbnVtLmdldEVFbnVtTGl0ZXJhbCgoU3RyaW5nKSBhVmFsdWUpOworCQllbHNlIGlmIChhVmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyKQorCQkJbGl0ZXJhbCA9IGVlbnVtLmdldEVFbnVtTGl0ZXJhbCgoKEludGVnZXIpIGFWYWx1ZSkuaW50VmFsdWUoKSk7CisJCWVsc2UgaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIEVFbnVtTGl0ZXJhbCkKKwkJCWxpdGVyYWwgPSAoRUVudW1MaXRlcmFsKSBhVmFsdWU7CisKKwkJaWYgKGxpdGVyYWwgPT0gbnVsbCkKKwkJCXJldHVybiBmYWlsZWRUb0NvbnZlcnQoYVZhbHVlLCBXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5FbnVtZXJhdGlvbl9VSV8pOworCisJCXJldHVybiBsaXRlcmFsLmdldEluc3RhbmNlKCk7CisJfQorCisJLyoqCisJICogQ29udmVydAorCSAqIAorCSAqIEBhVmFsdWUgdG8gYSBGbG9hdC4KKwkgKi8KKwlwcm90ZWN0ZWQgT2JqZWN0IGNvbnZlcnRUb0Zsb2F0KE9iamVjdCBhVmFsdWUpIHsKKwkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgeworCQkJdHJ5IHsKKwkJCQlyZXR1cm4gRmxvYXQudmFsdWVPZigoU3RyaW5nKSBhVmFsdWUpOworCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJCQlyZXR1cm4gZGVmYXVsdEZsb2F0KCk7CisJCQl9CisJCX0KKwkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIEZsb2F0KQorCQkJcmV0dXJuIGFWYWx1ZTsKKwkJcmV0dXJuIGZhaWxlZFRvQ29udmVydChhVmFsdWUsIFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLkZsb2F0X1VJXyk7CisJfQorCisJLyoqCisJICogQ29udmVydAorCSAqIAorCSAqIEBhVmFsdWUgdG8gYSBJbnRlZ2VyLgorCSAqLworCXByb3RlY3RlZCBPYmplY3QgY29udmVydFRvSW50ZWdlcihPYmplY3QgYVZhbHVlKSB7CisJCWlmIChhVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKwkJCXRyeSB7CisJCQkJcmV0dXJuIEludGVnZXIudmFsdWVPZigoU3RyaW5nKSBhVmFsdWUpOworCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJCQlyZXR1cm4gZGVmYXVsdEludGVnZXIoKTsKKwkJCX0KKwkJfQorCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgSW50ZWdlcikKKwkJCXJldHVybiBhVmFsdWU7CisJCXJldHVybiBmYWlsZWRUb0NvbnZlcnQoYVZhbHVlLCBXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5JbnRlZ2VyX1VJXyk7CisJfQorCisJLyoqCisJICogQ29udmVydAorCSAqIAorCSAqIEBhVmFsdWUgdG8gYSBKYXZhIE9iamVjdC4KKwkgKi8KKwlwcm90ZWN0ZWQgT2JqZWN0IGNvbnZlcnRUb0phdmFPYmplY3QoT2JqZWN0IGFWYWx1ZSkgeworCQlyZXR1cm4gYVZhbHVlOworCX0KKworCS8qKgorCSAqIENvbnZlcnQKKwkgKiAKKwkgKiBAYVZhbHVlIHRvIGEgTG9uZy4KKwkgKi8KKwlwcm90ZWN0ZWQgT2JqZWN0IGNvbnZlcnRUb0xvbmcoT2JqZWN0IGFWYWx1ZSkgeworCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7CisJCQl0cnkgeworCQkJCXJldHVybiBMb25nLnZhbHVlT2YoKFN0cmluZykgYVZhbHVlKTsKKwkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisJCQkJcmV0dXJuIGRlZmF1bHRMb25nKCk7CisJCQl9CisJCX0KKwkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIExvbmcpCisJCQlyZXR1cm4gYVZhbHVlOworCQlyZXR1cm4gZmFpbGVkVG9Db252ZXJ0KGFWYWx1ZSwgV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuTG9uZ19VSV8pOworCX0KKworCS8qKgorCSAqIENvbnZlcnQKKwkgKiAKKwkgKiBAYVZhbHVlIHRvIGEgTW9mT2JqZWN0LgorCSAqLworCXByb3RlY3RlZCBPYmplY3QgY29udmVydFRvTW9mT2JqZWN0KE9iamVjdCBhVmFsdWUpIHsKKwkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIEVPYmplY3QpCisJCQlyZXR1cm4gYVZhbHVlOworCQlyZXR1cm4gZmFpbGVkVG9Db252ZXJ0KGFWYWx1ZSwgV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuTW9mT2JqZWN0X1VJXyk7CisJfQorCisJLyoqCisJICogQ29udmVydAorCSAqIAorCSAqIEBhVmFsdWUgdG8gYSBTaG9ydC4KKwkgKi8KKwlwcm90ZWN0ZWQgT2JqZWN0IGNvbnZlcnRUb1Nob3J0KE9iamVjdCBhVmFsdWUpIHsKKwkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgeworCQkJdHJ5IHsKKwkJCQlyZXR1cm4gU2hvcnQudmFsdWVPZigoU3RyaW5nKSBhVmFsdWUpOworCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJCQlyZXR1cm4gZGVmYXVsdFNob3J0KCk7CisJCQl9CisJCX0KKwkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIFNob3J0KQorCQkJcmV0dXJuIGFWYWx1ZTsKKwkJcmV0dXJuIGZhaWxlZFRvQ29udmVydChhVmFsdWUsIFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLlNob3J0X1VJXyk7CisJfQorCisJLyoqCisJICogQ29udmVydAorCSAqIAorCSAqIEBhVmFsdWUgdG8gYSBTdHJpbmcuCisJICovCisJcHJvdGVjdGVkIE9iamVjdCBjb252ZXJ0VG9TdHJpbmcoT2JqZWN0IGFWYWx1ZSkgeworCQlyZXR1cm4gYVZhbHVlLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogQ29udmVydAorCSAqIAorCSAqIEBhVmFsdWUgdG8gdGhlIHR5cGUgb2YKKwkgKiBAYW5BdHRyaWJ1dGUuCisJICovCisJcHJvdGVjdGVkIE9iamVjdCBjb252ZXJ0VmFsdWUoT2JqZWN0IGFWYWx1ZSwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGUgYW5BdHRyaWJ1dGUpIHsKKworCQlFQ2xhc3NpZmllciBtZXRhID0gYW5BdHRyaWJ1dGUuZ2V0RVR5cGUoKTsKKwkJaWYgKG1ldGEuZUNsYXNzKCkgPT0gRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFRW51bSgpKQorCQkJcmV0dXJuIGNvbnZlcnRUb0VudW0oYVZhbHVlLCBhbkF0dHJpYnV0ZSk7CisJCWlmIChtZXRhLmdldEVQYWNrYWdlKCkgaW5zdGFuY2VvZiBFY29yZVBhY2thZ2UpCisJCXsKKwkJCXN3aXRjaCAobWV0YS5nZXRDbGFzc2lmaWVySUQoKSkgeworCQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVTVFJJTkcgOgorCQkJCQlyZXR1cm4gY29udmVydFRvU3RyaW5nKGFWYWx1ZSk7CisJCQkJY2FzZSBFY29yZVBhY2thZ2UuRUJPT0xFQU5fT0JKRUNUIDoKKwkJCQljYXNlIEVjb3JlUGFja2FnZS5FQk9PTEVBTiA6CisJCQkJCXJldHVybiBjb252ZXJ0VG9Cb29sZWFuKGFWYWx1ZSk7CisJCQkJY2FzZSBFY29yZVBhY2thZ2UuRUlOVEVHRVJfT0JKRUNUIDoKKwkJCQljYXNlIEVjb3JlUGFja2FnZS5FSU5UIDoKKwkJCQkJcmV0dXJuIGNvbnZlcnRUb0ludGVnZXIoYVZhbHVlKTsKKwkJCQljYXNlIEVjb3JlUGFja2FnZS5FRkxPQVRfT0JKRUNUIDoKKwkJCQljYXNlIEVjb3JlUGFja2FnZS5FRkxPQVQgOgorCQkJCQlyZXR1cm4gY29udmVydFRvRmxvYXQoYVZhbHVlKTsKKwkJCQljYXNlIEVjb3JlUGFja2FnZS5FQ0hBUkFDVEVSX09CSkVDVCA6CisJCQkJY2FzZSBFY29yZVBhY2thZ2UuRUNIQVIgOgorCQkJCQlyZXR1cm4gY29udmVydFRvQ2hhcmFjdGVyKGFWYWx1ZSk7CisJCQkJY2FzZSBFY29yZVBhY2thZ2UuRUxPTkdfT0JKRUNUIDoKKwkJCQljYXNlIEVjb3JlUGFja2FnZS5FTE9ORyA6CisJCQkJCXJldHVybiBjb252ZXJ0VG9Mb25nKGFWYWx1ZSk7CisJCQkJY2FzZSBFY29yZVBhY2thZ2UuRUJZVEVfT0JKRUNUIDoKKwkJCQljYXNlIEVjb3JlUGFja2FnZS5FQllURSA6CisJCQkJCXJldHVybiBjb252ZXJ0VG9CeXRlKGFWYWx1ZSk7CisJCQkJY2FzZSBFY29yZVBhY2thZ2UuRURPVUJMRV9PQkpFQ1QgOgorCQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVET1VCTEUgOgorCQkJCQlyZXR1cm4gY29udmVydFRvRG91YmxlKGFWYWx1ZSk7CisJCQkJY2FzZSBFY29yZVBhY2thZ2UuRVNIT1JUX09CSkVDVCA6CisJCQkJY2FzZSBFY29yZVBhY2thZ2UuRVNIT1JUIDoKKwkJCQkJcmV0dXJuIGNvbnZlcnRUb1Nob3J0KGFWYWx1ZSk7CisJCQkJLy8JCWNhc2UgRWNvcmVQYWNrYWdlLkVFTlVNOgorCQkJCS8vCQkJcmV0dXJuIGNvbnZlcnRUb0VudW0oYVZhbHVlLCBhbkF0dHJpYnV0ZSk7CisJCQkJY2FzZSBFY29yZVBhY2thZ2UuRU9CSkVDVCA6CisJCQkJCXJldHVybiBjb252ZXJ0VG9Nb2ZPYmplY3QoYVZhbHVlKTsKKwkJCQljYXNlIEVjb3JlUGFja2FnZS5FSkFWQV9PQkpFQ1QgOgorCQkJCQlyZXR1cm4gY29udmVydFRvSmF2YU9iamVjdChhVmFsdWUpOworCQkJfQorCQl9CisJCWVsc2UgaWYgKG1ldGEuZ2V0RVBhY2thZ2UoKSBpbnN0YW5jZW9mIFhNTFR5cGVQYWNrYWdlKQorCQl7CisJCQlzd2l0Y2ggKG1ldGEuZ2V0Q2xhc3NpZmllcklEKCkpIHsKKwkJCWNhc2UgWE1MVHlwZVBhY2thZ2UuU1RSSU5HIDoKKwkJCQlyZXR1cm4gY29udmVydFRvU3RyaW5nKGFWYWx1ZSk7CisJCQljYXNlIFhNTFR5cGVQYWNrYWdlLkJPT0xFQU5fT0JKRUNUIDoKKwkJCWNhc2UgWE1MVHlwZVBhY2thZ2UuQk9PTEVBTiA6CisJCQkJcmV0dXJuIGNvbnZlcnRUb0Jvb2xlYW4oYVZhbHVlKTsKKwkJCWNhc2UgWE1MVHlwZVBhY2thZ2UuSU5UX09CSkVDVCA6CisJCQljYXNlIFhNTFR5cGVQYWNrYWdlLklOVEVHRVIgOgorCQkJY2FzZSBYTUxUeXBlUGFja2FnZS5JTlQgOgorCQkJCXJldHVybiBjb252ZXJ0VG9JbnRlZ2VyKGFWYWx1ZSk7CisJCQljYXNlIFhNTFR5cGVQYWNrYWdlLkZMT0FUX09CSkVDVCA6CisJCQljYXNlIFhNTFR5cGVQYWNrYWdlLkZMT0FUIDoKKwkJCQlyZXR1cm4gY29udmVydFRvRmxvYXQoYVZhbHVlKTsKKwkJCWNhc2UgWE1MVHlwZVBhY2thZ2UuTE9OR19PQkpFQ1QgOgorCQkJY2FzZSBYTUxUeXBlUGFja2FnZS5MT05HIDoKKwkJCQlyZXR1cm4gY29udmVydFRvTG9uZyhhVmFsdWUpOworCQkJY2FzZSBYTUxUeXBlUGFja2FnZS5CWVRFX09CSkVDVCA6CisJCQljYXNlIFhNTFR5cGVQYWNrYWdlLkJZVEUgOgorCQkJCXJldHVybiBjb252ZXJ0VG9CeXRlKGFWYWx1ZSk7CisJCQljYXNlIFhNTFR5cGVQYWNrYWdlLkRPVUJMRV9PQkpFQ1QgOgorCQkJY2FzZSBYTUxUeXBlUGFja2FnZS5ET1VCTEUgOgorCQkJCXJldHVybiBjb252ZXJ0VG9Eb3VibGUoYVZhbHVlKTsKKwkJCWNhc2UgWE1MVHlwZVBhY2thZ2UuU0hPUlRfT0JKRUNUIDoKKwkJCWNhc2UgWE1MVHlwZVBhY2thZ2UuU0hPUlQgOgorCQkJCXJldHVybiBjb252ZXJ0VG9TaG9ydChhVmFsdWUpOworCQkJfQorCQl9CisJCXJldHVybiBhVmFsdWU7CisJfQorCisJLyoqCisJICogQ29udmVydAorCSAqIAorCSAqIEBhVmFsdWUgdG8gdGhlIHR5cGUgb2YKKwkgKiBAYUZlYXR1cmUuCisJICovCisJcHVibGljIE9iamVjdCBjb252ZXJ0VmFsdWUoT2JqZWN0IGFWYWx1ZSwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSkgeworCQlpZiAoYVZhbHVlID09IG51bGwgfHwgYUZlYXR1cmUgPT0gbnVsbCB8fCAhKGFGZWF0dXJlIGluc3RhbmNlb2YgRUF0dHJpYnV0ZSkpCisJCQlyZXR1cm4gYVZhbHVlOyAvL25vdGhpbmcgdG8gY29udmVydAorCQlyZXR1cm4gY29udmVydFZhbHVlKGFWYWx1ZSwgKEVBdHRyaWJ1dGUpIGFGZWF0dXJlKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgRG91YmxlIHZhbHVlLgorCSAqLworCXByb3RlY3RlZCBEb3VibGUgZGVmYXVsdERvdWJsZSgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBkZWZhdWx0IEZsb2F0IHZhbHVlLgorCSAqLworCXByb3RlY3RlZCBGbG9hdCBkZWZhdWx0RmxvYXQoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgZGVmYXVsdCBJbnRlZ2VyIHZhbHVlLgorCSAqLworCXByb3RlY3RlZCBJbnRlZ2VyIGRlZmF1bHRJbnRlZ2VyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgTG9uZyB2YWx1ZS4KKwkgKi8KKwlwcm90ZWN0ZWQgTG9uZyBkZWZhdWx0TG9uZygpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBkZWZhdWx0IFNob3J0IHZhbHVlLgorCSAqLworCXByb3RlY3RlZCBTaG9ydCBkZWZhdWx0U2hvcnQoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIEZhaWxlZCB0byBjb252ZXJ0CisJICogCisJICogQGFWYWx1ZS4KKwkgKi8KKwlwcm90ZWN0ZWQgT2JqZWN0IGZhaWxlZFRvQ29udmVydChPYmplY3QgYVZhbHVlLCBTdHJpbmcgYVN0cmluZykgeworCQlTdHJpbmcgZXJyb3JTdHJpbmcgPSBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQoRkFJTEVEX0NPTlZFUlNJT05fUEFUVEVSTiwgbmV3IFN0cmluZ1tde2FWYWx1ZS50b1N0cmluZygpLCBhU3RyaW5nfSk7CisJCXRocm93IG5ldyBGZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uKGVycm9yU3RyaW5nKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRGVmYXVsdE92ZXJyaWRhYmxlUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9EZWZhdWx0T3ZlcnJpZGFibGVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyN2MwYTQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRGVmYXVsdE92ZXJyaWRhYmxlUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIENyZWF0ZWQgb24gTWFyIDE0LCAyMDAzCisgKgorICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCisgKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UuRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUZhY3RvcnlSZWdpc3RyeUltcGw7CisKKy8qKgorICogQGF1dGhvciBEQUJFUkcKKyAqIAorICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCisgKi8KK3B1YmxpYyBjbGFzcyBEZWZhdWx0T3ZlcnJpZGFibGVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSBleHRlbmRzIFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5SW1wbCB7CisJcHJvdGVjdGVkIHN0YXRpYyBSZXNvdXJjZS5GYWN0b3J5IEdMT0JBTF9GQUNUT1JZID0gUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRGYWN0b3J5KFVSSS5jcmVhdGVVUkkoREVGQVVMVF9FWFRFTlNJT04pKTsKKworCS8qKgorCSAqICAKKwkgKi8KKwlwdWJsaWMgRGVmYXVsdE92ZXJyaWRhYmxlUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIFJlc291cmNlLkZhY3RvcnkgZ2V0RmFjdG9yeShVUkkgdXJpKSB7CisJCXJldHVybiBnZXRGYWN0b3J5KHVyaSwgbnVsbCk7CisJfQorCisJcHVibGljIFJlc291cmNlLkZhY3RvcnkgZ2V0RmFjdG9yeShVUkkgdXJpLCBTdHJpbmcgY29udGVudFR5cGUpCisJeworCQlPYmplY3QgcmVzb3VyY2VGYWN0b3J5ID0gbnVsbDsKKwkJaWYgKHJlc291cmNlRmFjdG9yeSA9PSBudWxsKSB7CisJCQlTdHJpbmcgcHJvdG9jb2wgPSB1cmkuc2NoZW1lKCk7CisJCQlyZXNvdXJjZUZhY3RvcnkgPSBwcm90b2NvbFRvRmFjdG9yeU1hcC5nZXQocHJvdG9jb2wpOworCQkJaWYgKHJlc291cmNlRmFjdG9yeSA9PSBudWxsKSB7CisJCQkJU3RyaW5nIGV4dGVuc2lvbiA9IHVyaS5maWxlRXh0ZW5zaW9uKCk7CisJCQkJcmVzb3VyY2VGYWN0b3J5ID0gZXh0ZW5zaW9uVG9GYWN0b3J5TWFwLmdldChleHRlbnNpb24pOworCQkJCWlmIChyZXNvdXJjZUZhY3RvcnkgPT0gbnVsbCkgeworCQkJCQlyZXNvdXJjZUZhY3RvcnkgPSBkZWxlZ2F0ZWRHZXRGYWN0b3J5KHVyaSk7CisJCQkJCWlmIChyZXNvdXJjZUZhY3RvcnkgPT0gR0xPQkFMX0ZBQ1RPUlkpIHsKKwkJCQkJCXJlc291cmNlRmFjdG9yeSA9IGV4dGVuc2lvblRvRmFjdG9yeU1hcC5nZXQoUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5ERUZBVUxUX0VYVEVOU0lPTik7CisJCQkJCQlpZiAocmVzb3VyY2VGYWN0b3J5ID09IG51bGwpCisJCQkJCQkJcmVzb3VyY2VGYWN0b3J5ID0gR0xPQkFMX0ZBQ1RPUlk7CisJCQkJCX0KKworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiByZXNvdXJjZUZhY3RvcnkgaW5zdGFuY2VvZiBSZXNvdXJjZS5GYWN0b3J5LkRlc2NyaXB0b3IgPyAoKFJlc291cmNlLkZhY3RvcnkuRGVzY3JpcHRvcikgcmVzb3VyY2VGYWN0b3J5KS5jcmVhdGVGYWN0b3J5KCkgOiAoUmVzb3VyY2UuRmFjdG9yeSkgcmVzb3VyY2VGYWN0b3J5OworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnlJbXBsI2RlbGVnYXRlZEdldEZhY3Rvcnkob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSkKKwkgKi8KKwlwcm90ZWN0ZWQgRmFjdG9yeSBkZWxlZ2F0ZWRHZXRGYWN0b3J5KFVSSSB1cmkpIHsKKwkJcmV0dXJuIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RmFjdG9yeSh1cmkpOworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9EZWZlcnJlZFJlZmVyZW5jZVV0aWxpdHlBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9EZWZlcnJlZFJlZmVyZW5jZVV0aWxpdHlBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzFmNjY4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0RlZmVycmVkUmVmZXJlbmNlVXRpbGl0eUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKKworLyoqCisgKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTUvMjAwMCA1OjI1OjQzIFBNKQorICogCisgKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBEZWZlcnJlZFJlZmVyZW5jZVV0aWxpdHlBY3Rpb24geworCXByb3RlY3RlZCBFUmVmZXJlbmNlIHJlZmVyZW5jZTsKKwlwcm90ZWN0ZWQgT2JqZWN0IHJlZmVyZW5jZVZhbHVlOworCXByb3RlY3RlZCBFT2JqZWN0IGNvcHlDb250YWluZXI7CisJcHJvdGVjdGVkIFN0cmluZyBpZFN1ZmZpeDsKKworCS8qKgorCSAqIERlZmVycmVkQ29weSBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqLworCXB1YmxpYyBEZWZlcnJlZFJlZmVyZW5jZVV0aWxpdHlBY3Rpb24oRVJlZmVyZW5jZSBhUmVmZXJlbmNlLCBPYmplY3QgYVZhbHVlLCBTdHJpbmcgYVN1ZmZpeCwgRU9iamVjdCBhQ29weUNvbnRhaW5lcikgeworCQlyZWZlcmVuY2UgPSBhUmVmZXJlbmNlOworCQlyZWZlcmVuY2VWYWx1ZSA9IGFWYWx1ZTsKKwkJaWRTdWZmaXggPSBhU3VmZml4OworCQljb3B5Q29udGFpbmVyID0gYUNvcHlDb250YWluZXI7CisJfQorCisJLyoqCisJICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTYvMjAwMCA5OjMyOjI4IEFNKQorCSAqIAorCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QKKwkgKi8KKwlwdWJsaWMgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QgZ2V0Q29weUNvbnRhaW5lcigpIHsKKwkJcmV0dXJuIGNvcHlDb250YWluZXI7CisJfQorCisJLyoqCisJICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTUvMjAwMCA1OjM0OjU2IFBNKQorCSAqIAorCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZworCSAqLworCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldElkU3VmZml4KCkgeworCQlyZXR1cm4gaWRTdWZmaXg7CisJfQorCisJLyoqCisJICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTUvMjAwMCA1OjM0OjU2IFBNKQorCSAqIAorCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2UKKwkgKi8KKwlwdWJsaWMgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2UgZ2V0UmVmZXJlbmNlKCkgeworCQlyZXR1cm4gcmVmZXJlbmNlOworCX0KKworCS8qKgorCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDEyLzE2LzIwMDAgOTozMjoyOCBBTSkKKwkgKiAKKwkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldFJlZmVyZW5jZVZhbHVlKCkgeworCQlyZXR1cm4gcmVmZXJlbmNlVmFsdWU7CisJfQorCisJcHVibGljIGFic3RyYWN0IHZvaWQgcGVyZm9ybUFjdGlvbigpOworfQorCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRW5jb2RlckRlY29kZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FbmNvZGVyRGVjb2Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZmUwNmIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRW5jb2RlckRlY29kZXIuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOworCisKKy8qKgorICogUmVwcmVzZW50cyBhbiBpbnRlcmZhY2UgdG8gYW4gb2JqZWN0IHdoaWNoIGNhbiBlbmNvZGUgYW5kIGRlY29kZSB2YWx1ZXMuIFRoaXMgdHlwaWNhbGx5IGludm9sdmVzCisgKiBjcnlwdG9ncmFwaHkgYWxnb3JpdGhtcy4gVGhpcyBpbnRlcmZhY2UsIGFsb25nIHdpdGggdGhlIHN1cHBsaWVkIGFkYXB0ZXJzIHByb3ZpZGUgYW4gZXh0ZW5zaW9uCisgKiBtZWNoYW5pc20gZm9yIHBsdWdnYWJsZSBjcnl0b2dyYXBoeSB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gc3RvcmluZyBhbmQgcmV0cmlldmluZyBhdHRyaWJ1dGUKKyAqIHZhbHVlcywgYW5kIGlzIHVzZWQgcHJldmFsZW50bHkgZm9yIGVuY29kaW5nIGFuZCBkZWNvZGluZyBwYXNzd29yZCB2YWx1ZXMgb2YgbW9mIG9iamVjdHMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRW5jb2RlckRlY29kZXIgeworCS8qKgorCSAqIFJldHVybnMgYSBkZWNvZGVkIHZlcnNpb24gb2YgdGhlIHZhbHVlLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZGVjb2RlKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGFuIGVuY29kZWQgdmVyc2lvbiBvZiB0aGUgdmFsdWUuCisJICovCisJcHVibGljIFN0cmluZyBlbmNvZGUoU3RyaW5nIHZhbHVlKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRW5jb2RlckRlY29kZXJBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRW5jb2RlckRlY29kZXJBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg4YjMwMAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FbmNvZGVyRGVjb2RlckFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOworCisKKy8qKgorICogQW4gYWRhcHRlciBmb3IgRW5jb2RlckRlY29kZXIgaW1wbGVtZW50YXRpb25zCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBFbmNvZGVyRGVjb2RlckFkYXB0ZXIgaW1wbGVtZW50cyBFbmNvZGVyRGVjb2RlciB7CisKKwkvKioKKwkgKiBFbmNvZGVyRGVjb2RlckFkYXB0ZXIgY29uc3RydWN0b3IgY29tbWVudC4KKwkgKi8KKwlwdWJsaWMgRW5jb2RlckRlY29kZXJBZGFwdGVyKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYSBkZWNvZGVkIHZlcnNpb24gb2YgdGhlIHZhbHVlLgorCSAqLworCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZGVjb2RlKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGFuIGVuY29kZWQgdmVyc2lvbiBvZiB0aGUgdmFsdWUuCisJICovCisJcHVibGljIGFic3RyYWN0IFN0cmluZyBlbmNvZGUoU3RyaW5nIHZhbHVlKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRW5jb2RlckRlY29kZXJSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0VuY29kZXJEZWNvZGVyUmVnaXN0cnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjE1MTEyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0VuY29kZXJEZWNvZGVyUmVnaXN0cnkuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKKworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBSZWdpc3RyeSBmb3Igc3RvcmluZyBhbmQgcmV0cmlldmluZyB2YWx1ZSBkZWNvZGVycyBhbmQgZW5jb2RlcnMuIFVzYWdlIEV4YW1wbGU6CisgKiAKKyAqIDxwcmU+CisgKiAKKyAqIAorICogLy8gVXNlIHRoZSBzdGFuZGFyZCBXZWJTcGhlcmUgcGFzc3dvcmQgdmFsdWUgZW5jb2Rlci9kZWNvZGVyLgorICogRW5jb2RlckRlY29kZXJSZWdpc3RyeS5nZXREZWZhdWx0UmVnaXN0cnkoKS5zZXREZWZhdWx0RW5jb2RlckRlY29kZXIobmV3IGNvbS5pYm0uZWpzLnNlY3VyaXR5LnV0aWwuV0FTRW5jb2RlckRlY29kZXIoKSk7CisgKiAvLyBCZWdpbiB0cmFja2luZyBjaGFuZ2VzLi4uCisgKiBXcml0ZUJhY2tIZWxwZXIuYmVnaW4oKTsKKyAqIC8vIExvYWQgYSByZXNvdXJjZSB3aGljaCBtYXkgaGF2ZSB1bi1lbmNvZGVkIHZhbHVlcy4uLgorICogLy8gTm90ZTogVGhlIFdDQ00gd2lsbCBhdHRlbXB0IHRvIGRldGVjdCB1bi1lbmNvZGVkIHZhbHVlcy4gIElmIHVuZW5jb2RlZCB2YWx1ZXMKKyAqIC8vIGFyZSBmb3VuZCwgdGhlIHZhbHVlIHdpbGwgYmUgZW5jb2RlZCwgYW5kIHRoZSByZXNvdXJjZSB3aWxsIGJlIGFkZGVkIHRvIHRoZQorICogLy8gV3JpdGVCYWNrSGVscGVyLgorICogUmVzb3VyY2UgcmVzID0gcmVzb3VyY2VTZXQubG9hZCgmcXVvdDtteVJlc291cmNlJnF1b3Q7KTsKKyAqIC8vIEVuc3VyZSB0aGF0IGFueSBjaGFuZ2VzIGR1ZSB0byBlbmNvZGluZyBhcmUgd3JpdHRlbiBiYWNrIG91dC4KKyAqIFdyaXRlQmFja0hlbHBlci5lbmQoKTsKKyAqIDwvcHJlPgorICovCitwdWJsaWMgY2xhc3MgRW5jb2RlckRlY29kZXJSZWdpc3RyeSB7CisJcHJvdGVjdGVkIHN0YXRpYyBFbmNvZGVyRGVjb2RlclJlZ2lzdHJ5IF9kZWZhdWx0SW5zdGFuY2U7CisJcHVibGljIHN0YXRpYyBmaW5hbCBFbmNvZGVyRGVjb2RlciBJTklUSUFMX0RFRkFVTFRfRU5DT0RFUiA9IFBhc3N0aHJ1RW5jb2RlckRlY29kZXIuSU5TVEFOQ0U7CisJcHJvdGVjdGVkIE1hcCBlbmNvZGVycyA9IG5ldyBIYXNoTWFwKCk7CisJcHJvdGVjdGVkIE9iamVjdCBkZWZhdWx0RW5jb2RlcktleTsKKworCS8qKgorCSAqIEVuY29kZXJEZWNvZGVyUmVnaXN0cnkgY29uc3RydWN0b3IgY29tbWVudC4KKwkgKi8KKwlwdWJsaWMgRW5jb2RlckRlY29kZXJSZWdpc3RyeSgpIHsKKwkJc3VwZXIoKTsKKwkJaW5pdGlhbGl6ZURlZmF1bHRFbmNvZGVycygpOworCX0KKworCS8qKgorCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDIvMi8yMDAxIDEyOjQzOjMxIEFNKQorCSAqLworCXB1YmxpYyB2b2lkIGFkZEVuY29kZXJEZWNvZGVyKEVuY29kZXJEZWNvZGVyIGVuY29kZXJEZWNvZGVyKSB7CisJCWVuY29kZXJzLnB1dChlbmNvZGVyRGVjb2Rlci5nZXRDbGFzcygpLmdldE5hbWUoKSwgZW5jb2RlckRlY29kZXIpOworCQlpZiAoZGVmYXVsdEVuY29kZXJLZXkgPT0gbnVsbCkKKwkJCWRlZmF1bHRFbmNvZGVyS2V5ID0gZW5jb2RlckRlY29kZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhbiBlbmNvZGVyL2RlY29kZXIgYnkga2V5LgorCSAqLworCXB1YmxpYyBFbmNvZGVyRGVjb2RlciBnZXREZWZhdWx0RW5jb2RlckRlY29kZXIoKSB7CisJCWlmIChkZWZhdWx0RW5jb2RlcktleSA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCXJldHVybiAoRW5jb2RlckRlY29kZXIpIGVuY29kZXJzLmdldChkZWZhdWx0RW5jb2RlcktleSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZGVmYXVsdCByZWdpc3RyeSB0byB1c2UgZm9yIHJldHJpZXZpbmcgdmFsdWUgZW5jb2RlcnMgYW5kIGRlY29kZXJzCisJICovCisJcHVibGljIHN0YXRpYyBFbmNvZGVyRGVjb2RlclJlZ2lzdHJ5IGdldERlZmF1bHRSZWdpc3RyeSgpIHsKKwkJaWYgKF9kZWZhdWx0SW5zdGFuY2UgPT0gbnVsbCkgeworCQkJX2RlZmF1bHRJbnN0YW5jZSA9IG5ldyBFbmNvZGVyRGVjb2RlclJlZ2lzdHJ5KCk7CisJCX0KKwkJcmV0dXJuIF9kZWZhdWx0SW5zdGFuY2U7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhbiBlbmNvZGVyL2RlY29kZXIgYnkga2V5LgorCSAqLworCXB1YmxpYyBFbmNvZGVyRGVjb2RlciBnZXRFbmNvZGVyRGVjb2RlcihPYmplY3Qga2V5KSB7CisJCXJldHVybiAoRW5jb2RlckRlY29kZXIpIGVuY29kZXJzLmdldChrZXkpOworCX0KKworCS8qKgorCSAqIEluaXRpYWxpemVzIGEgc3RhbmRhcmQgc2V0IG9mIGVuY29kZXIvZGVjb2RlcnMuCisJICovCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRFbmNvZGVycygpIHsKKwkJc2V0RGVmYXVsdEVuY29kZXJEZWNvZGVyKElOSVRJQUxfREVGQVVMVF9FTkNPREVSKTsKKwkJYWRkRW5jb2RlckRlY29kZXIobmV3IFhNTFZhbHVlRW5jb2RlckRlY29kZXIoKSk7CisJfQorCisJLyoqCisJICogUmVtb3ZlcyB0aGUgZW5jb2Rlci9kZWNvZGVyIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlRW5jb2RlckRlY29kZXIoT2JqZWN0IGtleSkgeworCQlpZiAoZW5jb2RlcnMuY29udGFpbnNLZXkoa2V5KSkgeworCQkJZW5jb2RlcnMucmVtb3ZlKGtleSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFuIGVuY29kZXIvZGVjb2RlciBieSBrZXkuCisJICovCisJcHVibGljIHZvaWQgc2V0RGVmYXVsdEVuY29kZXJEZWNvZGVyKEVuY29kZXJEZWNvZGVyIGVuY29kZXIpIHsKKwkJZGVmYXVsdEVuY29kZXJLZXkgPSBlbmNvZGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpOworCQlpZiAoIWVuY29kZXJzLmNvbnRhaW5zS2V5KGRlZmF1bHRFbmNvZGVyS2V5KSkgeworCQkJYWRkRW5jb2RlckRlY29kZXIoZW5jb2Rlcik7CisJCX0KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0V0b29sc0NvcHlTZXNzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRXRvb2xzQ29weVNlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzA4MDQxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0V0b29sc0NvcHlTZXNzaW9uLmphdmEKQEAgLTAsMCArMSwxODQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOworCisvKioKKyAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNS8wNC8wMSAxMToyNTo1OSBQTSkKKyAqIAorICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgorICovCitwdWJsaWMgY2xhc3MgRXRvb2xzQ29weVNlc3Npb24gZXh0ZW5kcyBFdG9vbHNDb3B5VXRpbGl0eSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTT1VSQ0VfQ09QSUVEID0gNTAwOworCXByaXZhdGUgRXRvb2xzQ29weVV0aWxpdHkgcGFyZW50Q29weVV0aWxpdHk7CisJcHJpdmF0ZSBYTUxSZXNvdXJjZSBjdXJyZW50UmVzb3VyY2U7CisJcHJpdmF0ZSBYTUxSZXNvdXJjZSBjdXJyZW50Q29weVJlc291cmNlOworCisJLyoqCisJICogRXRvb2xzQ29weVNlc3Npb24gY29uc3RydWN0b3IgY29tbWVudC4KKwkgKi8KKwlwdWJsaWMgRXRvb2xzQ29weVNlc3Npb24oRXRvb2xzQ29weVV0aWxpdHkgYUNvcHlVdGlsaXR5KSB7CisJCXBhcmVudENvcHlVdGlsaXR5ID0gYUNvcHlVdGlsaXR5OworCQlzZXRQcmVzZXJ2ZUlkcyhhQ29weVV0aWxpdHkucHJlc2VydmVJZHMoKSk7CisJCXNldENvcHlBZGFwdGVycyhhQ29weVV0aWxpdHkuaXNDb3B5QWRhcHRlcnMoKSk7CisJfQorCisJLyoqCisJICogQ29weSBhbGwgUmVzb3VyY2VzIGFuZCBSZWZPYmplY3RzIHdpdGhpbiA8Y29kZT5hR3JvdXA8L2NvZGU+IGFuZCBhZGQgdGhlbSB0bworCSAqIDxjb2RlPmFHcm91cDwvY29kZT4uIE5vbiBjb21wb3NpdGUgcmVmZXJlbmNlcyB3aWxsIGJlIGRlZmVycmVkIHVudGlsIGFsbCBvYmplY3RzIGFyZQorCSAqIGNvcGllZCBmcm9tIDxjb2RlPmFHcm91cDwvY29kZT4uCisJICogCisJICogQ29weSBSZXNvdXJjZXMgZmlyc3QgYW5kIHRoZW4gY29weSBSZWZPYmplY3RzLgorCSAqLworCXB1YmxpYyB2b2lkIGNvcHkoQ29weUdyb3VwIGFHcm91cCkgeworCQlpZiAoYUdyb3VwICE9IG51bGwpIHsKKwkJCWNvcHlSZXNvdXJjZXMoYUdyb3VwKTsKKwkJCWNvcHlSZWZPYmplY3RzKGFHcm91cCk7CisJCQlleGVjdXRlRGVmZXJyZWRDb3B5QWN0aW9ucygpOworCQkJYUdyb3VwLnBvc3RDb3B5KHRoaXMpOworCQkJbm90aWZ5TmV3UmVzb3VyY2VzQ29waWVkKGFHcm91cCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBpZiB5b3UgYXJlIG9ubHkgZ29pbmcgdG8gY29weSA8Y29kZT5hUmVmT2JqZWN0PC9jb2RlPiBpbiB0aGlzCisJICogY29weSBleGVjdXRpb24uCisJICovCisJcHVibGljIEVPYmplY3QgY29weShFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCkgeworCQlFT2JqZWN0IGNvcGllZCA9IGNvbnRhaW5tZW50Q29weShhUmVmT2JqZWN0LCBpZFN1ZmZpeCk7CisJCWV4ZWN1dGVEZWZlcnJlZENvcHlBY3Rpb25zKCk7CisJCXJldHVybiBjb3BpZWQ7CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgaWYgeW91IGFyZSBvbmx5IGdvaW5nIHRvIGNvcHkgPGNvZGU+YVJlZk9iamVjdDwvY29kZT4gaW4gdGhpcworCSAqIGNvcHkgZXhlY3V0aW9uLiBUaGlzIG1ldGhvZCBvbmx5IGNvcGllcyA8Y29kZT5hUmVmT2JqZWN0PC9jb2RlPiBhdHRyaWJ1dGVzLgorCSAqLworCXB1YmxpYyBFT2JqZWN0IGNvcHlPYmplY3QoRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgpIHsKKwkJRU9iamVjdCBjb3BpZWQgPSBjb250YWlubWVudENvcHlPYmplY3QoYVJlZk9iamVjdCwgaWRTdWZmaXgpOworCQlleGVjdXRlRGVmZXJyZWRDb3B5QWN0aW9ucygpOworCQlyZXR1cm4gY29waWVkOworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VkIGlmIHlvdSBhcmUgb25seSBnb2luZyB0byBjb3B5IDxjb2RlPmFSZXNvdXJjZTwvY29kZT4gaW4gdGhpcworCSAqIGNvcHkgZXhlY3V0aW9uLiBUaGUgY29waWVkIFJlc291cmNlIHdpbGwgaGF2ZSBhIFVSSSBlcXVhbCB0byA8Y29kZT5uZXdVcmk8L2NvZGU+LgorCSAqLworCXB1YmxpYyBSZXNvdXJjZSBjb3B5KFJlc291cmNlIGFSZXNvdXJjZSwgU3RyaW5nIG5ld1VyaSkgeworCQlSZXNvdXJjZSBjb3BpZWQgPSBjb250YWlubWVudENvcHkoYVJlc291cmNlLCBuZXdVcmkpOworCQlleGVjdXRlRGVmZXJyZWRDb3B5QWN0aW9ucygpOworCQljb3B5TW9kaWZpY2F0aW9uRmxhZyhhUmVzb3VyY2UsIGNvcGllZCk7CisJCW5vdGlmeU5ld1Jlc291cmNlQ29waWVkKGNvcGllZCk7CisJCXJldHVybiBjb3BpZWQ7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgbm90aWZ5TmV3UmVzb3VyY2VzQ29waWVkKENvcHlHcm91cCBncm91cCkgeworCQlMaXN0IGNvcGllZCA9IGdyb3VwLmdldENvcGllZFJlc291cmNlcygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGNvcGllZC5zaXplKCk7IGkrKykgeworCQkJbm90aWZ5TmV3UmVzb3VyY2VDb3BpZWQoKFJlc291cmNlKSBjb3BpZWQuZ2V0KGkpKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIG5vdGlmeU5ld1Jlc291cmNlQ29waWVkKFJlc291cmNlIGNvcGllZCkgeworCQljb3BpZWQuZU5vdGlmeShuZXcgTm90aWZpY2F0aW9uSW1wbChSRVNPVVJDRV9DT1BJRUQsIG51bGwsIG51bGwpKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZi5lY29yZS51dGlsaXRpZXMuY29weS5FdG9vbHNDb3B5VXRpbGl0eSNwcmltQ29weU9iamVjdChFT2JqZWN0LAorCSAqICAgICAgU3RyaW5nKQorCSAqLworCXByb3RlY3RlZCBFT2JqZWN0IHByaW1Db3B5T2JqZWN0KEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4KSB7CisJCUVPYmplY3QgY29weSA9IHN1cGVyLnByaW1Db3B5T2JqZWN0KGFSZWZPYmplY3QsIGlkU3VmZml4KTsKKwkJY29weUlkSWZOZWNlc3NhcnkoYVJlZk9iamVjdCwgY29weSwgaWRTdWZmaXgpOworCQlyZXR1cm4gY29weTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBjb3B5SWRJZk5lY2Vzc2FyeShFT2JqZWN0IG9iaiwgRU9iamVjdCBjb3B5LCBTdHJpbmcgaWRTdWZmaXgpIHsKKwkJaWYgKChpZFN1ZmZpeCA9PSBudWxsICYmICFwcmVzZXJ2ZUlkcykgfHwgY3VycmVudFJlc291cmNlID09IG51bGwpCisJCQlyZXR1cm47CisJCVN0cmluZyBpZCA9IGN1cnJlbnRSZXNvdXJjZS5nZXRJRChvYmopOworCQlpZiAoaWQgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJaWQgPSBpZFN1ZmZpeCA9PSBudWxsID8gaWQgOiBpZCArIGlkU3VmZml4OworCQljdXJyZW50Q29weVJlc291cmNlLnNldElEKGNvcHksIGlkKTsKKwl9CisKKworCS8qKgorCSAqIFNldCBkZWxpdmVyeSBiYWNrIG9uIGZvciBhbGwgdGhlIGNhY2hlZCBvYmplY3RzIGFuZCBwdXNoIHRoZW0gdG8gdGhlIHBhcmVudENvcHlVdGlsaXR5LgorCSAqLworCXB1YmxpYyB2b2lkIGZsdXNoKCkgeworCQlJdGVyYXRvciBpdCA9IGdldENvcGllZE9iamVjdHMoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisJCU1hcCBwYXJlbnRDb3BpZXMgPSBnZXRQYXJlbnRDb3B5VXRpbGl0eSgpLmdldENvcGllZE9iamVjdHMoKTsKKwkJTWFwLkVudHJ5IGVudHJ5OworCQlFT2JqZWN0IGNvcHk7CisJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKwkJCWVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOworCQkJY29weSA9IChFT2JqZWN0KSBlbnRyeS5nZXRWYWx1ZSgpOworCQkJY29weS5lU2V0RGVsaXZlcih0cnVlKTsKKwkJCXBhcmVudENvcGllcy5wdXQoZW50cnkuZ2V0S2V5KCksIGNvcHkpOworCQl9CisJCWNvcGllZE9iamVjdHMgPSBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybiBhIGNhY2hlZCBjb3B5LgorCSAqLworCXB1YmxpYyBFT2JqZWN0IGdldENvcHkoRU9iamVjdCBhbk9iamVjdCkgeworCQlFT2JqZWN0IGNvcGllZCA9IHN1cGVyLmdldENvcHkoYW5PYmplY3QpOworCQlpZiAoY29waWVkID09IG51bGwpCisJCQljb3BpZWQgPSBnZXRQYXJlbnRDb3B5VXRpbGl0eSgpLmdldENvcHkoYW5PYmplY3QpOworCQlyZXR1cm4gY29waWVkOworCX0KKworCS8qKgorCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA1LzA0LzAxIDExOjI4OjA3IFBNKQorCSAqIAorCSAqIEByZXR1cm4gY29tLmlibS5ldG9vbHMuZW1mLmVjb3JlLnV0aWxpdGllcy5jb3B5LkV0b29sc0NvcHlVdGlsaXR5CisJICovCisJcHJvdGVjdGVkIEV0b29sc0NvcHlVdGlsaXR5IGdldFBhcmVudENvcHlVdGlsaXR5KCkgeworCQlyZXR1cm4gcGFyZW50Q29weVV0aWxpdHk7CisJfQorCisJLyoqCisJICogUmV0dXJuIGFuIGluc3RhbmNlIG9mIEVPYmplY3QgdGhhdCBpcyB0aGUgc2FtZSB0eXBlIGFzIDxjb2RlPmFSZWZPYmplY3Q8L2NvZGU+LgorCSAqLworCXB1YmxpYyBFT2JqZWN0IG5ld0luc3RhbmNlKEVPYmplY3QgYVJlZk9iamVjdCkgeworCQlFT2JqZWN0IG5ld1R5cGUgPSBzdXBlci5uZXdJbnN0YW5jZShhUmVmT2JqZWN0KTsKKwkJbmV3VHlwZS5lU2V0RGVsaXZlcihmYWxzZSk7CisJCXJldHVybiBuZXdUeXBlOworCX0KKworCS8qKgorCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mLmVjb3JlLnV0aWxpdGllcy5jb3B5LkV0b29sc0NvcHlVdGlsaXR5I25ld0luc3RhbmNlKFJlc291cmNlLCBTdHJpbmcpCisJICovCisJcHVibGljIFJlc291cmNlIG5ld0luc3RhbmNlKFJlc291cmNlIGFSZXNvdXJjZSwgU3RyaW5nIG5ld1VyaSkgeworCQlSZXNvdXJjZSBjb3B5ID0gc3VwZXIubmV3SW5zdGFuY2UoYVJlc291cmNlLCBuZXdVcmkpOworCQlpZiAoYVJlc291cmNlIGluc3RhbmNlb2YgWE1MUmVzb3VyY2UpIHsKKwkJCWN1cnJlbnRSZXNvdXJjZSA9IChYTUxSZXNvdXJjZSkgYVJlc291cmNlOworCQkJY3VycmVudENvcHlSZXNvdXJjZSA9IChYTUxSZXNvdXJjZSkgY29weTsKKwkJfSBlbHNlIHsKKwkJCWN1cnJlbnRSZXNvdXJjZSA9IG51bGw7CisJCQljdXJyZW50Q29weVJlc291cmNlID0gbnVsbDsKKwkJfQorCQlyZXR1cm4gY29weTsKKwl9CisKK30KKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0V0b29sc0NvcHlVdGlsaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRXRvb2xzQ29weVV0aWxpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmQ5MWUwCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0V0b29sc0NvcHlVdGlsaXR5LmphdmEKQEAgLTAsMCArMSw2NjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVUeXBlZEVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CisKKworLyoqCisgKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTMvMjAwMCA5OjEwOjU1IFBNKQorICogCisgKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCisgKi8KK3B1YmxpYyBjbGFzcyBFdG9vbHNDb3B5VXRpbGl0eSB7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGRU5VTUxJVEVSQUxfVFlQRV9OQU1FID0gIkVFbnVtTGl0ZXJhbCI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIGZpbmFsIEVjb3JlUGFja2FnZSBwa2cgPSBFY29yZVBhY2thZ2UuZUlOU1RBTkNFOworCisJcHJpdmF0ZSBmaW5hbCBFVHlwZWRFbGVtZW50IE1FVEFFTkFNRSA9IHBrZy5nZXRFTmFtZWRFbGVtZW50X05hbWUoKTsKKworCXByb3RlY3RlZCBIYXNoTWFwIGNvcGllZE9iamVjdHM7CisJcHJvdGVjdGVkIExpc3QgZGVmZXJyZWRSZWZlcmVuY2VDb3BpZXM7CisJcHJvdGVjdGVkIGJvb2xlYW4gcHJlc2VydmVJZHMgPSBmYWxzZTsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBjb3B5QWRhcHRlcnMgPSBmYWxzZTsKKwlwcm90ZWN0ZWQgSGFzaE1hcCBjb3BpZWRBZGFwdGVyczsKKworCXByb3RlY3RlZCBjbGFzcyBEZWZlcnJlZFNpbmdsZVJlZmVyZW5jZUNvcHlBY3Rpb24gZXh0ZW5kcyBEZWZlcnJlZFJlZmVyZW5jZVV0aWxpdHlBY3Rpb24geworCQlwdWJsaWMgRGVmZXJyZWRTaW5nbGVSZWZlcmVuY2VDb3B5QWN0aW9uKEVSZWZlcmVuY2UgYVJlZmVyZW5jZSwgT2JqZWN0IGFWYWx1ZSwgU3RyaW5nIGFTdWZmaXgsIEVPYmplY3QgYUNvcHlDb250YWluZXIpIHsKKwkJCXN1cGVyKGFSZWZlcmVuY2UsIGFWYWx1ZSwgYVN1ZmZpeCwgYUNvcHlDb250YWluZXIpOworCQl9CisKKwkJcHVibGljIHZvaWQgcGVyZm9ybUFjdGlvbigpIHsKKwkJCUVPYmplY3QgdmFsdWUgPSAoRU9iamVjdCkgZ2V0UmVmZXJlbmNlVmFsdWUoKTsKKwkJCWdldENvcHlDb250YWluZXIoKS5lU2V0KGdldFJlZmVyZW5jZSgpLCBnZXRDb3B5SWZGb3VuZCh2YWx1ZSkpOworCQl9CisJfQorCisJcHJvdGVjdGVkIGNsYXNzIERlZmVycmVkTWFueVJlZmVyZW5jZUNvcHlBY3Rpb24gZXh0ZW5kcyBEZWZlcnJlZFJlZmVyZW5jZVV0aWxpdHlBY3Rpb24geworCQlwdWJsaWMgRGVmZXJyZWRNYW55UmVmZXJlbmNlQ29weUFjdGlvbihFUmVmZXJlbmNlIGFSZWZlcmVuY2UsIExpc3QgYVZhbHVlLCBTdHJpbmcgYVN1ZmZpeCwgRU9iamVjdCBhQ29weUNvbnRhaW5lcikgeworCQkJc3VwZXIoYVJlZmVyZW5jZSwgYVZhbHVlLCBhU3VmZml4LCBhQ29weUNvbnRhaW5lcik7CisJCX0KKworCQlwdWJsaWMgdm9pZCBwZXJmb3JtQWN0aW9uKCkgeworCQkJTGlzdCBjb3B5TGlzdCA9IChMaXN0KSBnZXRDb3B5Q29udGFpbmVyKCkuZUdldChnZXRSZWZlcmVuY2UoKSk7CisJCQlJdGVyYXRvciBpdCA9ICgoTGlzdCkgZ2V0UmVmZXJlbmNlVmFsdWUoKSkuaXRlcmF0b3IoKTsKKwkJCUVPYmplY3QgbmV4dDsKKwkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKwkJCQluZXh0ID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKKwkJCQljb3B5TGlzdC5hZGQoZ2V0Q29weUlmRm91bmQobmV4dCkpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTMvMjAwMCA5OjE0OjI2IFBNKQorCSAqIAorCSAqIEBwYXJhbSBhUmVmT2JqZWN0CisJICogICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdAorCSAqLworCXB1YmxpYyBFdG9vbHNDb3B5VXRpbGl0eSgpIHsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSA8Y29kZT5EZWZlcnJlZE1hbnlSZWZlcmVuY2VDb3B5QWN0aW9uPC9jb2RlPiBhbmQgYWRkIGl0IHRvIHRoZSBsaXN0IG9mIGRlZmVycmVkCisJICogY29weSBhY3Rpb25zLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZERlZmVycmVkTWFueVJlZmVyZW5jZUNvcHkoRVJlZmVyZW5jZSByZWZlcmVuY2UsIExpc3QgYVZhbHVlLCBTdHJpbmcgaWRTdWZmaXgsIEVPYmplY3QgYUNvcHlDb250YWluZXIpIHsKKwkJZ2V0RGVmZXJyZWRSZWZlcmVuY2VDb3BpZXMoKS5hZGQobmV3IERlZmVycmVkTWFueVJlZmVyZW5jZUNvcHlBY3Rpb24ocmVmZXJlbmNlLCBhVmFsdWUsIGlkU3VmZml4LCBhQ29weUNvbnRhaW5lcikpOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhIDxjb2RlPkRlZmVycmVkU2luZ2xlUmVmZXJlbmNlQ29weUFjdGlvbjwvY29kZT4gYW5kIGFkZCBpdCB0byB0aGUgbGlzdCBvZiBkZWZlcnJlZAorCSAqIGNvcHkgYWN0aW9ucy4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGREZWZlcnJlZFNpbmdsZVJlZmVyZW5jZUNvcHkoRVJlZmVyZW5jZSByZWZlcmVuY2UsIEVPYmplY3QgYVZhbHVlLCBTdHJpbmcgaWRTdWZmaXgsIEVPYmplY3QgYUNvcHlDb250YWluZXIpIHsKKwkJZ2V0RGVmZXJyZWRSZWZlcmVuY2VDb3BpZXMoKS5hZGQobmV3IERlZmVycmVkU2luZ2xlUmVmZXJlbmNlQ29weUFjdGlvbihyZWZlcmVuY2UsIGFWYWx1ZSwgaWRTdWZmaXgsIGFDb3B5Q29udGFpbmVyKSk7CisJfQorCisJLyoqCisJICogQ2hlY2sgZm9yIGFuIGFscmVhZHkgY29waWVkIG9iamVjdCBmaXJzdC4KKwkgKi8KKwlwcm90ZWN0ZWQgRU9iamVjdCBjb250YWlubWVudENvcHkoRU9iamVjdCBhbk9iamVjdCwgU3RyaW5nIGlkU3VmZml4KSB7CisJCUVPYmplY3QgY29waWVkID0gZ2V0Q29weShhbk9iamVjdCk7CisJCWlmIChjb3BpZWQgPT0gbnVsbCkKKwkJCWNvcGllZCA9IHByaW1Db3B5KGFuT2JqZWN0LCBpZFN1ZmZpeCk7CisJCXJldHVybiBjb3BpZWQ7CisJfQorCisJLyoqCisJICogQ2hlY2sgZm9yIGFuIGFscmVhZHkgY29waWVkIG9iamVjdCBmaXJzdC4KKwkgKi8KKwlwcm90ZWN0ZWQgRU9iamVjdCBjb250YWlubWVudENvcHlPYmplY3QoRU9iamVjdCBhbk9iamVjdCwgU3RyaW5nIGlkU3VmZml4KSB7CisJCUVPYmplY3QgY29waWVkID0gZ2V0Q29weShhbk9iamVjdCk7CisJCWlmIChjb3BpZWQgPT0gbnVsbCkKKwkJCWNvcGllZCA9IHByaW1Db3B5T2JqZWN0KGFuT2JqZWN0LCBpZFN1ZmZpeCk7CisJCXJldHVybiBjb3BpZWQ7CisJfQorCisJcHJvdGVjdGVkIFJlc291cmNlIGNvbnRhaW5tZW50Q29weShSZXNvdXJjZSBhUmVzb3VyY2UsIFN0cmluZyBuZXdVcmkpIHsKKwkJLyogY29waWVkIHJlc291cmNlcyBhcmUgbmV2ZXIgY2FjaGVkICovCisJCXJldHVybiBwcmltQ29weShhUmVzb3VyY2UsIG5ld1VyaSk7CisJfQorCisJLyoqCisJICogQ29weSBhbGwgUmVzb3VyY2VzIGFuZCBSZWZPYmplY3RzIHdpdGhpbiA8Y29kZT5hR3JvdXA8L2NvZGU+IGFuZCBhZGQgdGhlbSB0bworCSAqIDxjb2RlPmFHcm91cDwvY29kZT4uIE5vbiBjb21wb3NpdGUgcmVmZXJlbmNlcyB3aWxsIGJlIGRlZmVycmVkIHVudGlsIGFsbCBvYmplY3RzIGFyZQorCSAqIGNvcGllZCBmcm9tIDxjb2RlPmFHcm91cDwvY29kZT4uCisJICogCisJICogQ29weSBSZXNvdXJjZXMgZmlyc3QgYW5kIHRoZW4gY29weSBSZWZPYmplY3RzLgorCSAqLworCXB1YmxpYyB2b2lkIGNvcHkoQ29weUdyb3VwIGFHcm91cCkgeworCQlpZiAoYUdyb3VwICE9IG51bGwpIHsKKwkJCUV0b29sc0NvcHlTZXNzaW9uIHNlc3Npb24gPSBuZXcgRXRvb2xzQ29weVNlc3Npb24odGhpcyk7CisJCQlzZXNzaW9uLnNldFByZXNlcnZlSWRzKGFHcm91cC5nZXRQcmVzZXJ2ZUlkcygpKTsKKwkJCXNlc3Npb24uY29weShhR3JvdXApOworCQkJc2Vzc2lvbi5mbHVzaCgpOworCQl9CisJfQorCisJcHVibGljIEVPYmplY3QgY29weShFT2JqZWN0IGFSZWZPYmplY3QpIHsKKwkJcmV0dXJuIGNvcHkoYVJlZk9iamVjdCwgbnVsbCk7CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgaWYgeW91IGFyZSBvbmx5IGdvaW5nIHRvIGNvcHkgPGNvZGU+YVJlZk9iamVjdDwvY29kZT4gaW4gdGhpcworCSAqIGNvcHkgZXhlY3V0aW9uLgorCSAqLworCXB1YmxpYyBFT2JqZWN0IGNvcHkoRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgpIHsKKwkJRXRvb2xzQ29weVNlc3Npb24gc2Vzc2lvbiA9IG5ldyBFdG9vbHNDb3B5U2Vzc2lvbih0aGlzKTsKKwkJRU9iamVjdCBjb3BpZWQgPSBzZXNzaW9uLmNvcHkoYVJlZk9iamVjdCwgaWRTdWZmaXgpOworCQlzZXNzaW9uLmZsdXNoKCk7CisJCXJldHVybiBjb3BpZWQ7CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgaWYgeW91IGFyZSBvbmx5IGdvaW5nIHRvIGNvcHkgPGNvZGU+YVJlZk9iamVjdDwvY29kZT4gaW4gdGhpcworCSAqIGNvcHkgZXhlY3V0aW9uLiBUaGlzIG1ldGhvZCBvbmx5IGNvcGllcyA8Y29kZT5hUmVmT2JqZWN0PC9jb2RlPiB3aXRoIGl0cyBwcm9wZXJ0aWVzLCBub3QKKwkgKiByZWZlcmVuY2VzLgorCSAqLworCXB1YmxpYyBFT2JqZWN0IGNvcHlPYmplY3QoRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgpIHsKKwkJRXRvb2xzQ29weVNlc3Npb24gc2Vzc2lvbiA9IG5ldyBFdG9vbHNDb3B5U2Vzc2lvbih0aGlzKTsKKwkJRU9iamVjdCBjb3BpZWQgPSBzZXNzaW9uLmNvcHlPYmplY3QoYVJlZk9iamVjdCwgaWRTdWZmaXgpOworCQlzZXNzaW9uLmZsdXNoKCk7CisJCXJldHVybiBjb3BpZWQ7CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgaWYgeW91IGFyZSBvbmx5IGdvaW5nIHRvIGNvcHkgPGNvZGU+YVJlc291cmNlPC9jb2RlPiBpbiB0aGlzCisJICogY29weSBleGVjdXRpb24uIFRoZSBjb3BpZWQgUmVzb3VyY2Ugd2lsbCBoYXZlIGEgVVJJIGVxdWFsIHRvIDxjb2RlPm5ld1VyaTwvY29kZT4uCisJICovCisJcHVibGljIFJlc291cmNlIGNvcHkoUmVzb3VyY2UgYVJlc291cmNlLCBTdHJpbmcgbmV3VXJpKSB7CisJCUV0b29sc0NvcHlTZXNzaW9uIHNlc3Npb24gPSBuZXcgRXRvb2xzQ29weVNlc3Npb24odGhpcyk7CisJCVJlc291cmNlIGNvcGllZCA9IHNlc3Npb24uY29weShhUmVzb3VyY2UsIG5ld1VyaSk7CisJCXNlc3Npb24uZmx1c2goKTsKKwkJcmV0dXJuIGNvcGllZDsKKwl9CisKKwkvKioKKwkgKiBJZiBhbiBhdHRyaWJ1dGUgaXMgc2V0IGFuZCBpdHMgdmFsdWUgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIHBlcmZvcm0gY29weQorCSAqIDxjb2RlPmF0dHJpYnV0ZTwvY29kZT4gdmFsdWUgZnJvbSA8Y29kZT5hUmVmT2JqZWN0PC9jb2RlPiB0byA8Y29kZT5jb3B5UmVmPC9jb2RlPi4KKwkgKiBOdWxsIGlzIGEgdmFsaWQgdmFsdWUgaWYgdGhlIGF0dHJpYnV0ZSBpcyBzZXQuCisJICovCisKKwlwcm90ZWN0ZWQgdm9pZCBjb3B5QXR0cmlidXRlKEVBdHRyaWJ1dGUgYXR0cmlidXRlLCBFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCwgRU9iamVjdCBjb3B5UmVmKSB7CisJCWlmICghYXR0cmlidXRlLmlzQ2hhbmdlYWJsZSgpKQorCQkJcmV0dXJuOyAvL2lnbm9yZQorCQlpZiAoYXR0cmlidXRlLmlzTWFueSgpKSB7CisJCQlMaXN0IHZhbHVlID0gKExpc3QpIGFSZWZPYmplY3QuZUdldChhdHRyaWJ1dGUpOworCQkJaWYgKHZhbHVlICE9IG51bGwpCisJCQkJY29weU1hbnlBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZSwgYVJlZk9iamVjdCwgaWRTdWZmaXgsIGNvcHlSZWYpOworCQl9IGVsc2UgaWYgKGFSZWZPYmplY3QuZUlzU2V0KGF0dHJpYnV0ZSkpIHsKKwkJCU9iamVjdCB2YWx1ZSA9IGFSZWZPYmplY3QuZUdldChhdHRyaWJ1dGUpOworCQkJaWYgKHZhbHVlID09IG51bGwpCisJCQkJY29weVJlZi5lU2V0KGF0dHJpYnV0ZSwgdmFsdWUpOworCQkJZWxzZQorCQkJCWNvcHlTaW5nbGVBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZSwgYVJlZk9iamVjdCwgaWRTdWZmaXgsIGNvcHlSZWYpOworCQl9IGVsc2UgaWYgKGF0dHJpYnV0ZSA9PSBNRVRBRU5BTUUpIHsKKwkJCS8vc2V0IG5hbWUgdG8gdGhlIElEICh0aGlzIGlzIGNvbXB1dGVkIGFzIGEgZGVmYXVsdCksIG9ubHkgZ2V0IGhlcmUgaWYgaXNTZXROYW1lIGlzCisJCQkvLyBmYWxzZS4KKwkJCWNvcHlSZWYuZVNldChhdHRyaWJ1dGUsIGFSZWZPYmplY3QuZUdldChhdHRyaWJ1dGUpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEl0ZXJhdGUgb3ZlciB0aGUgYXR0cmlidXRlcyBvZiB0aGUgcmVjZWl2ZXIgYW5kIGNvcHkgZWFjaCBhdHRyaWJ1dGUuCisJICovCisJcHJvdGVjdGVkIHZvaWQgY29weUN1cnJlbnRBdHRyaWJ1dGVzKEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4LCBFT2JqZWN0IGNvcHlSZWYpIHsKKwkJTGlzdCBhdHRyaWJ1dGVzID0gYVJlZk9iamVjdC5lQ2xhc3MoKS5nZXRFQWxsQXR0cmlidXRlcygpOworCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7CisJCQlJdGVyYXRvciBpdCA9IGF0dHJpYnV0ZXMuaXRlcmF0b3IoKTsKKwkJCUVBdHRyaWJ1dGUgcmE7CisJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisJCQkJcmEgPSAoRUF0dHJpYnV0ZSkgaXQubmV4dCgpOworCQkJCWNvcHlBdHRyaWJ1dGUocmEsIGFSZWZPYmplY3QsIGlkU3VmZml4LCBjb3B5UmVmKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIHdpbGwgaXRlcmF0ZSBvdmVyIHRoZSByZWZlcmVuY2VzIG9mIHRoZSByZWNlaXZlci4gSWYgYSByZWZlcmVuY2UncyB2YWx1ZSBpcyBub3QKKwkgKiA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiBhIHNlcmllcyBvZiB0ZXN0cyBhcmUgZG9uZSBiZWZvcmUgc2V0dGluZyB0aGUgdmFsdWUgd2l0aCB0aGUKKwkgKiBjb3BpZWQgb2JqZWN0LCA8Y29kZT5jb3B5UmVmPC9jb2RlPi4KKwkgKiAKKwkgKiBUZXN0czogMS4gRG8gbm90aGluZyBpZiB0aGUgcmVmZXJlbmNlIGVxdWFscyB0aGUgbWV0YUVDb250YWluZXIgb3IgbWV0YUVDb250YWlucyByZWZlcmVuY2VzLgorCSAqLworCisJcHJvdGVjdGVkIHZvaWQgY29weUN1cnJlbnRSZWZlcmVuY2VzKEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4LCBFT2JqZWN0IGNvcHlSZWYpIHsKKwkJTGlzdCByZWZlcmVuY2VzID0gYVJlZk9iamVjdC5lQ2xhc3MoKS5nZXRFQWxsUmVmZXJlbmNlcygpOworCQlpZiAocmVmZXJlbmNlcyAhPSBudWxsKSB7CisJCQlJdGVyYXRvciBpdCA9IHJlZmVyZW5jZXMuaXRlcmF0b3IoKTsKKwkJCUVSZWZlcmVuY2UgcnI7CisJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisJCQkJcnIgPSAoRVJlZmVyZW5jZSkgaXQubmV4dCgpOworCQkJCWlmIChzaG91bGRDb3B5UmVmZXJlbmNlKHJyKSkKKwkJCQkJY29weVJlZmVyZW5jZShyciwgYVJlZk9iamVjdCwgaWRTdWZmaXgsIGNvcHlSZWYpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogSXRlcmF0ZSBvdmVyIDxjb2RlPmFuRXh0ZW50PC9jb2RlPiBhbmQgY29weSBlYWNoIGVsZW1lbnQgdG8gPGNvZGU+Y29weUV4dGVudDwvY29kZT4uCisJICovCisJcHJvdGVjdGVkIHZvaWQgY29weUV4dGVudChFTGlzdCBhbkV4dGVudCwgRUxpc3QgY29weUV4dGVudCkgeworCQlJdGVyYXRvciBpdCA9IGFuRXh0ZW50Lml0ZXJhdG9yKCk7CisJCUVPYmplY3QgcmVmT2JqZWN0OworCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisJCQlyZWZPYmplY3QgPSAoRU9iamVjdCkgaXQubmV4dCgpOworCQkJY29weUV4dGVudC5hZGQoY29udGFpbm1lbnRDb3B5KHJlZk9iamVjdCwgbnVsbCkpOworCQl9CisJfQorCisJLyoqCisJICogQ29weSBhIG1hbnkgdmFsdWUgYXR0cmlidXRlIHdoaWNoIGlzIHRyZWF0ZWQgYXMgYSBtYW55IHZhbHVlZCByZWZlcmVuY2UuCisJICogCisJICogVGVzdHM6CisJICogCisJICogMS4gSWYgdGhlIHR5cGUgaXMgPGJvbGQ+bm90IDwvYm9sZD4gPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gc2V0IHRoZSB2YWx1ZSBvbgorCSAqIDxjb2RlPmNvcHlSZWY8L2NvZGU+IHdpdGhvdXQgbWFraW5nIGEgY29weS4gMi4gSWYgdGhlIHR5cGUgaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4KKwkgKiBvYnRhaW4gdGhlIGxpc3QgZnJvbSA8Y29kZT5jb3B5UmVmPC9jb2RlPiBhbmQgYWRkIGEgY29weSBvZiBlYWNoIHZhbHVlIGZyb20gdGhlIG9yaWdpbmFsCisJICogbGlzdCB0byBpdC4KKwkgKi8KKworCXByb3RlY3RlZCB2b2lkIGNvcHlNYW55QXR0cmlidXRlKEVBdHRyaWJ1dGUgYXR0cmlidXRlLCBMaXN0IGFWYWx1ZSwgRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgsIEVPYmplY3QgY29weVJlZikgeworCQlpZiAoYXR0cmlidXRlLmdldEVUeXBlKCkgPT0gbnVsbCkKKwkJCWNvcHlSZWYuZVNldChhdHRyaWJ1dGUsIGFWYWx1ZSk7CisJCWVsc2UgeworCQkJTGlzdCBjb3B5TGlzdCA9IChMaXN0KSBjb3B5UmVmLmVHZXQoYXR0cmlidXRlKTsKKwkJCUl0ZXJhdG9yIGl0ID0gYVZhbHVlLml0ZXJhdG9yKCk7CisJCQlPYmplY3QgbmV4dDsKKwkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKwkJCQluZXh0ID0gaXQubmV4dCgpOworCQkJCWlmIChuZXh0IGluc3RhbmNlb2YgRU9iamVjdCkKKwkJCQkJY29weUxpc3QuYWRkKGNvbnRhaW5tZW50Q29weSgoRU9iamVjdCkgbmV4dCwgaWRTdWZmaXgpKTsKKwkJCQllbHNlCisJCQkJCWNvcHlMaXN0LmFkZChuZXh0KTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIHdpbGwgaXRlcmF0ZSBvdmVyIHRoZSByZWZlcmVuY2VzIG9mIHRoZSByZWNlaXZlci4gSWYgYSByZWZlcmVuY2UncyB2YWx1ZSBpcyBub3QKKwkgKiA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiBhIHNlcmllcyBvZiB0ZXN0cyBhcmUgZG9uZSBiZWZvcmUgc2V0dGluZyB0aGUgdmFsdWUgd2l0aCB0aGUKKwkgKiBjb3BpZWQgb2JqZWN0LCA8Y29kZT5jb3B5UmVmPC9jb2RlPi4KKwkgKiAKKwkgKiBUZXN0czogMS4gSWYgdGhlIHJlZmVyZW5jZSBpcyBtYW55LCBvYnRhaW4gdGhlIGxpc3QgZnJvbSB0aGUgcmVjZWl2aW5nIG9iamVjdCBhbmQgbWFrZSBhIGNvcHkKKwkgKiBvZiBlYWNoIHZhbHVlIGlmIHRoZSByZWZlcmVuY2UgaXMgY29tcG9zaXRlIGJlZm9yZSBhZGRpbmcgdG8gdGhlIGxpc3Q7IG90aGVyd2lzZSwganVzdCBhZGQKKwkgKiBlYWNoIHZhbHVlIHRvIHRoZSBvZiB0aGUgPGNvZGU+Y29weVJlZjwvY29kZT4uCisJICovCisKKwlwcm90ZWN0ZWQgdm9pZCBjb3B5TWFueVJlZmVyZW5jZShFUmVmZXJlbmNlIGFSZWZlcmVuY2UsIExpc3QgYUxpc3QsIEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4LCBFT2JqZWN0IGNvcHlSZWYpIHsKKwkJaWYgKCFhTGlzdC5pc0VtcHR5KCkpIHsKKwkJCWlmIChhUmVmZXJlbmNlLmlzQ29udGFpbm1lbnQoKSkgeworCQkJCUxpc3QgY29weUxpc3QgPSAoTGlzdCkgY29weVJlZi5lR2V0KGFSZWZlcmVuY2UpOworCQkJCUl0ZXJhdG9yIGl0ID0gYUxpc3QuaXRlcmF0b3IoKTsKKwkJCQlFT2JqZWN0IHRhcmdldFZhbHVlOworCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKwkJCQkJdGFyZ2V0VmFsdWUgPSAoRU9iamVjdCkgaXQubmV4dCgpOworCQkJCQljb3B5TGlzdC5hZGQoY29udGFpbm1lbnRDb3B5KHRhcmdldFZhbHVlLCBpZFN1ZmZpeCkpOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCWFkZERlZmVycmVkTWFueVJlZmVyZW5jZUNvcHkoYVJlZmVyZW5jZSwgYUxpc3QsIGlkU3VmZml4LCBjb3B5UmVmKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIHdpbGwgaXRlcmF0ZSBvdmVyIHRoZSByZWZlcmVuY2VzIG9mIHRoZSByZWNlaXZlci4gSWYgYSByZWZlcmVuY2UncyB2YWx1ZSBpcyBub3QKKwkgKiA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiBwZXJmb3JtIHRoZSBjb3B5LgorCSAqLworCisJcHJvdGVjdGVkIHZvaWQgY29weVJlZmVyZW5jZShFUmVmZXJlbmNlIGFSZWZlcmVuY2UsIEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4LCBFT2JqZWN0IGNvcHlSZWYpIHsKKwkJaWYgKGFSZWZlcmVuY2UuaXNNYW55KCkpIHsKKwkJCUxpc3QgdmFsdWUgPSAoTGlzdCkgYVJlZk9iamVjdC5lR2V0KGFSZWZlcmVuY2UpOworCQkJaWYgKHZhbHVlICE9IG51bGwpCisJCQkJY29weU1hbnlSZWZlcmVuY2UoYVJlZmVyZW5jZSwgdmFsdWUsIGFSZWZPYmplY3QsIGlkU3VmZml4LCBjb3B5UmVmKTsKKwkJfSBlbHNlIGlmIChhUmVmT2JqZWN0LmVJc1NldChhUmVmZXJlbmNlKSkgeworCQkJT2JqZWN0IHZhbHVlID0gYVJlZk9iamVjdC5lR2V0KGFSZWZlcmVuY2UpOworCQkJY29weVNpbmdsZVJlZmVyZW5jZShhUmVmZXJlbmNlLCAoRU9iamVjdCkgdmFsdWUsIGFSZWZPYmplY3QsIGlkU3VmZml4LCBjb3B5UmVmKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENvcHkgYWxsIFJlZk9iamVjdHMgZnJvbSA8Y29kZT5hR3JvdXA8L2NvZGU+IGFuZCBhZGQgdGhlIGNvcHkgYmFjayB0byA8Y29kZT5hR3JvdXA8L2NvZGU+LgorCSAqLworCXByb3RlY3RlZCB2b2lkIGNvcHlSZWZPYmplY3RzKENvcHlHcm91cCBhR3JvdXApIHsKKwkJQXNzb2NpYXRpb24gYXNzb2NpYXRpb247CisJCUVPYmplY3QgcmVmT2JqZWN0OworCQlTdHJpbmcgaWRTdWZmaXg7CisJCWlmIChhR3JvdXAucHJpbUdldFJlZk9iamVjdHMoKSAhPSBudWxsKSB7CisJCQlJdGVyYXRvciBpdCA9IGFHcm91cC5wcmltR2V0UmVmT2JqZWN0cygpLml0ZXJhdG9yKCk7CisJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisJCQkJYXNzb2NpYXRpb24gPSAoQXNzb2NpYXRpb24pIGl0Lm5leHQoKTsKKwkJCQlyZWZPYmplY3QgPSAoRU9iamVjdCkgYXNzb2NpYXRpb24uZ2V0S2V5KCk7CisJCQkJaWRTdWZmaXggPSAoU3RyaW5nKSBhc3NvY2lhdGlvbi5nZXRWYWx1ZSgpOworCQkJCWlmIChpZFN1ZmZpeCA9PSBudWxsKQorCQkJCQlpZFN1ZmZpeCA9IGFHcm91cC5nZXREZWZhdWx0SWRTdWZmaXgoKTsKKwkJCQlhR3JvdXAuYWRkQ29waWVkKGNvbnRhaW5tZW50Q29weShyZWZPYmplY3QsIGlkU3VmZml4KSk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBDb3B5IGFsbCBSZXNvdXJjZXMgZnJvbSA8Y29kZT5hR3JvdXA8L2NvZGU+IGFuZCBhZGQgdGhlIGNvcHkgYmFjayB0byA8Y29kZT5hR3JvdXA8L2NvZGU+LgorCSAqLworCXByb3RlY3RlZCB2b2lkIGNvcHlSZXNvdXJjZXMoQ29weUdyb3VwIGFHcm91cCkgeworCQlBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbjsKKwkJUmVzb3VyY2UgcmVzb3VyY2U7CisJCVN0cmluZyB1cmk7CisJCWlmIChhR3JvdXAucHJpbUdldFJlc291cmNlcygpICE9IG51bGwpIHsKKwkJCUl0ZXJhdG9yIGl0ID0gYUdyb3VwLnByaW1HZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOworCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCQkJCWFzc29jaWF0aW9uID0gKEFzc29jaWF0aW9uKSBpdC5uZXh0KCk7CisJCQkJcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGFzc29jaWF0aW9uLmdldEtleSgpOworCQkJCXVyaSA9IChTdHJpbmcpIGFzc29jaWF0aW9uLmdldFZhbHVlKCk7CisJCQkJUmVzb3VyY2UgY29waWVkID0gY29udGFpbm1lbnRDb3B5KHJlc291cmNlLCB1cmkpOworCQkJCWNvcHlNb2RpZmljYXRpb25GbGFnKHJlc291cmNlLCBjb3BpZWQpOworCQkJCWFHcm91cC5hZGRDb3BpZWQoY29waWVkKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIENvcHkgYSBzaW5nbGUgdmFsdWUgYXR0cmlidXRlLgorCSAqIAorCSAqIFRlc3RzOgorCSAqIAorCSAqIDEuIElmIGFuIGF0dHJpYnV0ZSB0eXBlIGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPiB0aGVuIGl0IGlzIGFuIG9iamVjdCB0eXBlIGFuZCBpdCBtdXN0IGJlCisJICogY29waWVkLiBEbyBub3QgY29weSB0aGUgdmFsdWUgaWYgdGhlIGF0dHJpYnV0ZSBpcyBhbiBFbnVtZXJhdGlvbiB0eXBlLiAyLiBJZiBhbiBhdHRyaWJ1dGUKKwkgKiB0eXBlIGlzIDxib2xkPm5vdCA8L2JvbGQ+IDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gY29weSB0aGUgdmFsdWUgYmVmb3JlIHNldHRpbmcgaXQgb24KKwkgKiA8Y29kZT5jb3B5UmVmPC9jb2RlPi4KKwkgKi8KKworCXByb3RlY3RlZCB2b2lkIGNvcHlTaW5nbGVBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBhdHRyaWJ1dGUsIE9iamVjdCBhVmFsdWUsIEVPYmplY3QgYVJlZk9iamVjdCwgU3RyaW5nIGlkU3VmZml4LCBFT2JqZWN0IGNvcHlSZWYpIHsKKwkJaWYgKGF0dHJpYnV0ZS5nZXRFVHlwZSgpID09IG51bGwpIHsKKwkJCWNvcHlSZWYuZVNldChhdHRyaWJ1dGUsIGFWYWx1ZSk7CisJCX0gZWxzZSB7CisJCQkvL01PRjEwOAorCQkJLy8gaWYgKGF0dHJpYnV0ZS5pc09iamVjdFR5cGUoKSkKKwkJCWlmIChhdHRyaWJ1dGUuZ2V0RVR5cGUoKSBpbnN0YW5jZW9mIEVDbGFzcykKKwkJCQljb3B5UmVmLmVTZXQoYXR0cmlidXRlLCBjb250YWlubWVudENvcHkoKEVPYmplY3QpIGFWYWx1ZSwgaWRTdWZmaXgpKTsKKwkJCWVsc2UKKwkJCQljb3B5UmVmLmVTZXQoYXR0cmlidXRlLCBhVmFsdWUpOworCQl9CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2Qgd2lsbCBpdGVyYXRlIG92ZXIgdGhlIHJlZmVyZW5jZXMgb2YgdGhlIHJlY2VpdmVyLiBJZiBhIHJlZmVyZW5jZSdzIHZhbHVlIGlzIG5vdAorCSAqIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIGEgc2VyaWVzIG9mIHRlc3RzIGFyZSBkb25lIGJlZm9yZSBzZXR0aW5nIHRoZSB2YWx1ZSB3aXRoIHRoZQorCSAqIGNvcGllZCBvYmplY3QsIDxjb2RlPmNvcHlSZWY8L2NvZGU+LgorCSAqIAorCSAqIFRlc3RzOiAxLiBJZiB0aGUgcmVmZXJlbmNlIGlzIDxib2xkPm5vdCA8L2JvbGQ+IG1hbnksIG1ha2UgYSBjb3B5IG9mIHRoZSB2YWx1ZSBpZiB0aGUKKwkgKiByZWZlcmVuY2UgaXMgY29tcG9zaXRlIGJlZm9yZSBzZXR0aW5nIHRoZSB2YWx1ZSB3aXRoIDxjb2RlPmNvcHlSZWY8L2NvZGU+OyBvdGhlcndpc2UsIGp1c3QKKwkgKiBzZXQgdGhlIHZhbHVlIGFzIGlzLgorCSAqLworCisJcHJvdGVjdGVkIHZvaWQgY29weVNpbmdsZVJlZmVyZW5jZShFUmVmZXJlbmNlIGFSZWZlcmVuY2UsIEVPYmplY3QgYVZhbHVlLCBFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCwgRU9iamVjdCBjb3B5UmVmKSB7CisJCS8vRXhjZXB0aW9uYWwgY2FzZTsgdGhlIHJlbGF0aW9uc2hpcCBpcyBub3QgdGhlIGNvbnRhaW5lciByZWxhdGlvbnNoaXAKKwkJLy9BbmQgaXMgbm90IG5hdmlnYWJsZSBpbiB0aGUgb3RoZXIgZGlyZWN0aW9uOyBnbyBhaGVhZCBhbmQgY29weQorCQlpZiAoYVZhbHVlICE9IGFSZWZPYmplY3QuZUNvbnRhaW5lcigpIHx8IGFSZWZlcmVuY2UuZ2V0RU9wcG9zaXRlKCkgPT0gbnVsbCkgeworCQkJaWYgKGFSZWZlcmVuY2UuaXNDb250YWlubWVudCgpKQorCQkJCWNvcHlSZWYuZVNldChhUmVmZXJlbmNlLCBjb250YWlubWVudENvcHkoYVZhbHVlLCBpZFN1ZmZpeCkpOworCQkJZWxzZQorCQkJCWFkZERlZmVycmVkU2luZ2xlUmVmZXJlbmNlQ29weShhUmVmZXJlbmNlLCBhVmFsdWUsIGlkU3VmZml4LCBjb3B5UmVmKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENvcHkgYWxsIFJlc291cmNlcyBhbmQgUmVmT2JqZWN0cyB3aXRoaW4gPGNvZGU+YUdyb3VwPC9jb2RlPiBhbmQgYWRkIHRoZW0gdG8KKwkgKiA8Y29kZT5hR3JvdXA8L2NvZGU+LiBOb24gY29tcG9zaXRlIHJlZmVyZW5jZXMgd2lsbCBiZSBkZWZlcnJlZCB1bnRpbCBhbGwgb2JqZWN0cyBhcmUKKwkgKiBjb3BpZWQgZnJvbSA8Y29kZT5hR3JvdXA8L2NvZGU+LgorCSAqIAorCSAqIENvcHkgUmVzb3VyY2VzIGZpcnN0IGFuZCB0aGVuIGNvcHkgUmVmT2JqZWN0cy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlQ29weShDb3B5R3JvdXAgYUdyb3VwKSB7CisJCUV0b29sc0NvcHlVdGlsaXR5IHV0aWxpdHkgPSBuZXcgRXRvb2xzQ29weVV0aWxpdHkoKTsKKwkJdXRpbGl0eS5jb3B5KGFHcm91cCk7CisJfQorCisJLyoqCisJICogQ29waWVzIGF0dHJpYnV0ZXMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlQXR0cmlidXRlQ29weShFT2JqZWN0IGFSZWZPYmplY3QsIEVPYmplY3QgY29weU9iamVjdCkgeworCQlFdG9vbHNDb3B5VXRpbGl0eSB1dGlsaXR5ID0gbmV3IEV0b29sc0NvcHlVdGlsaXR5KCk7CisJCXV0aWxpdHkuY29weUN1cnJlbnRBdHRyaWJ1dGVzKGFSZWZPYmplY3QsIG51bGwsIGNvcHlPYmplY3QpOworCX0KKworCS8qKgorCSAqIENvcGllcyBhbGwgc2V0IGF0dHJpYnV0ZXMgYW5kIHJlZmVyZW5jZXMgYmFzZWQgb24gY29udGFpbm1lbnQuIFRodXMsIGl0IHdpbGwgY29weSB0aGUgZW50aXJlCisJICogY29udGFpbm1lbnQgdHJlZS4gVXNlIHRoZSBpZFN1ZmZpeCB0byBkZWZpbmUgdGhlIHN1ZmZpeCB0aGF0IHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGV4aXN0aW5nCisJICogSURzIG9mIGNvcGllZCBvYmplY3RzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgRU9iamVjdCBjcmVhdGVDb3B5KEVPYmplY3QgYVJlZk9iamVjdCkgeworCQlyZXR1cm4gY3JlYXRlQ29weShhUmVmT2JqZWN0LCBudWxsKTsKKwl9CisKKwkvKioKKwkgKiBDb3BpZXMgYWxsIHNldCBhdHRyaWJ1dGVzIGFuZCByZWZlcmVuY2VzIGJhc2VkIG9uIGNvbnRhaW5tZW50LiBUaHVzLCBpdCB3aWxsIGNvcHkgdGhlIGVudGlyZQorCSAqIGNvbnRhaW5tZW50IHRyZWUuIFVzZSB0aGUgaWRTdWZmaXggdG8gZGVmaW5lIHRoZSBzdWZmaXggdGhhdCB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBleGlzdGluZworCSAqIElEcyBvZiBjb3BpZWQgb2JqZWN0cy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEVPYmplY3QgY3JlYXRlQ29weShFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCkgeworCQlFdG9vbHNDb3B5VXRpbGl0eSB1dGlsaXR5ID0gbmV3IEV0b29sc0NvcHlVdGlsaXR5KCk7CisJCXJldHVybiB1dGlsaXR5LmNvcHkoYVJlZk9iamVjdCwgaWRTdWZmaXgpOworCX0KKworCS8qKgorCSAqIENvcHkgPGNvZGU+YVJlc291cmNlPC9jb2RlPiB1c2luZyA8Y29kZT5uZXdVcmk8L2NvZGU+IGZvciB0aGUgVVJJLgorCSAqLworCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UgY3JlYXRlQ29weShSZXNvdXJjZSBhUmVzb3VyY2UsIFN0cmluZyBuZXdVcmkpIHsKKwkJRXRvb2xzQ29weVV0aWxpdHkgdXRpbGl0eSA9IG5ldyBFdG9vbHNDb3B5VXRpbGl0eSgpOworCQlyZXR1cm4gdXRpbGl0eS5jb3B5KGFSZXNvdXJjZSwgbmV3VXJpKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlRGVmZXJyZWRDb3B5QWN0aW9ucygpIHsKKwkJaWYgKHByaW1HZXREZWZlcnJlZFJlZmVyZW5jZUNvcGllcygpICE9IG51bGwpIHsKKwkJCUl0ZXJhdG9yIGl0ID0gcHJpbUdldERlZmVycmVkUmVmZXJlbmNlQ29waWVzKCkuaXRlcmF0b3IoKTsKKwkJCURlZmVycmVkUmVmZXJlbmNlVXRpbGl0eUFjdGlvbiBhY3Rpb247CisJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisJCQkJYWN0aW9uID0gKERlZmVycmVkUmVmZXJlbmNlVXRpbGl0eUFjdGlvbikgaXQubmV4dCgpOworCQkJCWFjdGlvbi5wZXJmb3JtQWN0aW9uKCk7CisJCQl9CisJCQlwcmltR2V0RGVmZXJyZWRSZWZlcmVuY2VDb3BpZXMoKS5jbGVhcigpOworCQl9CisJfQorCisJLyoqCisJICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTIvMTMvMjAwMCA5OjE3OjM1IFBNKQorCSAqIAorCSAqIEByZXR1cm4gamF2YS51dGlsLkhhc2hNYXAKKwkgKi8KKwlwcm90ZWN0ZWQgamF2YS51dGlsLkhhc2hNYXAgZ2V0Q29waWVkT2JqZWN0cygpIHsKKwkJaWYgKGNvcGllZE9iamVjdHMgPT0gbnVsbCkKKwkJCWNvcGllZE9iamVjdHMgPSBuZXcgSGFzaE1hcCgyMDApOworCQlyZXR1cm4gY29waWVkT2JqZWN0czsKKwl9CisKKwlwcm90ZWN0ZWQgamF2YS51dGlsLkhhc2hNYXAgZ2V0Q29waWVkQWRhcHRlcnMoKSB7CisJCWlmIChjb3BpZWRBZGFwdGVycyA9PSBudWxsKQorCQkJY29waWVkQWRhcHRlcnMgPSBuZXcgSGFzaE1hcCgyMDApOworCQlyZXR1cm4gY29waWVkQWRhcHRlcnM7CisJfQorCisJLyoqCisJICogUmV0dXJuIGEgY2FjaGVkIGNvcHkuCisJICovCisJcHVibGljIEVPYmplY3QgZ2V0Q29weShFT2JqZWN0IGFuT2JqZWN0KSB7CisJCWlmIChhbk9iamVjdCA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCXJldHVybiAoRU9iamVjdCkgZ2V0Q29waWVkT2JqZWN0cygpLmdldChhbk9iamVjdCk7CisJfQorCisJLyoqCisJICogUmV0dXJuIGEgY2FjaGVkIGNvcHksIGlmIG5vbmUsIHJldHVybiB0aGUgYXJndW1lbnQuCisJICovCisJcHVibGljIEVPYmplY3QgZ2V0Q29weUlmRm91bmQoRU9iamVjdCBhbk9iamVjdCkgeworCQlFT2JqZWN0IGNvcGllZCA9IGdldENvcHkoYW5PYmplY3QpOworCQlyZXR1cm4gY29waWVkID09IG51bGwgPyBhbk9iamVjdCA6IGNvcGllZDsKKwl9CisKKwkvKioKKwkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNi8yMDAwIDk6MTE6MzIgQU0pCisJICogCisJICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAorCSAqLworCXByb3RlY3RlZCBqYXZhLnV0aWwuTGlzdCBnZXREZWZlcnJlZFJlZmVyZW5jZUNvcGllcygpIHsKKwkJaWYgKGRlZmVycmVkUmVmZXJlbmNlQ29waWVzID09IG51bGwpCisJCQlkZWZlcnJlZFJlZmVyZW5jZUNvcGllcyA9IG5ldyBBcnJheUxpc3QoMTAwKTsKKwkJcmV0dXJuIGRlZmVycmVkUmVmZXJlbmNlQ29waWVzOworCX0KKworCS8qKgorCSAqIFJldHVybiBhbiBpbnN0YW5jZSBvZiBFT2JqZWN0IHRoYXQgaXMgdGhlIHNhbWUgdHlwZSBhcyA8Y29kZT5hUmVmT2JqZWN0PC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgRU9iamVjdCBuZXdJbnN0YW5jZShFT2JqZWN0IGFSZWZPYmplY3QpIHsKKwkJaWYgKGFSZWZPYmplY3QgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQlFUGFja2FnZSBlcGtnID0gKEVQYWNrYWdlKSBhUmVmT2JqZWN0LmVDbGFzcygpLmVDb250YWluZXIoKTsKKwkJRUZhY3RvcnkgZmFjdG9yeSA9IGVwa2cuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOworCQlFQ2xhc3MgcmVmT2JqID0gYVJlZk9iamVjdC5lQ2xhc3MoKTsKKwkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlKHJlZk9iaik7CisJfQorCisJLyoqCisJICogUmV0dXJuIGFuIGluc3RhbmNlIG9mIFJlc291cmNlIHRoYXQgdXNlcyB0aGUgc2FtZSBSZXNvdXJjZUZhY3RvcnkgYXMgdGhlIG9uZSB1c2VkIGJ5CisJICogPGNvZGU+YVJlc291cmNlPC9jb2RlPi4gSWYgPGNvZGU+bmV3VXJpPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPiB0aGVuIHVzZSB0aGUgVVJJCisJICogZnJvbSA8Y29kZT5hUmVzb3VyY2U8L2NvZGU+LgorCSAqLworCXB1YmxpYyBSZXNvdXJjZSBuZXdJbnN0YW5jZShSZXNvdXJjZSBhUmVzb3VyY2UsIFN0cmluZyBuZXdVcmkpIHsKKwkJaWYgKGFSZXNvdXJjZSA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCVJlc291cmNlIG5ld1Jlc291cmNlOworCQlTdHJpbmcgb3JpZ2luYWxVcmkgPSBhUmVzb3VyY2UuZ2V0VVJJKCkudG9TdHJpbmcoKTsKKwkJbmV3VXJpID0gbmV3VXJpID09IG51bGwgPyBvcmlnaW5hbFVyaSA6IG5ld1VyaTsKKworCQlSZXNvdXJjZS5GYWN0b3J5IGZhY3RvcnkgPSBudWxsOworCQlpZiAoYVJlc291cmNlLmdldFJlc291cmNlU2V0KCkgPT0gbnVsbCkKKwkJCWZhY3RvcnkgPSBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEZhY3RvcnkoVVJJLmNyZWF0ZVVSSShvcmlnaW5hbFVyaSkpOworCQllbHNlCisJCQlmYWN0b3J5ID0gYVJlc291cmNlLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKS5nZXRGYWN0b3J5KFVSSS5jcmVhdGVVUkkob3JpZ2luYWxVcmkpKTsKKworCisJCW5ld1Jlc291cmNlID0gZmFjdG9yeS5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKG5ld1VyaSkpOworCQlyZXR1cm4gbmV3UmVzb3VyY2U7CisJfQorCisJLyoqCisJICogU2hvdWxkIHRoZSBpZCBiZSBjb3BpZWQgaW4gdGhlIGNhc2Ugd2hlcmUgbm8gc3VmZml4IGlzIHNwZWNpZmllZD8gRGVmYXVsdHMgdG8gZmFsc2UKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBwcmVzZXJ2ZUlkcygpIHsKKwkJcmV0dXJuIHByZXNlcnZlSWRzOworCX0KKworCS8qKgorCSAqIENvcGllcyBhbGwgc2V0IGF0dHJpYnV0ZXMgYW5kIHJlZmVyZW5jZXMgYmFzZWQgb24gY29udGFpbm1lbnQuIFRodXMsIGl0IHdpbGwgY29weSB0aGUgZW50aXJlCisJICogY29udGFpbm1lbnQgdHJlZS4gVXNlIHRoZSBpZFN1ZmZpeCB0byBkZWZpbmUgdGhlIHN1ZmZpeCB0aGF0IHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGV4aXN0aW5nCisJICogSURzIG9mIGNvcGllZCBvYmplY3RzLiBJZiBhbiBpZFN1ZmZpeCBkb2VzIG5vdCBleGlzdCwgZG8gbm90IHNldCBhbiBpZCBvbiB0aGUgY29waWVkIG9iamVjdC4KKwkgKi8KKwlwcm90ZWN0ZWQgRU9iamVjdCBwcmltQ29weShFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCkgeworCQlpZiAoYVJlZk9iamVjdCA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCUVPYmplY3QgY29weVJlZiA9IHByaW1Db3B5T2JqZWN0KGFSZWZPYmplY3QsIGlkU3VmZml4KTsKKworCQljb3B5Q3VycmVudFJlZmVyZW5jZXMoYVJlZk9iamVjdCwgaWRTdWZmaXgsIGNvcHlSZWYpOworCQlyZXR1cm4gY29weVJlZjsKKwl9CisKKwkvKioKKwkgKiBDb3BpZXMgYWxsIHNldCBhdHRyaWJ1dGVzIGJhc2VkIG9uIGNvbnRhaW5tZW50LiBUaHVzLCBpdCB3aWxsIGNvcHkgdGhlIGVudGlyZSBjb250YWlubWVudAorCSAqIHRyZWUuIFVzZSB0aGUgaWRTdWZmaXggdG8gZGVmaW5lIHRoZSBzdWZmaXggdGhhdCB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBleGlzdGluZyBJRHMgb2YKKwkgKiBjb3BpZWQgb2JqZWN0cy4gSWYgYW4gaWRTdWZmaXggZG9lcyBub3QgZXhpc3QsIGRvIG5vdCBzZXQgYW4gaWQgb24gdGhlIGNvcGllZCBvYmplY3QuCisJICovCisJcHJvdGVjdGVkIEVPYmplY3QgcHJpbUNvcHlPYmplY3QoRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgpIHsKKwkJaWYgKGFSZWZPYmplY3QgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQlFT2JqZWN0IGNvcHlSZWYgPSBuZXdJbnN0YW5jZShhUmVmT2JqZWN0KTsKKworCQlyZWNvcmRDb3B5KGFSZWZPYmplY3QsIGNvcHlSZWYpOworCQljb3B5Q3VycmVudEF0dHJpYnV0ZXMoYVJlZk9iamVjdCwgaWRTdWZmaXgsIGNvcHlSZWYpOworCQlpZiAoaXNDb3B5QWRhcHRlcnMoKSkKKwkJCWNvcHlBZGFwdGVycyhhUmVmT2JqZWN0LCBjb3B5UmVmKTsKKwkJcmV0dXJuIGNvcHlSZWY7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgY29weUFkYXB0ZXJzKEVPYmplY3QgYVJlZk9iamVjdCwgRU9iamVjdCBjb3B5UmVmKSB7CisJCUxpc3QgYWRhcHRlcnMgPSBhUmVmT2JqZWN0LmVBZGFwdGVycygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGFkYXB0ZXJzLnNpemUoKTsgaSsrKSB7CisJCQlBZGFwdGVyIGFkYXB0ZXIgPSAoQWRhcHRlcikgYWRhcHRlcnMuZ2V0KGkpOworCQkJY29weUFkYXB0ZXIoYVJlZk9iamVjdCwgY29weVJlZiwgYWRhcHRlcik7CisKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIGNvcHlBZGFwdGVyKEVPYmplY3QgYVJlZk9iamVjdCwgRU9iamVjdCBjb3B5UmVmLCBBZGFwdGVyIGFkYXB0ZXIpIHsKKwkJaWYgKCEoYWRhcHRlciBpbnN0YW5jZW9mIENsb25lYWJsZVB1YmxpYykpCisJCQlyZXR1cm47CisJCUNsb25lYWJsZVB1YmxpYyBjb3B5QWRhcHRlciA9IChDbG9uZWFibGVQdWJsaWMpIGdldENvcGllZEFkYXB0ZXJzKCkuZ2V0KGFkYXB0ZXIpOworCQlpZiAoY29weUFkYXB0ZXIgPT0gbnVsbCkgeworCQkJY29weUFkYXB0ZXIgPSAoQ2xvbmVhYmxlUHVibGljKSAoKENsb25lYWJsZVB1YmxpYykgYWRhcHRlcikuY2xvbmUoKTsKKwkJCWdldENvcGllZEFkYXB0ZXJzKCkucHV0KGFkYXB0ZXIsIGNvcHlBZGFwdGVyKTsKKwkJfQorCQlpZiAoY29weUFkYXB0ZXIgIT0gbnVsbCkKKwkJCWNvcHlSZWYuZUFkYXB0ZXJzKCkuYWRkKGNvcHlBZGFwdGVyKTsKKwl9CisKKwkvKioKKwkgKiBDb3BpZXMgYWxsIHNldCBhdHRyaWJ1dGVzIGFuZCByZWZlcmVuY2VzIGJhc2VkIG9uIGNvbnRhaW5tZW50LiBUaHVzLCBpdCB3aWxsIGNvcHkgdGhlIGVudGlyZQorCSAqIGNvbnRhaW5tZW50IHRyZWUuIFVzZSB0aGUgaWRTdWZmaXggdG8gZGVmaW5lIHRoZSBzdWZmaXggdGhhdCB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBleGlzdGluZworCSAqIElEcyBvZiBjb3BpZWQgb2JqZWN0cy4KKwkgKi8KKwlwcm90ZWN0ZWQgUmVzb3VyY2UgcHJpbUNvcHkoUmVzb3VyY2UgYVJlc291cmNlLCBTdHJpbmcgbmV3VXJpKSB7CisJCWlmIChhUmVzb3VyY2UgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQlSZXNvdXJjZSBjb3B5UmVzb3VyY2UgPSBuZXdJbnN0YW5jZShhUmVzb3VyY2UsIG5ld1VyaSk7CisJCWNvcHlFeHRlbnQoYVJlc291cmNlLmdldENvbnRlbnRzKCksIGNvcHlSZXNvdXJjZS5nZXRDb250ZW50cygpKTsKKwkJcmV0dXJuIGNvcHlSZXNvdXJjZTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBjb3B5TW9kaWZpY2F0aW9uRmxhZyhSZXNvdXJjZSBhUmVzb3VyY2UsIFJlc291cmNlIGNvcGllZCkgeworCQlpZiAoYVJlc291cmNlLmlzTW9kaWZpZWQoKSkKKwkJCWNvcGllZC5zZXRNb2RpZmllZCh0cnVlKTsKKwl9CisKKwkvKioKKwkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMi8xNi8yMDAwIDk6MTE6MzIgQU0pCisJICogCisJICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAorCSAqLworCXByaXZhdGUgamF2YS51dGlsLkxpc3QgcHJpbUdldERlZmVycmVkUmVmZXJlbmNlQ29waWVzKCkgeworCQlyZXR1cm4gZGVmZXJyZWRSZWZlcmVuY2VDb3BpZXM7CisJfQorCisJcHVibGljIHZvaWQgcmVjb3JkQ29weShFT2JqZWN0IGFTb3VyY2UsIEVPYmplY3QgYUNvcHkpIHsKKwkJZ2V0Q29waWVkT2JqZWN0cygpLnB1dChhU291cmNlLCBhQ29weSk7CisJfQorCisJcHVibGljIHZvaWQgcmVjb3JkQ29weShBZGFwdGVyIGFTb3VyY2UsIEFkYXB0ZXIgYUNvcHkpIHsKKwkJZ2V0Q29waWVkQWRhcHRlcnMoKS5wdXQoYVNvdXJjZSwgYUNvcHkpOworCX0KKworCS8qKgorCSAqIFNob3VsZCB0aGUgaWQgYmUgY29waWVkIGluIHRoZSBjYXNlIHdoZXJlIG5vIHN1ZmZpeCBpcyBzcGVjaWZpZWQ/CisJICovCisJcHVibGljIHZvaWQgc2V0UHJlc2VydmVJZHMoYm9vbGVhbiB2YWx1ZSkgeworCQlwcmVzZXJ2ZUlkcyA9IHZhbHVlOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIHNob3VsZENvcHlSZWZlcmVuY2UoRVJlZmVyZW5jZSBhUmVmZXJlbmNlKSB7CisJCXJldHVybiBhUmVmZXJlbmNlLmlzQ2hhbmdlYWJsZSgpOworCX0KKworCS8qKgorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0NvcHlBZGFwdGVycygpIHsKKwkJcmV0dXJuIGNvcHlBZGFwdGVyczsKKwl9CisKKwkvKioKKwkgKiBGbGFnIHVzZWQgdG8gaW5kaWNhdGUgd2hldGhlciBhZGFwdGVycyBzaG91bGQgYmUgY29waWVkIGFzIHdlbGwuIEluIG9yZGVyIGZvciBhbiBhZGFwdGVyIHRvCisJICogYmUgY29waWVkLCBpdCBtdXN0IGltcGxlbWVudCB0aGUge0BsaW5rIENsb25lYWJsZVB1YmxpY31pbnRlcmZhY2UuCisJICovCisJcHVibGljIHZvaWQgc2V0Q29weUFkYXB0ZXJzKGJvb2xlYW4gYikgeworCQljb3B5QWRhcHRlcnMgPSBiOworCX0KKworfQorCisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FeGNlcHRpb25IZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FeGNlcHRpb25IZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDYyOWFmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0V4Y2VwdGlvbkhlbHBlci5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKKworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50Lm5vbnVpLklXRlRXcmFwcGVkRXhjZXB0aW9uOworCisKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHRvIGZhY3RvciBjb21tb24gY29kZSBmb3IgaW1wbGVtZW50ZXJzIG9mIElBcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbgorICovCitwdWJsaWMgY2xhc3MgRXhjZXB0aW9uSGVscGVyIHsKKworCS8qKgorCSAqIFV0aWxpdHkgY2xhc3M7IGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQKKwkgKi8KKwlwcml2YXRlIEV4Y2VwdGlvbkhlbHBlcigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIG1lc3NhZ2VzIGZyb20KKwkgKiAKKwkgKiBAZXhjZXB0aW9uIGFuZAorCSAqICAgICAgICAgICAgICAgIGFsbCBuZXN0ZWQgZXhjZXB0aW9ucywgaW4gb3JkZXIgZnJvbSBvdXRlcm1vc3QgdG8gaW5uZXJtb3N0CisJICovCisJcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0QWxsTWVzc2FnZXMoSVdGVFdyYXBwZWRFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCUxpc3QgbWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0KDQpOworCQltZXNzYWdlcy5hZGQoZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7CisJCUV4Y2VwdGlvbiBuZXN0ZWQgPSBleGNlcHRpb24uZ2V0TmVzdGVkRXhjZXB0aW9uKCk7CisJCXdoaWxlIChuZXN0ZWQgIT0gbnVsbCkgeworCQkJbWVzc2FnZXMuYWRkKG5lc3RlZC5nZXRNZXNzYWdlKCkpOworCQkJaWYgKG5lc3RlZCBpbnN0YW5jZW9mIElXRlRXcmFwcGVkRXhjZXB0aW9uKQorCQkJCW5lc3RlZCA9ICgoSVdGVFdyYXBwZWRFeGNlcHRpb24pIG5lc3RlZCkuZ2V0TmVzdGVkRXhjZXB0aW9uKCk7CisJCQllbHNlCisJCQkJbmVzdGVkID0gbnVsbDsKKwkJfQorCQlyZXR1cm4gKFN0cmluZ1tdKSBtZXNzYWdlcy50b0FycmF5KG5ldyBTdHJpbmdbbWVzc2FnZXMuc2l6ZSgpXSk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBtZXNzYWdlcyBmcm9tCisJICogCisJICogQGV4Y2VwdGlvbiBhbmQKKwkgKiAgICAgICAgICAgICAgICBhbGwgbmVzdGVkIGV4Y2VwdGlvbnMsIGluIG9yZGVyIGZyb20gb3V0ZXJtb3N0IHRvIGlubmVybW9zdCwgY29uY2F0ZW5hdGVkIGFzCisJICogICAgICAgICAgICAgICAgb25lCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29uY2F0ZW5hdGVkTWVzc2FnZXMoSVdGVFdyYXBwZWRFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCVN0cmluZ1tdIG1lc3NhZ2VzID0gZ2V0QWxsTWVzc2FnZXMoZXhjZXB0aW9uKTsKKwkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigyNTYpOworCQlmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VzLmxlbmd0aDsgaSsrKSB7CisJCQlzYi5hcHBlbmQobWVzc2FnZXNbaV0pOworCQkJaWYgKGkgPCBtZXNzYWdlcy5sZW5ndGggLSAxKQorCQkJCXNiLmFwcGVuZCgnXG4nKTsKKwkJfQorCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRXh0ZW5kZWRFY29yZVV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9FeHRlbmRlZEVjb3JlVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5Y2Y5MTQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRXh0ZW5kZWRFY29yZVV0aWwuamF2YQpAQCAtMCwwICsxLDI3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKKworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5CYXNpY05vdGlmaWVySW1wbC5FQWRhcHRlckxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKKworCisKK3B1YmxpYyBjbGFzcyBFeHRlbmRlZEVjb3JlVXRpbCBleHRlbmRzIEVjb3JlVXRpbCB7CisJcHJpdmF0ZSBzdGF0aWMgRmlsZU5vdEZvdW5kRGV0ZWN0b3IgRklMRV9OT1RfRk9VTkRfREVURUNUT1I7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE5BTUVfQVRUUklCVVRFX1NUUklORyA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAorCisKKwlwdWJsaWMgaW50ZXJmYWNlIEZpbGVOb3RGb3VuZERldGVjdG9yIHsKKwkJYm9vbGVhbiBpc0ZpbGVOb3RGb3VuZChXcmFwcGVkRXhjZXB0aW9uIHdyYXBwZWRFeCk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHNldEZpbGVOb3RGb3VuZERldGVjdG9yKEZpbGVOb3RGb3VuZERldGVjdG9yIGRldGVjdG9yKSB7CisJCUZJTEVfTk9UX0ZPVU5EX0RFVEVDVE9SID0gZGV0ZWN0b3I7CisJfQorCisJcHVibGljIHN0YXRpYyBGaWxlTm90Rm91bmREZXRlY3RvciBnZXRGaWxlTm90Rm91bmREZXRlY3RvcigpIHsKKwkJaWYgKEZJTEVfTk9UX0ZPVU5EX0RFVEVDVE9SID09IG51bGwpIHsKKwkJCUZJTEVfTk9UX0ZPVU5EX0RFVEVDVE9SID0gbmV3IEZpbGVOb3RGb3VuZERldGVjdG9yKCkgeworCQkJCXB1YmxpYyBib29sZWFuIGlzRmlsZU5vdEZvdW5kKFdyYXBwZWRFeGNlcHRpb24gd3JhcHBlZEV4KSB7CisJCQkJCWlmIChnZXRJbm5lckZpbGVOb3RGb3VuZEV4Y2VwdGlvbih3cmFwcGVkRXgpICE9IG51bGwpCisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX07CisJCX0KKwkJcmV0dXJuIEZJTEVfTk9UX0ZPVU5EX0RFVEVDVE9SOworCX0KKworCXB1YmxpYyBzdGF0aWMgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGdldElubmVyRmlsZU5vdEZvdW5kRXhjZXB0aW9uKFdyYXBwZWRFeGNlcHRpb24gd3JhcHBlZEV4KSB7CisJCWlmICh3cmFwcGVkRXguZXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbikgeworCQkJcmV0dXJuIChGaWxlTm90Rm91bmRFeGNlcHRpb24pIHdyYXBwZWRFeC5leGNlcHRpb24oKTsKKwkJfSBlbHNlIGlmICh3cmFwcGVkRXguZXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBXcmFwcGVkRXhjZXB0aW9uKSB7CisJCQlyZXR1cm4gZ2V0SW5uZXJGaWxlTm90Rm91bmRFeGNlcHRpb24oKFdyYXBwZWRFeGNlcHRpb24pIHdyYXBwZWRFeC5leGNlcHRpb24oKSk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGVTZXRPckFkZChFT2JqZWN0IG9iaiwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSkgeworCQllU2V0T3JBZGQob2JqLCBmZWF0dXJlLCB2YWx1ZSwgMCk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGVTZXRPckFkZChFT2JqZWN0IG9iaiwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSwgaW50IG5ld0luZGV4KSB7CisJCWlmIChmZWF0dXJlLmlzTWFueSgpICYmIHZhbHVlICE9IG51bGwpIHsKKwkJCWlmIChuZXdJbmRleCA+PSAwKQorCQkJCSgoTGlzdCkgb2JqLmVHZXQoZmVhdHVyZSkpLmFkZChuZXdJbmRleCwgdmFsdWUpOworCQkJZWxzZQorCQkJCSgoTGlzdCkgb2JqLmVHZXQoZmVhdHVyZSkpLmFkZCh2YWx1ZSk7CisJCX0gZWxzZSB7CisJCQlvYmouZVNldChmZWF0dXJlLCB2YWx1ZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZVVuc2V0T3JSZW1vdmUoRU9iamVjdCBvYmosIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKKwkJaWYgKGZlYXR1cmUgPT0gbnVsbCB8fCBmZWF0dXJlLmlzTWFueSgpKQorCQkJKChMaXN0KSBvYmouZUdldChmZWF0dXJlKSkucmVtb3ZlKHZhbHVlKTsKKwkJZWxzZQorCQkJb2JqLmVVbnNldChmZWF0dXJlKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZW5kc1dpdGgoVVJJIHNvdXJjZVVyaSwgVVJJIHRlc3RVcmkpIHsKKwkJLy9UT0RPIFdhaXRpbmcgb24gbmV3IGVtZiBVUkkgQVBJCisJCVN0cmluZ1tdIHNvdXJjZVNlZ21lbnRzID0gc291cmNlVXJpLnNlZ21lbnRzKCk7CisJCVN0cmluZ1tdIHRlc3RTZWdtZW50cyA9IHRlc3RVcmkuc2VnbWVudHMoKTsKKwkJaW50IGkgPSB0ZXN0U2VnbWVudHMubGVuZ3RoOworCQlpbnQgaiA9IHNvdXJjZVNlZ21lbnRzLmxlbmd0aDsKKwkJaWYgKGogPj0gaSkgeworCQkJYm9vbGVhbiB0ZXN0ID0gdHJ1ZTsKKworCQkJd2hpbGUgKHRlc3QgJiYgaSA+IDApIHsKKwkJCQlpLS07CisJCQkJai0tOworCQkJCXRlc3QgPSB0ZXN0U2VnbWVudHNbaV0uZXF1YWxzKHNvdXJjZVNlZ21lbnRzW2pdKTsKKwkJCX0KKwkJCXJldHVybiB0ZXN0OworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROYW1lKEVPYmplY3Qgb2JqKSB7CisJCWlmIChvYmogPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQlpZiAob2JqIGluc3RhbmNlb2YgRU5hbWVkRWxlbWVudCkKKwkJCXJldHVybiAoKEVOYW1lZEVsZW1lbnQpIG9iaikuZ2V0TmFtZSgpOworCQlMaXN0IGFsbEF0dHMgPSBvYmouZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKTsKKwkJaW50IHNpemUgPSBhbGxBdHRzLnNpemUoKTsKKwkJRUF0dHJpYnV0ZSBhdHQsIG5hbWVBdHRyaWJ1dGUgPSBudWxsOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJYXR0ID0gKEVBdHRyaWJ1dGUpIGFsbEF0dHMuZ2V0KGkpOworCQkJaWYgKE5BTUVfQVRUUklCVVRFX1NUUklORy5lcXVhbHMoYXR0LmdldE5hbWUoKSkpIHsKKwkJCQluYW1lQXR0cmlidXRlID0gYXR0OworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChuYW1lQXR0cmlidXRlICE9IG51bGwpCisJCQlyZXR1cm4gKFN0cmluZykgb2JqLmVHZXQobmFtZUF0dHJpYnV0ZSk7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIEBkZXByZWNhdGVkIE5vIGxvbmdlciBuZWVkZWQuCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGFkZExvYWRpbmdUYWcoUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkJLy9yZXNvdXJjZS5lQWRhcHRlcnMoKS5hZGQoSXNMb2FkaW5nRGV0ZWN0b3IuSU5TVEFOQ0UpOworCX0KKworCS8qKgorCSAqIEBkZXByZWNhdGVkIE5vIGxvbmdlciBuZWVkZWQuCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUxvYWRpbmdUYWcoUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkJLy9yZXNvdXJjZS5lQWRhcHRlcnMoKS5yZW1vdmUoSXNMb2FkaW5nRGV0ZWN0b3IuSU5TVEFOQ0UpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0cnVlIGlmIHRoZSByZXNvdXJjZSBpcyBjdXJyZW50bHkgYmVpbmcgbG9hZGVkLiBUaGlzIGlzIGRldGVybWluZWQgYnkgY2hlY2tpbmcgZm9yIHRoZQorCSAqIElzTG9hZGluZ0RlY3RvciBpbiB0aGUgbGlzdCBvZiBlQWRhcHRlcnMgb24gdGhlIHJlc291cmNlLgorCSAqIAorCSAqIEBwYXJhbSByZXNvdXJjZQorCSAqIEByZXR1cm4gYm9vbGVhbgorCSAqIAorCSAqIEBzZWUgYWRkTG9hZGluZ1RhZyhSZXNvdXJjZSkKKwkgKiBAc2VlIHJlbW92ZUxvYWRpbmdUYWcoUmVzb3VyY2UpCisJICogIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgUmVzb3VyY2UuSW50ZXJuYWwjaXNMb2FkaW5nKCl9CisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzTG9hZGluZyhSZXNvdXJjZSByZXNvdXJjZSkgeworCQlyZXR1cm4gcmVzb3VyY2UgIT0gbnVsbCA/ICgoUmVzb3VyY2UuSW50ZXJuYWwpcmVzb3VyY2UpLmlzTG9hZGluZygpIDogZmFsc2U7IAorCX0KKworCXB1YmxpYyBzdGF0aWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyRm9yTG9hZGluZyhBZGFwdGVyIHRhcmdldEFkYXB0ZXIsIEVPYmplY3QgdGFyZ2V0T2JqZWN0KSB7CisJCVJlc291cmNlIHJlcyA9IHRhcmdldE9iamVjdC5lUmVzb3VyY2UoKTsKKwkJaWYgKHJlcyA9PSBudWxsIHx8IGlzTG9hZGluZyhyZXMpKQorCQkJcmV0dXJuIG5ldyBJc0xvYWRpbmdQcm94eUFkYXB0ZXIodGFyZ2V0QWRhcHRlciwgdGFyZ2V0T2JqZWN0KTsKKwkJcmV0dXJuIHRhcmdldEFkYXB0ZXI7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHByZVJlZ2lzdGVyUGFja2FnZShTdHJpbmcgbnNQcmVmaXgsIEVQYWNrYWdlLkRlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworCQlpZiAoIUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmNvbnRhaW5zS2V5KG5zUHJlZml4KSkKKwkJCUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dChuc1ByZWZpeCwgZGVzY3JpcHRvcik7CisJfQorCS8qKgorCSAgICogUmV0dXJucyB0aGUgYWRhcHRlciBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCisJICogQHBhcmFtIGFuT2JqZWN0IAorCSAgICogQHBhcmFtIGFkYXB0ZXJzIGxpc3Qgb2YgYWRhcHRlcnMgdG8gc2VhcmNoLgorCSAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgYWRhcHRlci4KKwkgICAqIEByZXR1cm4gYW4gYWRhcHRlciBmcm9tIHRoZSBsaXN0IG9yIG51bGwuCisJICAgKi8KKwkgIHB1YmxpYyBzdGF0aWMgQWRhcHRlciBnZXRBZGFwdGVyKEVPYmplY3QgYW5PYmplY3QsIExpc3QgYWRhcHRlcnMsIE9iamVjdCB0eXBlKSB7CisKKwkJICAJT2JqZWN0IFtdIGFkYXB0QXJyYXkgPSAoKEVBZGFwdGVyTGlzdClhZGFwdGVycykuZGF0YSgpOworCQkgIAlpZiAoYWRhcHRBcnJheSA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWRhcHRBcnJheS5sZW5ndGg7IGkrKykgeworCQkJCUFkYXB0ZXIgYWRhcHRlciA9IChBZGFwdGVyKSBhZGFwdEFycmF5W2ldOworCQkJCWlmIChhZGFwdGVyICE9IG51bGwgJiYgYWRhcHRlci5pc0FkYXB0ZXJGb3JUeXBlKHR5cGUpKSB7CisJCQkJCXJldHVybiBhZGFwdGVyOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJlbW92ZSB0aGlzIG9iamVjdCBmcm9tIGl0J3MgY29udGFpbmVyLCBhbmQgbWFrZSBpdCBhbmQgYWxsIGl0J3MgY2hpbGRyZW4KKwkgKiBwcm94aWVzCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHVubG9hZChFT2JqZWN0IHJvb3QpIHsKKwkJUmVzb3VyY2UgcmVzID0gcm9vdC5lUmVzb3VyY2UoKTsKKwkJRU9iamVjdCBjb250YWluZXIgPSByb290LmVDb250YWluZXIoKTsKKwkJLyogTWFraW5nIHN1cmUgdGhlIHByb3h5IGlzIGNyZWF0ZWQgZmlyc3QgYmVmb3JlIHVubG9hZGluZyAqLworCQlpZiAocm9vdCAhPSBudWxsICYmIHJlcyAhPSBudWxsKQorCQkJYmVjb21lUHJveHkocm9vdCwgcmVzKTsKKwkJaWYgKGNvbnRhaW5lciA9PSBudWxsKQorCQkJaWYgKHJlcyAhPSBudWxsKQorCQkJCXJlcy5nZXRDb250ZW50cygpLnJlbW92ZShyb290KTsKKwkJCWVsc2UgeworCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gcm9vdC5lQ29udGFpbm1lbnRGZWF0dXJlKCk7CisJCQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkKKwkJCQkJZVVuc2V0T3JSZW1vdmUoY29udGFpbmVyLCBmZWF0dXJlLCByb290KTsKKwkJCX0KKwkJCisJfQorCisJLyoqCisJICogVHVybnMgdGhpcyBvYmplY3QgYW5kIGFsbCBpdCdzIGNoaWxkcmVuIHRvIHByb3hpZXMsIGFuZCByZW1vdmVzIGFkYXB0ZXJzIHByZWNvbmRpdGlvbjogVGhlCisJICogb2JqZWN0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSBpdCdzIGNvbnRhaW5lcgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBiZWNvbWVQcm94eShFT2JqZWN0IHJvb3QsIFJlc291cmNlIHJlcykgeworCQlJdGVyYXRvciBpdGVyID0gcm9vdC5lQWxsQ29udGVudHMoKTsKKwkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisJCQlkb0JlY29tZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIGl0ZXIubmV4dCgpLCByZXMpOworCQl9CisJCWRvQmVjb21lUHJveHkoKEludGVybmFsRU9iamVjdCkgcm9vdCwgcmVzKTsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZG9CZWNvbWVQcm94eShJbnRlcm5hbEVPYmplY3QgcCwgUmVzb3VyY2UgcmVzKSB7CisJCVN0cmluZyBpZCA9IHJlcy5nZXRVUklGcmFnbWVudChwKTsKKwkJcC5lU2V0UHJveHlVUkkocmVzLmdldFVSSSgpLmFwcGVuZEZyYWdtZW50KGlkKSk7CisJCWlmIChyZXMgaW5zdGFuY2VvZiBYTUxSZXNvdXJjZSkgeworCQkJKChYTUxSZXNvdXJjZSkgcmVzKS5zZXRJRChwLG51bGwpOworCQl9CisJCXAuZUFkYXB0ZXJzKCkuY2xlYXIoKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlUHJveHkoRU9iamVjdCByb290LCBSZXNvdXJjZSByZXMpIHsKKwkJSXRlcmF0b3IgaXRlciA9IHJvb3QuZUFsbENvbnRlbnRzKCk7CisJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgeworCQkJZG9SZW1vdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KSBpdGVyLm5leHQoKSwgcmVzKTsKKwkJfQorCQlkb1JlbW92ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIHJvb3QsIHJlcyk7CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGRvUmVtb3ZlUHJveHkoSW50ZXJuYWxFT2JqZWN0IHAsIFJlc291cmNlIHJlcykgeworCQlTdHJpbmcgaWQgPSBwLmVQcm94eVVSSSgpLmZyYWdtZW50KCk7CisJCWlmIChyZXMgaW5zdGFuY2VvZiBYTUxSZXNvdXJjZSkgeworCQkJKChYTUxSZXNvdXJjZSkgcmVzKS5zZXRJRChwLCBpZCk7CisJCX0KKwkJcC5lU2V0UHJveHlVUkkobnVsbCk7CisJfQorCisKKwkvKioKKwkgKiBFbnN1cmVzIHRoZSBwYXNzZWQgb2JqZWN0IGlzIG5vdCBhIHByb3h5OyBpZiBpdCBpcywgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpbmRpY2F0aW5nIHRoZSBiYWQKKwkgKiBIUkVGLiBJZiB0aGUgb2JqZWN0IGlzIG51bGwsIGRvZXMgbm90aGluZy4KKwkgKiAKKwkgKiBAcGFyYW0gb2JqZWN0CisJICogQHRocm93cyBEYW5nbGluZ0hSRUZFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tQcm94eShFT2JqZWN0IG9iamVjdCkgdGhyb3dzIERhbmdsaW5nSFJFRkV4Y2VwdGlvbiB7CisJCWlmIChvYmplY3QgPT0gbnVsbCB8fCAhb2JqZWN0LmVJc1Byb3h5KCkpCisJCQlyZXR1cm47CisJCVN0cmluZyBtc2cgPSBXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuREFOR0xJTkdfSFJFRl9FUlJPUl8sIG5ldyBPYmplY3RbXXsoKEludGVybmFsRU9iamVjdCkgb2JqZWN0KS5lUHJveHlVUkkoKX0pOworCQl0aHJvdyBuZXcgRGFuZ2xpbmdIUkVGRXhjZXB0aW9uKG1zZyk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRydWUgaWYgbzEgYW5kIG8yIGFyZSBub3QgdGhlIHNhbWUgdmFsdWVzLiBUaGlzIGltcGxlbWVudGF0aW9uIHRha2VzIGludG8gYWNjb3VudCB0aGF0CisJICogZWl0aGVyIHBhcmFtZXRlciBjYW4gYmUgbnVsbC4KKwkgKiAKKwkgKiBAcGFyYW0gbzEKKwkgKiBAcGFyYW0gbzIKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIHZhbHVlQ2hhbmdlZChPYmplY3QgbzEsIE9iamVjdCBvMikgeworCQlyZXR1cm4gKG8xID09IG51bGwgXiBvMiA9PSBudWxsKSB8fCAobzEgPT0gbnVsbCB8fCAhbzEuZXF1YWxzKG8yKSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0ZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTI1YTFmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0ZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDI5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCisgKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKKworcHVibGljIGNsYXNzIEZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yIGZvciBGZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uLgorCSAqLworCXB1YmxpYyBGZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yIGZvciBGZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBzCisJICovCisJcHVibGljIEZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24oU3RyaW5nIHMpIHsKKwkJc3VwZXIocyk7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0ZlYXR1cmVWYWx1ZUNvbnZlcnRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0ZlYXR1cmVWYWx1ZUNvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NmE2ODcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvRmVhdHVyZVZhbHVlQ29udmVydGVyLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKKworCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworCisvKioKKyAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg1LzEwLzIwMDEgMjo0Njo1NCBQTSkKKyAqIAorICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgorICovCitwdWJsaWMgaW50ZXJmYWNlIEZlYXR1cmVWYWx1ZUNvbnZlcnRlciB7CisJc3RhdGljIGZpbmFsIEZlYXR1cmVWYWx1ZUNvbnZlcnRlciBERUZBVUxUID0gbmV3IERlZmF1bHRGZWF0dXJlVmFsdWVDb252ZXJ0ZXIoKTsKKworCS8qKgorCSAqIENvbnZlcnQKKwkgKiAKKwkgKiBAYVZhbHVlIHRvIHRoZSB0eXBlIG9mCisJICogQGFGZWF0dXJlLgorCSAqLworCU9iamVjdCBjb252ZXJ0VmFsdWUoT2JqZWN0IGFWYWx1ZSwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSUNvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZDgxN2IKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSUNvbW1hbmQuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CisKKy8qKgorICogQGF1dGhvciBKb2huIE1vdXJyYQorICovCitwdWJsaWMgaW50ZXJmYWNlIElDb21tYW5kIHsKKworCS8qCisJICogVGhpcyB3aWxsIGNvbnRhaW4gdGhlIG11bHRpLXNlbGVjdGlvbiBvZiBvYmplY3RzIHRvIGRlcGxveS4gVGhpcyBzZWxlY3Rpb24gY291bGQgYmUgdXNlZCB0bworCSAqIGZpbHRlciBlbGVtZW50cyB3aXRoaW4gYSBNb2R1bGUuIEFueSBvdGhlciBzZXR1cCBjb2RlIHNob3VsZCBiZSBkb25lIGhlcmUuLi4KKwkgKi8KKwl2b2lkIGluaXQoT2JqZWN0W10gc2VsZWN0aW9uKTsKKworCS8qKgorCSAqIEBwYXJhbSByZXNvdXJjZQorCSAqIEBwYXJhbSBkZWx0YQorCSAqIEBwYXJhbSBjb250ZXh0CisJICogQHJldHVybgorCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoSVJlc291cmNlIHJlc291cmNlLCBJUmVzb3VyY2VEZWx0YSBkZWx0YSwgSUNvbW1hbmRDb250ZXh0IGNvbnRleHQpIHRocm93cyBDb3JlRXhjZXB0aW9uOworCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSUNvbW1hbmRDb250ZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSUNvbW1hbmRDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY0MjcxNwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JQ29tbWFuZENvbnRleHQuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OworCisvKioKKyAqIEBhdXRob3IgSm9obiBNb3VycmEKKyAqLworcHVibGljIGludGVyZmFjZSBJQ29tbWFuZENvbnRleHQgeworCisJLyoqCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBJUHJvZ3Jlc3NNb25pdG9yIGdldFByb2dyZXNzTW9uaXRvcigpOworCisJLyoqCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBNYXAgZ2V0Q29uZmlndXJhdGlvblByb3BlcnRpZXMoKTsKKworCS8qKgorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgUmVzb3VyY2VTZXQgZ2V0UmVzb3VyY2VTZXQoKTsKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JRFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JRFV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODg5ODZjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0lEVXRpbC5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOworCitwdWJsaWMgY2xhc3MgSURVdGlsIHsKKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgdG8gYXNzaWduIGEgdW5pcXVlIElEIHRvIHRoZSBvYmplY3QuIFRoZSBvYmplY3QgbXVzdCBiZSBjb250YWluZWQgaW4gYQorCSAqIHJlc291cmNlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBhc3NpZ25JRChFT2JqZWN0IG9iamVjdCkgeworCQlSZXNvdXJjZSBhUmVzb3VyY2UgPSBvYmplY3QuZVJlc291cmNlKCk7CisJCWlmIChhUmVzb3VyY2UgaW5zdGFuY2VvZiBYTUxSZXNvdXJjZSkKKwkJCWFzc2lnbklEKG9iamVjdCwgKFhNTFJlc291cmNlKSBhUmVzb3VyY2UpOworCisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0T3JBc3NpZ25JRChFT2JqZWN0IG9iamVjdCkgeworCQlSZXNvdXJjZSBhUmVzb3VyY2UgPSBvYmplY3QuZVJlc291cmNlKCk7CisJCWlmIChhUmVzb3VyY2UgaW5zdGFuY2VvZiBYTUxSZXNvdXJjZSkKKwkJCXJldHVybiBnZXRPckFzc2lnbklEKG9iamVjdCwgKFhNTFJlc291cmNlKSBhUmVzb3VyY2UpOworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPckFzc2lnbklEKEVPYmplY3Qgb2JqZWN0LCBYTUxSZXNvdXJjZSBhUmVzb3VyY2UpIHsKKwkJU3RyaW5nIGlkID0gYVJlc291cmNlLmdldElEKG9iamVjdCk7CisJCWlmIChpZCA9PSBudWxsKQorCQkJcmV0dXJuIGFzc2lnbklEKG9iamVjdCwgYVJlc291cmNlKTsKKwkJcmV0dXJuIGlkOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFzc2lnbklEKEVPYmplY3Qgb2JqZWN0LCBYTUxSZXNvdXJjZSBhUmVzb3VyY2UpIHsKKwkJU3RyaW5nIG5hbWUgPSBnZXRCYXNlSURGb3JBc3NpZ25tZW50KG9iamVjdCk7CisJCWlmIChuYW1lID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJU3RyaW5nIGlkID0gZW5zdXJlVW5pcXVlSUQoYVJlc291cmNlLCBuYW1lKTsKKwkJYVJlc291cmNlLnNldElEKG9iamVjdCwgaWQpOworCQlyZXR1cm4gaWQ7CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZW5zdXJlVW5pcXVlSUQoWE1MUmVzb3VyY2UgYVJlc291cmNlLCBTdHJpbmcgYmFzZUlETmFtZSkgeworCQliYXNlSUROYW1lICs9ICJfIjsgLy8kTk9OLU5MUy0xJAorCQkvL0NoYW5nZSB0byB1c2UgdGhlIGN1cnJlbnQgdGltZSBpbnN0ZWFkIG9mIGluY3JlbWVudGFsIG51bWJlcnMgdG8gaGVscAorCQkvL3N1cHBvcnQgdGVhbSBkZXZlbG9wbWVudC4KKwkJbG9uZyBjdXJyZW50VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQlTdHJpbmcgaWQgPSBiYXNlSUROYW1lICsgY3VycmVudFRpbWU7CisJCXdoaWxlIChhUmVzb3VyY2UuZ2V0RU9iamVjdChpZCkgIT0gbnVsbCkgeworCQkJKytjdXJyZW50VGltZTsKKwkJCWlkID0gYmFzZUlETmFtZSArIGN1cnJlbnRUaW1lOworCQl9CisJCXJldHVybiBpZDsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRCYXNlSURGb3JBc3NpZ25tZW50KEVPYmplY3Qgb2JqZWN0KSB7CisJCUVDbGFzcyBtZXRhTyA9IG9iamVjdC5lQ2xhc3MoKTsKKwkJcmV0dXJuIG1ldGFPLmdldE5hbWUoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JbnZhbGlkUGFzc3dvcmRDaXBoZXJFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JbnZhbGlkUGFzc3dvcmRDaXBoZXJFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmY1MTNiCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0ludmFsaWRQYXNzd29yZENpcGhlckV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKKyAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOworCisKK2ltcG9ydCBvcmcub21nLkNPUkJBLlVzZXJFeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBJbnZhbGlkUGFzc3dvcmRDaXBoZXJFeGNlcHRpb24gZXh0ZW5kcyBVc2VyRXhjZXB0aW9uIHsKK30KKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0ludmFsaWRQYXNzd29yZERlY29kaW5nRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSW52YWxpZFBhc3N3b3JkRGVjb2RpbmdFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTE2ODA4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0ludmFsaWRQYXNzd29yZERlY29kaW5nRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwxNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQorICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7CisKKworaW1wb3J0IG9yZy5vbWcuQ09SQkEuVXNlckV4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIEludmFsaWRQYXNzd29yZERlY29kaW5nRXhjZXB0aW9uIGV4dGVuZHMgVXNlckV4Y2VwdGlvbiB7Cit9CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JbnZhbGlkUGFzc3dvcmRFbmNvZGluZ0V4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0ludmFsaWRQYXNzd29yZEVuY29kaW5nRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ4ODJkNwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9JbnZhbGlkUGFzc3dvcmRFbmNvZGluZ0V4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKKyAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOworCisKK2ltcG9ydCBvcmcub21nLkNPUkJBLlVzZXJFeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBJbnZhbGlkUGFzc3dvcmRFbmNvZGluZ0V4Y2VwdGlvbiBleHRlbmRzIFVzZXJFeGNlcHRpb24geworfQorCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSXNMb2FkaW5nRGV0ZWN0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Jc0xvYWRpbmdEZXRlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZDExNGMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvSXNMb2FkaW5nRGV0ZWN0b3IuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCisgKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQ3JlYXRlZCBvbiBBcHIgMSwgMjAwMworICogCisgKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlCisgKiBhbmQgQ29tbWVudHMKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKKworCitwdWJsaWMgY2xhc3MgSXNMb2FkaW5nRGV0ZWN0b3IgaW1wbGVtZW50cyBBZGFwdGVyIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIElzTG9hZGluZ0RldGVjdG9yIElOU1RBTkNFID0gbmV3IElzTG9hZGluZ0RldGVjdG9yKCk7CisKKwlwcml2YXRlIElzTG9hZGluZ0RldGVjdG9yKCkgeworCX0KKworCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCX0KKworCXB1YmxpYyBOb3RpZmllciBnZXRUYXJnZXQoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIHsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7CisJCXJldHVybiB0eXBlID09IHRoaXM7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Jc0xvYWRpbmdQcm94eUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9Jc0xvYWRpbmdQcm94eUFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzViODY1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL0lzTG9hZGluZ1Byb3h5QWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQ3JlYXRlZCBvbiBBcHIgMSwgMjAwMworICoKKyAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KKyAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cworICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworCisvKioKKyAqIEBhdXRob3IgREFCRVJHCisgKiAKKyAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCisgKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCisgKi8KK3B1YmxpYyBjbGFzcyBJc0xvYWRpbmdQcm94eUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7CisJcHJpdmF0ZSBSZXNvdXJjZSByZXNvdXJjZTsKKwlwcml2YXRlIEFkYXB0ZXIgdGFyZ2V0QWRhcHRlcjsKKwlwcml2YXRlIEVPYmplY3QgdGFyZ2V0T2JqZWN0OworCisJcHVibGljIElzTG9hZGluZ1Byb3h5QWRhcHRlcihBZGFwdGVyIGFUYXJnZXRBZGFwdGVyLCBFT2JqZWN0IGFUYXJnZXRPYmplY3QpIHsKKwkJdGFyZ2V0QWRhcHRlciA9IGFUYXJnZXRBZGFwdGVyOworCQl0YXJnZXRPYmplY3QgPSBhVGFyZ2V0T2JqZWN0OworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKKwkgKi8KKwlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKKwkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKKwkJCS8vbGlzdGVuIGZvciB0aGUgcmVtb3ZlIG9mIHRoZSBsb2FkaW5nIGFkYXB0ZXIKKwkJCWlmIChtc2cuZ2V0RmVhdHVyZUlEKG51bGwpID09IFJlc291cmNlLlJFU09VUkNFX19JU19MT0FERUQgJiYgbXNnLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5TRVQpIHsKKwkJCQlyZW1vdmVQcm94eVN1cHBvcnQoKTsKKwkJCQlyZXNldCgpOworCQkJfQorCQl9IGVsc2UgaWYgKGNhY2hlUmVzb3VyY2UoKSkgeworCQkJdGFyZ2V0QWRhcHRlci5ub3RpZnlDaGFuZ2VkKG1zZyk7CisJCQlyZXNldCgpOworCQl9CisJfQorCisJLyoqCisJICogQ2FjaGUgdGhlIHJlc291cmNlIHZhcmlhYmxlIGFuZCByZXR1cm4gdHJ1ZSBpZiB3ZSByZW1vdmVkIHRoZSBwcm94eSBzdXBwb3J0LgorCSAqLworCXByaXZhdGUgYm9vbGVhbiBjYWNoZVJlc291cmNlKCkgeworCQlpZiAoZ2V0VGFyZ2V0KCkgIT0gbnVsbCkgeworCQkJRU9iamVjdCBlT2JqID0gKEVPYmplY3QpIGdldFRhcmdldCgpOworCQkJcmVzb3VyY2UgPSBlT2JqLmVSZXNvdXJjZSgpOworCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKKwkJCQllT2JqLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKKwkJCQlpZiAoRXh0ZW5kZWRFY29yZVV0aWwuaXNMb2FkaW5nKHJlc291cmNlKSkKKwkJCQkJcmVzb3VyY2UuZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOworCQkJCWVsc2UgeworCQkJCQl0YXJnZXRPYmplY3QuZUFkYXB0ZXJzKCkuYWRkKHRhcmdldEFkYXB0ZXIpOworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqICAKKwkgKi8KKwlwcml2YXRlIHZvaWQgcmVtb3ZlUHJveHlTdXBwb3J0KCkgeworCQlnZXRUYXJnZXQoKS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7CisJCXRhcmdldE9iamVjdC5lQWRhcHRlcnMoKS5hZGQodGFyZ2V0QWRhcHRlcik7CisJfQorCisJcHJpdmF0ZSB2b2lkIHJlc2V0KCkgeworCQlyZXNvdXJjZSA9IG51bGw7CisJCXRhcmdldEFkYXB0ZXIgPSBudWxsOworCQl0YXJnZXRPYmplY3QgPSBudWxsOworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL05hbWVzcGFjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL05hbWVzcGFjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNGE3MzYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvTmFtZXNwYWNlLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQorICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIENyZWF0ZWQgb24gQXVnIDIwLCAyMDAzCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOworCisKK3B1YmxpYyBjbGFzcyBOYW1lc3BhY2UgeworCisJcHJvdGVjdGVkIFN0cmluZyBwcmVmaXg7CisJcHJvdGVjdGVkIFN0cmluZyBuc1VSSTsKKworCisJcHVibGljIE5hbWVzcGFjZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB7CisJCXRoaXMucHJlZml4ID0gcHJlZml4OworCQl0aGlzLm5zVVJJID0gdXJpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TnNVUkkoKSB7CisJCXJldHVybiBuc1VSSTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKKwkJcmV0dXJuIHByZWZpeDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROc1VSSShTdHJpbmcgc3RyaW5nKSB7CisJCW5zVVJJID0gc3RyaW5nOworCX0KKworCXB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgc3RyaW5nKSB7CisJCXByZWZpeCA9IHN0cmluZzsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL05hbWVzcGFjZUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9OYW1lc3BhY2VBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJkYWM3NgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9OYW1lc3BhY2VBZGFwdGVyLmphdmEKQEAgLTAsMCArMSwyMDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQ3JlYXRlZCBvbiBBdWcgMjAsIDIwMDMKKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVN0cnVjdHVyYWxGZWF0dXJlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CisKKworLyoqCisgKiBJbnRlcm5hbCBjbGFzcyB1c2VkIHRvIGhvbGQgbmFtZXNwYWNlcyBwYXJzZWQgZnJvbSBhbiBYTUwgZmlsZSB1c2luZyB0aGUgeG1sbnM6cHJlZml4PSJhVVJJIgorICogc3ludGF4CisgKi8KK3B1YmxpYyBjbGFzcyBOYW1lc3BhY2VBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBDbG9uZWFibGVQdWJsaWMgeworCisJcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgQURBUFRFUl9UWVBFID0gTmFtZXNwYWNlQWRhcHRlci5jbGFzcy5nZXROYW1lKCk7CisJcHJvdGVjdGVkIE1hcCBwcmVmaXhlc1RvTlM7CisJcHJvdGVjdGVkIExpc3QgbmFtZXNwYWNlczsKKworCXB1YmxpYyBmaW5hbCBzdGF0aWMgRVN0cnVjdHVyYWxGZWF0dXJlIE5PVElGSUNBVElPTl9GRUFUVVJFID0gbmV3IEVTdHJ1Y3R1cmFsRmVhdHVyZUltcGwoKSB7CisJfTsKKworCXByaXZhdGUgc3RhdGljIGNsYXNzIE5vdGlmaWNhdGlvbiBleHRlbmRzIE5vdGlmaWNhdGlvbkltcGwgeworCisJCS8qKgorCQkgKiBAcGFyYW0gZXZlbnRUeXBlCisJCSAqIEBwYXJhbSBvbGRWYWx1ZQorCQkgKiBAcGFyYW0gbmV3VmFsdWUKKwkJICovCisJCXB1YmxpYyBOb3RpZmljYXRpb24oaW50IGV2ZW50VHlwZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJCXN1cGVyKGV2ZW50VHlwZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKKwkJfQorCisJCS8qCisJCSAqIChub24tSmF2YWRvYykKKwkJICogCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsI2dldEZlYXR1cmUoKQorCQkgKi8KKwkJcHVibGljIE9iamVjdCBnZXRGZWF0dXJlKCkgeworCQkJcmV0dXJuIE5PVElGSUNBVElPTl9GRUFUVVJFOworCQl9CisJfQorCisJcHJvdGVjdGVkIE5hbWVzcGFjZUFkYXB0ZXIoKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGFkZE5hbWVzcGFjZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpLCBFT2JqZWN0IG9iaikgeworCQlpZiAob2JqID09IG51bGwpCisJCQlyZXR1cm47CisJCU5hbWVzcGFjZUFkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIob2JqKTsKKwkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKKwkJCWFkYXB0ZXIuYWRkTmFtZXNwYWNlKHByZWZpeCwgdXJpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlTmFtZXNwYWNlKFN0cmluZyBwcmVmaXgsIEVPYmplY3Qgb2JqKSB7CisJCWlmIChvYmogPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJTmFtZXNwYWNlQWRhcHRlciBhZGFwdGVyID0gcmV0cmlldmVFeGlzdGluZ0FkYXB0ZXIob2JqKTsKKwkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKKwkJCWFkYXB0ZXIucmVtb3ZlTmFtZXNwYWNlKHByZWZpeCk7CisJfQorCisJLyoqCisJICogRmFjYWRlIG1ldGhvZCBmb3IgcmVzb2x2aW5nIHByZWZpeGVzIHRvIGFuIGFjdHVhbCBuYW1lc3BhY2UgVVJJLiBVc2VkIGZvciBvYmplY3RzIGNvbnRhaW5lZAorCSAqIGJ5IGluc3RhbmNlcyBvZiB7QGxpbmsgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5UcmFuc2xhdG9yUmVzb3VyY2V9LiBXYWxrcyB1cCB0aGUgb2JqZWN0CisJICogY29udGFpbm1lbnQgcGF0aCB1bnRpbCBhIG5hbWVzcGFjZSBpcyBmb3VuZCwgb3IgcmV0dXJucyBudWxsLgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc29sdmVkTmFtZXNwYWNlVVJJKFN0cmluZyBwcmVmaXgsIEVPYmplY3Qgb2JqKSB7CisJCWlmIChwcmVmaXggPT0gbnVsbCB8fCBvYmogPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQlFT2JqZWN0IGNvbnRhaW5lciA9IG9iajsKKwkJU3RyaW5nIG5zVVJJOworCQl3aGlsZSAoY29udGFpbmVyICE9IG51bGwpIHsKKwkJCW5zVVJJID0gZ2V0TmFtZXNwYWNlVVJJQXRUaGlzTGV2ZWwocHJlZml4LCBjb250YWluZXIpOworCQkJaWYgKG5zVVJJICE9IG51bGwpCisJCQkJcmV0dXJuIG5zVVJJOworCQkJY29udGFpbmVyID0gY29udGFpbmVyLmVDb250YWluZXIoKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROYW1lc3BhY2VVUklBdFRoaXNMZXZlbChTdHJpbmcgcHJlZml4LCBFT2JqZWN0IG9iaikgeworCQlpZiAob2JqID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJTmFtZXNwYWNlQWRhcHRlciBhZGFwdGVyID0gcmV0cmlldmVFeGlzdGluZ0FkYXB0ZXIob2JqKTsKKwkJcmV0dXJuIGFkYXB0ZXIgPT0gbnVsbCA/IG51bGwgOiBhZGFwdGVyLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOworCX0KKworCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXROYW1lc3BhY2VzKEVPYmplY3Qgb2JqKSB7CisJCWlmIChvYmogPT0gbnVsbCkKKwkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOworCQlOYW1lc3BhY2VBZGFwdGVyIGFkYXB0ZXIgPSByZXRyaWV2ZUV4aXN0aW5nQWRhcHRlcihvYmopOworCQlyZXR1cm4gYWRhcHRlciA9PSBudWxsID8gbnVsbCA6IGFkYXB0ZXIuZ2V0TmFtZXNwYWNlcygpOworCisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBOYW1lc3BhY2VBZGFwdGVyIHJldHJpZXZlRXhpc3RpbmdBZGFwdGVyKEVPYmplY3Qgb2JqKSB7CisJCXJldHVybiAoTmFtZXNwYWNlQWRhcHRlcikgRWNvcmVVdGlsLmdldEV4aXN0aW5nQWRhcHRlcihvYmosIEFEQVBURVJfVFlQRSk7CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBOYW1lc3BhY2VBZGFwdGVyIGdldEFkYXB0ZXIoRU9iamVjdCBvYmopIHsKKwkJTmFtZXNwYWNlQWRhcHRlciBhZGFwdGVyID0gcmV0cmlldmVFeGlzdGluZ0FkYXB0ZXIob2JqKTsKKwkJcmV0dXJuIGFkYXB0ZXIgPT0gbnVsbCA/IGNyZWF0ZUFkYXB0ZXIob2JqKSA6IGFkYXB0ZXI7CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBOYW1lc3BhY2VBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoRU9iamVjdCBvYmopIHsKKwkJTmFtZXNwYWNlQWRhcHRlciBhZGFwdGVyID0gbmV3IE5hbWVzcGFjZUFkYXB0ZXIoKTsKKwkJYWRhcHRlci5zZXRUYXJnZXQob2JqKTsKKwkJb2JqLmVBZGFwdGVycygpLmFkZChhZGFwdGVyKTsKKwkJcmV0dXJuIGFkYXB0ZXI7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgYWRkTmFtZXNwYWNlKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpIHsKKwkJTmFtZXNwYWNlIG5zID0gbmV3IE5hbWVzcGFjZShwcmVmaXgsIHVyaSk7CisJCWlmIChuYW1lc3BhY2VzID09IG51bGwpCisJCQluYW1lc3BhY2VzID0gbmV3IEFycmF5TGlzdCgpOworCQlpZiAocHJlZml4ZXNUb05TID09IG51bGwpCisJCQlwcmVmaXhlc1RvTlMgPSBuZXcgSGFzaE1hcCgpOworCisJCXByZWZpeGVzVG9OUy5wdXQocHJlZml4LCBucyk7CisJCW5hbWVzcGFjZXMuYWRkKG5zKTsKKwkJZmlyZU5vdGlmaWNhdGlvbihvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24uQURELCBudWxsLCBucyk7CisKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOYW1lc3BhY2UoU3RyaW5nIHByZWZpeCkgeworCQlOYW1lc3BhY2UgbnMgPSBudWxsOworCQlpZiAocHJlZml4ZXNUb05TICE9IG51bGwpCisJCQlucyA9IChOYW1lc3BhY2UpIHByZWZpeGVzVG9OUy5nZXQocHJlZml4KTsKKworCQlpZiAobnMgIT0gbnVsbCkKKwkJCW5hbWVzcGFjZXMucmVtb3ZlKG5zKTsKKwkJZmlyZU5vdGlmaWNhdGlvbihvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24uUkVNT1ZFLCBucywgbnVsbCk7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoU3RyaW5nIHByZWZpeCkgeworCQlpZiAocHJlZml4ZXNUb05TID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJTmFtZXNwYWNlIG5zID0gKE5hbWVzcGFjZSkgcHJlZml4ZXNUb05TLmdldChwcmVmaXgpOworCQlpZiAobnMgIT0gbnVsbCkKKwkJCXJldHVybiBucy5nZXROc1VSSSgpOworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjaXNBZGFwdGVyRm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKKwkJcmV0dXJuIEFEQVBURVJfVFlQRS5lcXVhbHModHlwZSk7CisJfQorCisJcHVibGljIExpc3QgZ2V0TmFtZXNwYWNlcygpIHsKKwkJcmV0dXJuIG5hbWVzcGFjZXMgPT0gbnVsbCA/IENvbGxlY3Rpb25zLkVNUFRZX0xJU1QgOiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KG5hbWVzcGFjZXMpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGZpcmVOb3RpZmljYXRpb24oaW50IHR5cGUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCWlmICh0YXJnZXQgIT0gbnVsbCkKKwkJCXRhcmdldC5lTm90aWZ5KG5ldyBOb3RpZmljYXRpb24odHlwZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKSk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaGFzTmFtZXNwYWNlcygpIHsKKwkJcmV0dXJuIG5hbWVzcGFjZXMgIT0gbnVsbCAmJiAhbmFtZXNwYWNlcy5pc0VtcHR5KCk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYuZWNvcmUudXRpbGl0aWVzLkNsb25lYWJsZVB1YmxpYyNjbG9uZSgpCisJICovCisJcHVibGljIE9iamVjdCBjbG9uZSgpIHsKKwkJTmFtZXNwYWNlQWRhcHRlciByZXN1bHQgPSBuZXcgTmFtZXNwYWNlQWRhcHRlcigpOworCQlpZiAoaGFzTmFtZXNwYWNlcygpKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzcGFjZXMuc2l6ZSgpOyBpKyspIHsKKwkJCQlOYW1lc3BhY2UgbnMgPSAoTmFtZXNwYWNlKSBuYW1lc3BhY2VzLmdldChpKTsKKwkJCQlyZXN1bHQuYWRkTmFtZXNwYWNlKG5zLmdldFByZWZpeCgpLCBucy5nZXROc1VSSSgpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Bhc3N0aHJ1RW5jb2RlckRlY29kZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9QYXNzdGhydUVuY29kZXJEZWNvZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY4NDA1OQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9QYXNzdGhydUVuY29kZXJEZWNvZGVyLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKKworCisvKioKKyAqIEEgcGFzc3RocnUgRW5jb2RlckRlY29kZXIgaW1wbGVtZW50YXRpb24KKyAqLworcHVibGljIGNsYXNzIFBhc3N0aHJ1RW5jb2RlckRlY29kZXIgZXh0ZW5kcyBFbmNvZGVyRGVjb2RlckFkYXB0ZXIgaW1wbGVtZW50cyBFbmNvZGVyRGVjb2RlciB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBQYXNzdGhydUVuY29kZXJEZWNvZGVyIElOU1RBTkNFID0gbmV3IFBhc3N0aHJ1RW5jb2RlckRlY29kZXIoKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVkgPSBQYXNzdGhydUVuY29kZXJEZWNvZGVyLmNsYXNzLmdldE5hbWUoKTsKKworCS8qKgorCSAqIEVuY29kZXJEZWNvZGVyQWRhcHRlciBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqLworCXByaXZhdGUgUGFzc3RocnVFbmNvZGVyRGVjb2RlcigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgZGVjb2RlZCB2ZXJzaW9uIG9mIHRoZSB2YWx1ZS4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGRlY29kZShTdHJpbmcgdmFsdWUpIHsKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYW4gZW5jb2RlZCB2ZXJzaW9uIG9mIHRoZSB2YWx1ZS4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGVuY29kZShTdHJpbmcgdmFsdWUpIHsKKwkJcmV0dXJuIHZhbHVlOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUGFzc3dvcmRDaXBoZXJVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUGFzc3dvcmRDaXBoZXJVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIzNzE1OAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9QYXNzd29yZENpcGhlclV0aWwuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCisgKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKKworcHVibGljIGNsYXNzIFBhc3N3b3JkQ2lwaGVyVXRpbCB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU1VQUE9SVEVEX0NSWVBUT19BTEdPUklUSE1TW10gPSB7InhvciJ9OyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIF9zdXBwb3J0ZWRfY3J5cHRvX2FsZ29yaXRobXNbXTsKKworCXB1YmxpYyBQYXNzd29yZENpcGhlclV0aWwoKSB7CisJfQorCisJcHVibGljIHN0YXRpYyBieXRlW10gZGVjaXBoZXIoYnl0ZSBhYnl0ZTBbXSwgU3RyaW5nIHMpIHRocm93cyBJbnZhbGlkUGFzc3dvcmRDaXBoZXJFeGNlcHRpb24sIFVuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uIHsKKwkJaWYgKHMgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZENyeXB0b0FsZ29yaXRobUV4Y2VwdGlvbigpOworCQlieXRlIGFieXRlMVtdID0gbnVsbDsKKwkJaWYgKHMuZXF1YWxzSWdub3JlQ2FzZShERUZBVUxUX1NVUFBPUlRFRF9DUllQVE9fQUxHT1JJVEhNU1swXSkpCisJCQlhYnl0ZTEgPSB4b3IoYWJ5dGUwKTsKKwkJZWxzZQorCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uKCk7CisKKwkJaWYgKGFieXRlMSA9PSBudWxsKQorCQkJdGhyb3cgbmV3IEludmFsaWRQYXNzd29yZENpcGhlckV4Y2VwdGlvbigpOworCisJCXJldHVybiBhYnl0ZTE7CisJfQorCisJcHVibGljIHN0YXRpYyBieXRlW10gZW5jaXBoZXIoYnl0ZSBhYnl0ZTBbXSwgU3RyaW5nIHMpIHRocm93cyBJbnZhbGlkUGFzc3dvcmRDaXBoZXJFeGNlcHRpb24sIFVuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uIHsKKwkJaWYgKHMgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZENyeXB0b0FsZ29yaXRobUV4Y2VwdGlvbigpOworCQlieXRlIGFieXRlMVtdID0gbnVsbDsKKwkJaWYgKHMuZXF1YWxzSWdub3JlQ2FzZShERUZBVUxUX1NVUFBPUlRFRF9DUllQVE9fQUxHT1JJVEhNU1swXSkpCisJCQlhYnl0ZTEgPSB4b3IoYWJ5dGUwKTsKKwkJZWxzZQorCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uKCk7CisKKwkJaWYgKGFieXRlMSA9PSBudWxsKQorCQkJdGhyb3cgbmV3IEludmFsaWRQYXNzd29yZENpcGhlckV4Y2VwdGlvbigpOworCQlyZXR1cm4gYWJ5dGUxOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0U3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtcygpIHsKKwkJcmV0dXJuIF9zdXBwb3J0ZWRfY3J5cHRvX2FsZ29yaXRobXM7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIHhvcihieXRlIGFieXRlMFtdKSB7CisJCWJ5dGUgYWJ5dGUxW10gPSBudWxsOworCQlpZiAoYWJ5dGUwICE9IG51bGwpIHsKKwkJCWFieXRlMSA9IG5ldyBieXRlW2FieXRlMC5sZW5ndGhdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhYnl0ZTAubGVuZ3RoOyBpKyspCisJCQkJYWJ5dGUxW2ldID0gKGJ5dGUpICgweDVmIF4gYWJ5dGUwW2ldKTsKKwkJfQorCQlyZXR1cm4gYWJ5dGUxOworCX0KKworCXN0YXRpYyB7CisJCV9zdXBwb3J0ZWRfY3J5cHRvX2FsZ29yaXRobXMgPSBudWxsOworCQlpZiAoX3N1cHBvcnRlZF9jcnlwdG9fYWxnb3JpdGhtcyA9PSBudWxsKQorCQkJX3N1cHBvcnRlZF9jcnlwdG9fYWxnb3JpdGhtcyA9IERFRkFVTFRfU1VQUE9SVEVEX0NSWVBUT19BTEdPUklUSE1TOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUGFzc3dvcmRFbmNvZGVyRGVjb2Rlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Bhc3N3b3JkRW5jb2RlckRlY29kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzgyY2VkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Bhc3N3b3JkRW5jb2RlckRlY29kZXIuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCisgKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKKworcHVibGljIGNsYXNzIFBhc3N3b3JkRW5jb2RlckRlY29kZXIgZXh0ZW5kcyBFbmNvZGVyRGVjb2RlckFkYXB0ZXIgaW1wbGVtZW50cyBFbmNvZGVyRGVjb2RlciB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZID0gInBhc3N3b3JkLXNlY3VyaXR5LWNvZGVyIjsgLy8kTk9OLU5MUy0xJAorCisJcHVibGljIFBhc3N3b3JkRW5jb2RlckRlY29kZXIoKSB7CisJfQorCisJcHVibGljIFN0cmluZyBkZWNvZGUoU3RyaW5nIHMpIHsKKwkJcmV0dXJuIFBhc3N3b3JkVXRpbC5wYXNzd29yZERlY29kZShzKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGVuY29kZShTdHJpbmcgcykgeworCQlyZXR1cm4gUGFzc3dvcmRVdGlsLnBhc3N3b3JkRW5jb2RlKHMpOworCX0KKworCXB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgeworCQlyZXR1cm4gS0VZOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUGFzc3dvcmRVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUGFzc3dvcmRVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEyZjJjMgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9QYXNzd29yZFV0aWwuamF2YQpAQCAtMCwwICsxLDMzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQorICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7CisKKworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIFBhc3N3b3JkVXRpbCB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HX0NPTlZFUlNJT05fQ09ERSA9ICJVVEY4IjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gRU1QVFlfQllURV9BUlJBWSA9IG5ldyBieXRlWzBdOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ1JZUFRPX0FMR09SSVRITTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQUE9SVEVEX0NSWVBUT19BTEdPUklUSE1TW107CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBCQVNFNjRfRU5DT0RFX01BUFtdOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgQkFTRTY0X0RFQ09ERV9NQVBbXTsKKworCXB1YmxpYyBQYXNzd29yZFV0aWwoKSB7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZGVjb2RlKFN0cmluZyBzKSB0aHJvd3MgSW52YWxpZFBhc3N3b3JkRGVjb2RpbmdFeGNlcHRpb24sIFVuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uIHsKKwkJaWYgKHMgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBJbnZhbGlkUGFzc3dvcmREZWNvZGluZ0V4Y2VwdGlvbigpOworCQlTdHJpbmcgczEgPSBnZXRDcnlwdG9BbGdvcml0aG0ocyk7CisJCWlmIChzMSA9PSBudWxsKQorCQkJdGhyb3cgbmV3IEludmFsaWRQYXNzd29yZERlY29kaW5nRXhjZXB0aW9uKCk7CisKKwkJaWYgKCFpc1ZhbGlkQ3J5cHRvQWxnb3JpdGhtKHMxKSkKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZENyeXB0b0FsZ29yaXRobUV4Y2VwdGlvbigpOworCisJCVN0cmluZyBzMiA9IGRlY29kZV9wYXNzd29yZChyZW1vdmVDcnlwdG9BbGdvcml0aG1UYWcocyksIHMxKTsKKwkJaWYgKHMyID09IG51bGwpCisJCQl0aHJvdyBuZXcgSW52YWxpZFBhc3N3b3JkRGVjb2RpbmdFeGNlcHRpb24oKTsKKwkJcmV0dXJuIHMyOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZShTdHJpbmcgcykgdGhyb3dzIEludmFsaWRQYXNzd29yZEVuY29kaW5nRXhjZXB0aW9uLCBVbnN1cHBvcnRlZENyeXB0b0FsZ29yaXRobUV4Y2VwdGlvbiB7CisJCXJldHVybiBlbmNvZGUocywgREVGQVVMVF9DUllQVE9fQUxHT1JJVEhNKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGUoU3RyaW5nIHMsIFN0cmluZyBzMSkgdGhyb3dzIEludmFsaWRQYXNzd29yZEVuY29kaW5nRXhjZXB0aW9uLCBVbnN1cHBvcnRlZENyeXB0b0FsZ29yaXRobUV4Y2VwdGlvbiB7CisJCWlmICghaXNWYWxpZENyeXB0b0FsZ29yaXRobShzMSkpCisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRDcnlwdG9BbGdvcml0aG1FeGNlcHRpb24oKTsKKwkJaWYgKHMgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBJbnZhbGlkUGFzc3dvcmRFbmNvZGluZ0V4Y2VwdGlvbigpOworCisJCWlmIChnZXRDcnlwdG9BbGdvcml0aG0ocykgIT0gbnVsbCkKKwkJCXRocm93IG5ldyBJbnZhbGlkUGFzc3dvcmRFbmNvZGluZ0V4Y2VwdGlvbigpOworCisJCVN0cmluZyBzMiA9IGVuY29kZV9wYXNzd29yZChzLnRyaW0oKSwgczEudHJpbSgpKTsKKwkJaWYgKHMyID09IG51bGwpCisJCQl0aHJvdyBuZXcgSW52YWxpZFBhc3N3b3JkRW5jb2RpbmdFeGNlcHRpb24oKTsKKwkJcmV0dXJuIHMyOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENyeXB0b0FsZ29yaXRobShTdHJpbmcgcykgeworCQlTdHJpbmcgczEgPSBudWxsOworCQlpZiAocyAhPSBudWxsKSB7CisJCQlzID0gcy50cmltKCk7CisJCQlpZiAocy5sZW5ndGgoKSA+PSAyKSB7CisJCQkJaW50IGkgPSBzLmluZGV4T2YoInsiKTsgLy8kTk9OLU5MUy0xJAorCQkJCWlmIChpID09IDApIHsKKwkJCQkJaW50IGogPSBzLmluZGV4T2YoIn0iLCArK2kpOyAvLyROT04tTkxTLTEkCisJCQkJCWlmIChqID4gMCkKKwkJCQkJCWlmIChpIDwgaikKKwkJCQkJCQlzMSA9IHMuc3Vic3RyaW5nKGksIGopLnRyaW0oKTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlzMSA9IEVNUFRZX1NUUklORzsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHMxOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENyeXB0b0FsZ29yaXRobVRhZyhTdHJpbmcgcykgeworCQlTdHJpbmcgczEgPSBudWxsOworCQlTdHJpbmcgczIgPSBnZXRDcnlwdG9BbGdvcml0aG0ocyk7CisJCWlmIChzMiAhPSBudWxsKSB7CisJCQlTdHJpbmdCdWZmZXIgc3RyaW5nYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigieyIpOyAvLyROT04tTkxTLTEkCisJCQlpZiAoczIubGVuZ3RoKCkgPiAwKQorCQkJCXN0cmluZ2J1ZmZlci5hcHBlbmQoczIpOworCQkJc3RyaW5nYnVmZmVyLmFwcGVuZCgifSIpOyAvLyROT04tTkxTLTEkCisJCQlzMSA9IHN0cmluZ2J1ZmZlci50b1N0cmluZygpOworCQl9CisJCXJldHVybiBzMTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZENyeXB0b0FsZ29yaXRobShTdHJpbmcgcykgeworCQlpZiAocyAhPSBudWxsKSB7CisJCQlzID0gcy50cmltKCk7CisJCQlpZiAocy5sZW5ndGgoKSA9PSAwKQorCQkJCXJldHVybiB0cnVlOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBTVVBQT1JURURfQ1JZUFRPX0FMR09SSVRITVMubGVuZ3RoOyBpKyspCisJCQkJaWYgKHMuZXF1YWxzSWdub3JlQ2FzZShTVVBQT1JURURfQ1JZUFRPX0FMR09SSVRITVNbaV0pKQorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRDcnlwdG9BbGdvcml0aG1UYWcoU3RyaW5nIHMpIHsKKwkJcmV0dXJuIGlzVmFsaWRDcnlwdG9BbGdvcml0aG0oZ2V0Q3J5cHRvQWxnb3JpdGhtKHMpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBwYXNzd29yZERlY29kZShTdHJpbmcgcykgeworCQlpZiAocyA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCVN0cmluZyBzMSA9IGdldENyeXB0b0FsZ29yaXRobShzKTsKKwkJaWYgKHMxID09IG51bGwpCisJCQlyZXR1cm4gczsKKwkJaWYgKCFpc1ZhbGlkQ3J5cHRvQWxnb3JpdGhtKHMxKSkKKwkJCXJldHVybiBudWxsOworCQlyZXR1cm4gZGVjb2RlX3Bhc3N3b3JkKHJlbW92ZUNyeXB0b0FsZ29yaXRobVRhZyhzKSwgczEpOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhc3N3b3JkRW5jb2RlKFN0cmluZyBzKSB7CisJCXJldHVybiBwYXNzd29yZEVuY29kZShzLCBERUZBVUxUX0NSWVBUT19BTEdPUklUSE0pOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhc3N3b3JkRW5jb2RlKFN0cmluZyBzLCBTdHJpbmcgczEpIHsKKwkJaWYgKCFpc1ZhbGlkQ3J5cHRvQWxnb3JpdGhtKHMxKSkKKwkJCXJldHVybiBudWxsOworCQlpZiAocyA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCVN0cmluZyBzMiA9IGdldENyeXB0b0FsZ29yaXRobShzKTsKKwkJaWYgKHMyICE9IG51bGwpIHsKKwkJCWlmIChzMi5lcXVhbHNJZ25vcmVDYXNlKHMxLnRyaW0oKSkpCisJCQkJcmV0dXJuIHMudHJpbSgpOworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIGVuY29kZV9wYXNzd29yZChzLnRyaW0oKSwgczEudHJpbSgpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVDcnlwdG9BbGdvcml0aG1UYWcoU3RyaW5nIHMpIHsKKwkJU3RyaW5nIHMxID0gbnVsbDsKKwkJaWYgKHMgIT0gbnVsbCkgeworCQkJcyA9IHMudHJpbSgpOworCQkJaWYgKHMubGVuZ3RoKCkgPj0gMikgeworCQkJCWludCBpID0gcy5pbmRleE9mKCJ7Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQlpZiAoaSA9PSAwKSB7CisJCQkJCWludCBqID0gcy5pbmRleE9mKCJ9IiwgKytpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlpZiAoaiA+IDApCisJCQkJCQlpZiAoKytqIDwgcy5sZW5ndGgoKSkKKwkJCQkJCQlzMSA9IHMuc3Vic3RyaW5nKGopLnRyaW0oKTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlzMSA9IEVNUFRZX1NUUklORzsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHMxOworCX0KKworCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBjb252ZXJ0X3RvX2J5dGVzKFN0cmluZyBzKSB7CisJCWJ5dGUgYWJ5dGUwW10gPSBudWxsOworCQlpZiAocyAhPSBudWxsKQorCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkKKwkJCQlhYnl0ZTAgPSBFTVBUWV9CWVRFX0FSUkFZOworCQkJZWxzZQorCQkJCXRyeSB7CisJCQkJCWFieXRlMCA9IHMuZ2V0Qnl0ZXMoU1RSSU5HX0NPTlZFUlNJT05fQ09ERSk7CisJCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1bnN1cHBvcnRlZGVuY29kaW5nZXhjZXB0aW9uKSB7CisJCQkJCWFieXRlMCA9IG51bGw7CisJCQkJfQorCQlyZXR1cm4gYWJ5dGUwOworCX0KKworCXByaXZhdGUgc3RhdGljIFN0cmluZyBjb252ZXJ0X3RvX3N0cmluZyhieXRlIGFieXRlMFtdKSB7CisJCVN0cmluZyBzID0gbnVsbDsKKwkJaWYgKGFieXRlMCAhPSBudWxsKQorCQkJaWYgKGFieXRlMC5sZW5ndGggPT0gMCkKKwkJCQlzID0gRU1QVFlfU1RSSU5HOworCQkJZWxzZQorCQkJCXRyeSB7CisJCQkJCXMgPSBuZXcgU3RyaW5nKGFieXRlMCwgU1RSSU5HX0NPTlZFUlNJT05fQ09ERSk7CisJCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1bnN1cHBvcnRlZGVuY29kaW5nZXhjZXB0aW9uKSB7CisJCQkJCXMgPSBudWxsOworCQkJCX0KKwkJcmV0dXJuIHM7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGNvbnZlcnRfdmlld2FibGVfdG9fYnl0ZXMoU3RyaW5nIHMpIHsKKwkJYnl0ZSBhYnl0ZTBbXSA9IG51bGw7CisJCWlmIChzICE9IG51bGwpCisJCQlpZiAocy5sZW5ndGgoKSA9PSAwKQorCQkJCWFieXRlMCA9IEVNUFRZX0JZVEVfQVJSQVk7CisJCQllbHNlCisJCQkJdHJ5IHsKKwkJCQkJYWJ5dGUwID0gYmFzZTY0RGVjb2RlKGNvbnZlcnRfdG9fYnl0ZXMocykpOworCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJYWJ5dGUwID0gbnVsbDsKKwkJCQl9CisJCXJldHVybiBhYnl0ZTA7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGJhc2U2NERlY29kZShieXRlIGFieXRlMFtdKSB7CisJCWludCBpOworCQlmb3IgKGkgPSBhYnl0ZTAubGVuZ3RoOyBhYnl0ZTBbLS1pXSA9PSA2MTspOworCQlieXRlIGFieXRlMVtdID0gbmV3IGJ5dGVbKGkgKyAxKSAtIGFieXRlMC5sZW5ndGggLyA0XTsKKwkJZm9yIChpbnQgaiA9IDA7IGogPCBhYnl0ZTAubGVuZ3RoOyBqKyspCisJCQlhYnl0ZTBbal0gPSBCQVNFNjRfREVDT0RFX01BUFthYnl0ZTBbal1dOworCQlpbnQgayA9IGFieXRlMS5sZW5ndGggLSAyOworCQlpbnQgbCA9IDA7CisJCWludCBpMTsKKwkJZm9yIChpMSA9IDA7IGwgPCBrOyBpMSArPSA0KSB7CisJCQlhYnl0ZTFbbF0gPSAoYnl0ZSkgKGFieXRlMFtpMV0gPDwgMiAmIDB4ZmYgfCBhYnl0ZTBbaTEgKyAxXSA+Pj4gNCAmIDB4Myk7CisJCQlhYnl0ZTFbbCArIDFdID0gKGJ5dGUpIChhYnl0ZTBbaTEgKyAxXSA8PCA0ICYgMHhmZiB8IGFieXRlMFtpMSArIDJdID4+PiAyICYgMHhmKTsKKwkJCWFieXRlMVtsICsgMl0gPSAoYnl0ZSkgKGFieXRlMFtpMSArIDJdIDw8IDYgJiAweGZmIHwgYWJ5dGUwW2kxICsgM10gJiAweDNmKTsKKwkJCWwgKz0gMzsKKwkJfQorCQlpZiAobCA8IGFieXRlMS5sZW5ndGgpIHsKKwkJCWFieXRlMVtsKytdID0gKGJ5dGUpIChhYnl0ZTBbaTFdIDw8IDIgJiAweGZmIHwgYWJ5dGUwW2kxICsgMV0gPj4+IDQgJiAweDMpOworCQkJaWYgKGwgPCBhYnl0ZTEubGVuZ3RoKQorCQkJCWFieXRlMVtsXSA9IChieXRlKSAoYWJ5dGUwW2kxICsgMV0gPDwgNCAmIDB4ZmYgfCBhYnl0ZTBbaTEgKyAyXSA+Pj4gMiAmIDB4Zik7CisJCX0KKwkJcmV0dXJuIGFieXRlMTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY29udmVydF92aWV3YWJsZV90b19zdHJpbmcoYnl0ZSBhYnl0ZTBbXSkgeworCQlTdHJpbmcgcyA9IG51bGw7CisJCWlmIChhYnl0ZTAgIT0gbnVsbCkKKwkJCWlmIChhYnl0ZTAubGVuZ3RoID09IDApCisJCQkJcyA9IEVNUFRZX1NUUklORzsKKwkJCWVsc2UKKwkJCQl0cnkgeworCQkJCQlzID0gY29udmVydF90b19zdHJpbmcoYmFzZTY0RW5jb2RlKGFieXRlMCkpOworCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQkJcyA9IG51bGw7CisJCQkJfQorCQlyZXR1cm4gczsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBieXRlW10gYmFzZTY0RW5jb2RlKGJ5dGUgYWJ5dGUwW10pIHsKKwkJYnl0ZSBhYnl0ZTFbXSA9IG5ldyBieXRlWygoYWJ5dGUwLmxlbmd0aCArIDIpIC8gMykgKiA0XTsKKwkJaW50IGkgPSAwOworCQlpbnQgaiA9IDA7CisJCWZvciAoOyBpIDwgYWJ5dGUwLmxlbmd0aCAtIDI7IGkgKz0gMykgeworCQkJYWJ5dGUxW2orK10gPSBCQVNFNjRfRU5DT0RFX01BUFthYnl0ZTBbaV0gPj4+IDIgJiAweDNmXTsKKwkJCWFieXRlMVtqKytdID0gQkFTRTY0X0VOQ09ERV9NQVBbYWJ5dGUwW2kgKyAxXSA+Pj4gNCAmIDB4ZiB8IGFieXRlMFtpXSA8PCA0ICYgMHgzZl07CisJCQlhYnl0ZTFbaisrXSA9IEJBU0U2NF9FTkNPREVfTUFQW2FieXRlMFtpICsgMl0gPj4+IDYgJiAweDMgfCBhYnl0ZTBbaSArIDFdIDw8IDIgJiAweDNmXTsKKwkJCWFieXRlMVtqKytdID0gQkFTRTY0X0VOQ09ERV9NQVBbYWJ5dGUwW2kgKyAyXSAmIDB4M2ZdOworCQl9CisJCWlmIChpIDwgYWJ5dGUwLmxlbmd0aCkgeworCQkJYWJ5dGUxW2orK10gPSBCQVNFNjRfRU5DT0RFX01BUFthYnl0ZTBbaV0gPj4+IDIgJiAweDNmXTsKKwkJCWlmIChpIDwgYWJ5dGUwLmxlbmd0aCAtIDEpIHsKKwkJCQlhYnl0ZTFbaisrXSA9IEJBU0U2NF9FTkNPREVfTUFQW2FieXRlMFtpICsgMV0gPj4+IDQgJiAweGYgfCBhYnl0ZTBbaV0gPDwgNCAmIDB4M2ZdOworCQkJCWFieXRlMVtqKytdID0gQkFTRTY0X0VOQ09ERV9NQVBbYWJ5dGUwW2kgKyAxXSA8PCAyICYgMHgzZl07CisJCQl9IGVsc2UgeworCQkJCWFieXRlMVtqKytdID0gQkFTRTY0X0VOQ09ERV9NQVBbYWJ5dGUwW2ldIDw8IDQgJiAweDNmXTsKKwkJCX0KKwkJfQorCQlmb3IgKDsgaiA8IGFieXRlMS5sZW5ndGg7IGorKykKKwkJCWFieXRlMVtqXSA9IDYxOworCQlyZXR1cm4gYWJ5dGUxOworCX0KKworCXByaXZhdGUgc3RhdGljIFN0cmluZyBkZWNvZGVfcGFzc3dvcmQoU3RyaW5nIHMsIFN0cmluZyBzMSkgeworCQlTdHJpbmdCdWZmZXIgc3RyaW5nYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlpZiAoczEubGVuZ3RoKCkgPT0gMCkgeworCQkJc3RyaW5nYnVmZmVyLmFwcGVuZChzKTsKKwkJfSBlbHNlIHsKKwkJCVN0cmluZyBzMiA9IG51bGw7CisJCQlpZiAocy5sZW5ndGgoKSA+IDApIHsKKwkJCQlieXRlIGFieXRlMFtdID0gY29udmVydF92aWV3YWJsZV90b19ieXRlcyhzKTsKKwkJCQlpZiAoYWJ5dGUwID09IG51bGwpCisJCQkJCXJldHVybiBudWxsOworCQkJCWlmIChhYnl0ZTAubGVuZ3RoID4gMCkgeworCQkJCQlieXRlIGFieXRlMVtdID0gbnVsbDsKKwkJCQkJdHJ5IHsKKwkJCQkJCWFieXRlMSA9IFBhc3N3b3JkQ2lwaGVyVXRpbC5kZWNpcGhlcihhYnl0ZTAsIHMxKTsKKwkJCQkJfSBjYXRjaCAoSW52YWxpZFBhc3N3b3JkQ2lwaGVyRXhjZXB0aW9uIGludmFsaWRwYXNzd29yZGNpcGhlcmV4Y2VwdGlvbikgeworCQkJCQkJcmV0dXJuIG51bGw7CisJCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uIHVuc3VwcG9ydGVkY3J5cHRvYWxnb3JpdGhtZXhjZXB0aW9uKSB7CisJCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQkJfQorCQkJCQlpZiAoYWJ5dGUxICE9IG51bGwgJiYgYWJ5dGUxLmxlbmd0aCA+IDApCisJCQkJCQlzMiA9IGNvbnZlcnRfdG9fc3RyaW5nKGFieXRlMSk7CisJCQkJfQorCQkJfQorCQkJaWYgKHMyICE9IG51bGwgJiYgczIubGVuZ3RoKCkgPiAwKQorCQkJCXN0cmluZ2J1ZmZlci5hcHBlbmQoczIpOworCQl9CisJCXJldHVybiBzdHJpbmdidWZmZXIudG9TdHJpbmcoKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZW5jb2RlX3Bhc3N3b3JkKFN0cmluZyBzLCBTdHJpbmcgczEpIHsKKwkJU3RyaW5nQnVmZmVyIHN0cmluZ2J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoInsiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAoczEubGVuZ3RoKCkgPT0gMCkgeworCQkJc3RyaW5nYnVmZmVyLmFwcGVuZCgifSIpLmFwcGVuZChzKTsgLy8kTk9OLU5MUy0xJAorCQl9IGVsc2UgeworCQkJc3RyaW5nYnVmZmVyLmFwcGVuZChzMSkuYXBwZW5kKCJ9Iik7IC8vJE5PTi1OTFMtMSQKKwkJCVN0cmluZyBzMiA9IG51bGw7CisJCQlpZiAocy5sZW5ndGgoKSA+IDApIHsKKwkJCQlieXRlIGFieXRlMFtdID0gY29udmVydF90b19ieXRlcyhzKTsKKwkJCQlpZiAoYWJ5dGUwLmxlbmd0aCA+IDApIHsKKwkJCQkJYnl0ZSBhYnl0ZTFbXSA9IG51bGw7CisJCQkJCXRyeSB7CisJCQkJCQlhYnl0ZTEgPSBQYXNzd29yZENpcGhlclV0aWwuZW5jaXBoZXIoYWJ5dGUwLCBzMSk7CisJCQkJCX0gY2F0Y2ggKEludmFsaWRQYXNzd29yZENpcGhlckV4Y2VwdGlvbiBpbnZhbGlkcGFzc3dvcmRjaXBoZXJleGNlcHRpb24pIHsKKwkJCQkJCXJldHVybiBudWxsOworCQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZENyeXB0b0FsZ29yaXRobUV4Y2VwdGlvbiB1bnN1cHBvcnRlZGNyeXB0b2FsZ29yaXRobWV4Y2VwdGlvbikgeworCQkJCQkJcmV0dXJuIG51bGw7CisJCQkJCX0KKwkJCQkJaWYgKGFieXRlMSAhPSBudWxsICYmIGFieXRlMS5sZW5ndGggPiAwKSB7CisJCQkJCQlzMiA9IGNvbnZlcnRfdmlld2FibGVfdG9fc3RyaW5nKGFieXRlMSk7CisJCQkJCQlpZiAoczIgPT0gbnVsbCkKKwkJCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmIChzMiAhPSBudWxsICYmIHMyLmxlbmd0aCgpID4gMCkKKwkJCQlzdHJpbmdidWZmZXIuYXBwZW5kKHMyKTsKKwkJfQorCQlyZXR1cm4gc3RyaW5nYnVmZmVyLnRvU3RyaW5nKCk7CisJfQorCisJc3RhdGljIHsKKwkJU1VQUE9SVEVEX0NSWVBUT19BTEdPUklUSE1TID0gUGFzc3dvcmRDaXBoZXJVdGlsLmdldFN1cHBvcnRlZENyeXB0b0FsZ29yaXRobXMoKTsKKwkJREVGQVVMVF9DUllQVE9fQUxHT1JJVEhNID0gU1VQUE9SVEVEX0NSWVBUT19BTEdPUklUSE1TWzBdOworCQlieXRlIGFieXRlMFtdID0gezY1LCA2NiwgNjcsIDY4LCA2OSwgNzAsIDcxLCA3MiwgNzMsIDc0LCA3NSwgNzYsIDc3LCA3OCwgNzksIDgwLCA4MSwgODIsIDgzLCA4NCwgODUsIDg2LCA4NywgODgsIDg5LCA5MCwgOTcsIDk4LCA5OSwgMTAwLCAxMDEsIDEwMiwgMTAzLCAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwgMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDQ4LCA0OSwgNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA0MywgNDd9OworCQlCQVNFNjRfRU5DT0RFX01BUCA9IGFieXRlMDsKKwkJQkFTRTY0X0RFQ09ERV9NQVAgPSBuZXcgYnl0ZVsxMjhdOworCQlmb3IgKGludCBpID0gMDsgaSA8IEJBU0U2NF9ERUNPREVfTUFQLmxlbmd0aDsgaSsrKQorCQkJQkFTRTY0X0RFQ09ERV9NQVBbaV0gPSAtMTsKKwkJZm9yIChpbnQgaiA9IDA7IGogPCBCQVNFNjRfRU5DT0RFX01BUC5sZW5ndGg7IGorKykKKwkJCUJBU0U2NF9ERUNPREVfTUFQW0JBU0U2NF9FTkNPREVfTUFQW2pdXSA9IChieXRlKSBqOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUGxlYXNlTWlncmF0ZVlvdXJDb2RlRXJyb3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9QbGVhc2VNaWdyYXRlWW91ckNvZGVFcnJvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNTQ4ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUGxlYXNlTWlncmF0ZVlvdXJDb2RlRXJyb3IuamF2YQpAQCAtMCwwICsxLDI1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7CisKKworCisvKioKKyAqIEBhdXRob3IgbWRlbGRlcgorICogIAorICovCitwdWJsaWMgY2xhc3MgUGxlYXNlTWlncmF0ZVlvdXJDb2RlRXJyb3IgZXh0ZW5kcyBFcnJvciB7CisKKwkvL1RPRE8gRGVsZXRlIG1lCisJcHVibGljIFBsZWFzZU1pZ3JhdGVZb3VyQ29kZUVycm9yKCkgeworCQlzdXBlcihXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5QbGVhc2VNaWdyYXRlWW91ckNvZGVFcnJvcl9FUlJPUl8wKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUmVzb3VyY2VEZXBlbmRlbmN5UmVnaXN0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9SZXNvdXJjZURlcGVuZGVuY3lSZWdpc3Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZmY2NDMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUmVzb3VyY2VEZXBlbmRlbmN5UmVnaXN0ZXIuamF2YQpAQCAtMCwwICsxLDIxMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQorICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7CisKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXI7CisKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZURlcGVuZGVuY3lSZWdpc3RlciB7CisJcHJvdGVjdGVkIHN0YXRpYyBNYXAgR0xPQkFMX0RFUEVOREVOQ0lFUyA9IG5ldyBIYXNoTWFwKCk7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFJFU09VUkNFX0RFUEVOREVOQ1lfVFlQRSA9ICJSZXNvdXJjZURlcGVuZGVuY3lBZGFwdGVyIjsgLy8kTk9OLU5MUy0xJAorCXByb3RlY3RlZCBNYXAgbG9jYWxEZXBlbmRlbmNpZXMgPSBuZXcgSGFzaE1hcCgpOworCisJY2xhc3MgUmVzb3VyY2VEZXBlbmRlbmN5QWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKKwkJUmVzb3VyY2UgZGVwZW5kZW50UmVzb3VyY2U7CisKKwkJUmVzb3VyY2VEZXBlbmRlbmN5QWRhcHRlcihSZXNvdXJjZSBhRGVwZW5kZW50UmVzb3VyY2UpIHsKKwkJCWRlcGVuZGVudFJlc291cmNlID0gYURlcGVuZGVudFJlc291cmNlOworCQkJZGVwZW5kZW50UmVzb3VyY2UuZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOworCQl9CisKKwkJLyoKKwkJICogKG5vbi1KYXZhZG9jKQorCQkgKiAKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI2lzQWRhcHRlckZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKKwkJICovCisJCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKKwkJCXJldHVybiBSRVNPVVJDRV9ERVBFTkRFTkNZX1RZUEUuZXF1YWxzKHR5cGUpOworCQl9CisKKwkJLyoKKwkJICogKG5vbi1KYXZhZG9jKQorCQkgKiAKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQorCQkgKi8KKwkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7CisJCQkvL0xpc3RlbiBmb3IgdW5sb2FkcyBhbmQgcmVtb3ZlcworCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKG51bGwpKSB7CisJCQkJY2FzZSBSZXNvdXJjZS5SRVNPVVJDRV9fSVNfTE9BREVEIDoKKwkJCQkJaWYgKG1zZy5nZXROb3RpZmllcigpICE9IGRlcGVuZGVudFJlc291cmNlICYmIG1zZy5nZXRPbGRCb29sZWFuVmFsdWUoKSAmJiAhbXNnLmdldE5ld0Jvb2xlYW5WYWx1ZSgpKQorCQkJCQkJZGVwZW5kZW50UmVzb3VyY2UudW5sb2FkKCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX1JFU09VUkNFX1NFVCA6CisJCQkJCWlmIChtc2cuZ2V0T2xkVmFsdWUoKSAhPSBudWxsICYmIG1zZy5nZXROZXdWYWx1ZSgpID09IG51bGwpIHsKKwkJCQkJCWlmIChtc2cuZ2V0Tm90aWZpZXIoKSA9PSBkZXBlbmRlbnRSZXNvdXJjZSkKKwkJCQkJCQkoKFJlc291cmNlKSBnZXRUYXJnZXQoKSkuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOworCQkJCQkJZWxzZSB7CisJCQkJCQkJUmVzb3VyY2VTZXQgc2V0ID0gZGVwZW5kZW50UmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKTsKKwkJCQkJCQlpZiAoc2V0ICE9IG51bGwpCisJCQkJCQkJCXNldC5nZXRSZXNvdXJjZXMoKS5yZW1vdmUoZGVwZW5kZW50UmVzb3VyY2UpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJY2xhc3MgUmVzb3VyY2VTZXRMaXN0ZW5lciBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKKwkJLyoKKwkJICogKG5vbi1KYXZhZG9jKQorCQkgKiAKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQorCQkgKi8KKwkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7CisJCQlpZiAobXNnLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5BREQpCisJCQkJcHJvY2Nlc3NBZGRlZFJlc291cmNlKChSZXNvdXJjZVNldCkgbXNnLmdldE5vdGlmaWVyKCksIChSZXNvdXJjZSkgbXNnLmdldE5ld1ZhbHVlKCkpOworCQl9CisJfQorCisJLyoqCisJICogUmVnaXN0ZXIgYSBkZXBlbmRlbmN5IGJldHdlZW4gdHdvIFVSSXMuIFRoZSBmaXJzdCBwYXJhbWV0ZXIsIGFVUklTdHJpbmcsIGlzIHRoZSBvbmUgdGhhdAorCSAqIGRlcGVuZGVudFVyaVN0cmluZyBkZXBlbmRzIG9uLgorCSAqIAorCSAqIEBwYXJhbSBhVXJpU3RyaW5nCisJICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCisJICogQHBhcmFtIGRlcGVuZGVudFVyaVN0cmluZworCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZworCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlckRlcGVuZGVuY3koVVJJIHRhcmdldFVSSSwgVVJJIGRlcGVuZGVudFVSSSkgeworCQlpZiAodGFyZ2V0VVJJICE9IG51bGwgJiYgZGVwZW5kZW50VVJJICE9IG51bGwpIHsKKwkJCUdMT0JBTF9ERVBFTkRFTkNJRVMucHV0KGRlcGVuZGVudFVSSSwgdGFyZ2V0VVJJKTsKKwkJfQorCX0KKworCXB1YmxpYyBSZXNvdXJjZURlcGVuZGVuY3lSZWdpc3RlcihSZXNvdXJjZVNldCBhUmVzb3VyY2VTZXQpIHsKKwkJaW5pdGlhbGl6ZShhUmVzb3VyY2VTZXQpOworCX0KKworCisJUmVzb3VyY2VEZXBlbmRlbmN5UmVnaXN0ZXIoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogQHBhcmFtIGFSZXNvdXJjZVNldAorCSAqLworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoUmVzb3VyY2VTZXQgYVJlc291cmNlU2V0KSB7CisJCWlmIChhUmVzb3VyY2VTZXQgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiVGhlIFJlc291cmNlU2V0IGNhbm5vdCBiZSBudWxsLiIpOyAvLyROT04tTkxTLTEkCisJCWluaXRpYWxpemVMb2NhbERlcGVuZGVuY2llcyhhUmVzb3VyY2VTZXQpOworCQlzZXR1cERlcGVuZGVuY3lBZGFwdGVycyhhUmVzb3VyY2VTZXQpOworCQlzZXR1cFJlc291cmNlU2V0TGlzdGVuZXIoYVJlc291cmNlU2V0KTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gYVJlc291cmNlU2V0CisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0dXBSZXNvdXJjZVNldExpc3RlbmVyKFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCkgeworCQlhUmVzb3VyY2VTZXQuZUFkYXB0ZXJzKCkuYWRkKG5ldyBSZXNvdXJjZVNldExpc3RlbmVyKCkpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBhUmVzb3VyY2VTZXQKKwkgKiBAcmV0dXJuCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0dXBEZXBlbmRlbmN5QWRhcHRlcnMoUmVzb3VyY2VTZXQgYVJlc291cmNlU2V0KSB7CisJCWlmICghYVJlc291cmNlU2V0LmdldFJlc291cmNlcygpLmlzRW1wdHkoKSkgeworCQkJSXRlcmF0b3IgaXQgPSBsb2NhbERlcGVuZGVuY2llcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisJCQlNYXAuRW50cnkgZW50cnk7CisJCQlVUkkgZGVwZW5kZW50VVJJLCB0YXJnZXRVUkk7CisJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisJCQkJZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7CisJCQkJZGVwZW5kZW50VVJJID0gKFVSSSkgZW50cnkuZ2V0S2V5KCk7CisJCQkJdGFyZ2V0VVJJID0gKFVSSSkgZW50cnkuZ2V0VmFsdWUoKTsKKwkJCQlzZXR1cERlcGVuZGVuY3lBZGFwdGVyKGFSZXNvdXJjZVNldCwgZGVwZW5kZW50VVJJLCB0YXJnZXRVUkkpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogQHBhcmFtIGFSZXNvdXJjZVNldAorCSAqIEBwYXJhbSBkZXBlbmRlbnRVUkkKKwkgKiBAcGFyYW0gdGFyZ2V0VVJJCisJICogQHJldHVybgorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldHVwRGVwZW5kZW5jeUFkYXB0ZXIoUmVzb3VyY2VTZXQgYVJlc291cmNlU2V0LCBVUkkgZGVwZW5kZW50VVJJLCBVUkkgdGFyZ2V0VVJJKSB7CisJCVJlc291cmNlIGRlcGVuZGVudCA9IGFSZXNvdXJjZVNldC5nZXRSZXNvdXJjZShkZXBlbmRlbnRVUkksIGZhbHNlKTsKKwkJaWYgKGRlcGVuZGVudCAhPSBudWxsKQorCQkJc2V0dXBEZXBlbmRlbmN5QWRhcHRlcihkZXBlbmRlbnQsIHRhcmdldFVSSSwgYVJlc291cmNlU2V0KTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXR1cERlcGVuZGVuY3lBZGFwdGVyKFJlc291cmNlIGRlcGVuZGVudCwgVVJJIHRhcmdldFVSSSwgUmVzb3VyY2VTZXQgYVJlc291cmNlU2V0KSB7CisJCVJlc291cmNlIHRhcmdldCA9IGFSZXNvdXJjZVNldC5nZXRSZXNvdXJjZSh0YXJnZXRVUkksIGZhbHNlKTsKKwkJaWYgKHRhcmdldCA9PSBudWxsKQorCQkJdGFyZ2V0ID0gYVJlc291cmNlU2V0LmNyZWF0ZVJlc291cmNlKHRhcmdldFVSSSk7CisJCXRhcmdldC5lQWRhcHRlcnMoKS5hZGQobmV3IFJlc291cmNlRGVwZW5kZW5jeUFkYXB0ZXIoZGVwZW5kZW50KSk7CisJfQorCisJLyoqCisJICogQHBhcmFtIGFSZXNvdXJjZVNldAorCSAqLworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMb2NhbERlcGVuZGVuY2llcyhSZXNvdXJjZVNldCBhUmVzb3VyY2VTZXQpIHsKKwkJVVJJQ29udmVydGVyIGNvbnZlcnRlciA9IGFSZXNvdXJjZVNldC5nZXRVUklDb252ZXJ0ZXIoKTsKKwkJaW5pdGlhbGl6ZUxvY2FsRGVwZW5kZW5jaWVzKGNvbnZlcnRlcik7CisJfQorCisJLyoqCisJICogQHBhcmFtIGFSZXNvdXJjZVNldAorCSAqLworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMb2NhbERlcGVuZGVuY2llcyhVUklDb252ZXJ0ZXIgYUNvbnZlcnRlcikgeworCQlJdGVyYXRvciBpdCA9IEdMT0JBTF9ERVBFTkRFTkNJRVMuZW50cnlTZXQoKS5pdGVyYXRvcigpOworCQlNYXAgcmVzb2x2ZWQgPSBuZXcgSGFzaE1hcCgpOworCQlNYXAuRW50cnkgZW50cnk7CisJCVVSSSBrZXksIHZhbHVlOworCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisJCQllbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKKwkJCWtleSA9IChVUkkpIGVudHJ5LmdldEtleSgpOworCQkJdmFsdWUgPSAoVVJJKSBlbnRyeS5nZXRWYWx1ZSgpOworCQkJa2V5ID0gbm9ybWFsaXplKGtleSwgYUNvbnZlcnRlciwgcmVzb2x2ZWQpOworCQkJdmFsdWUgPSBub3JtYWxpemUodmFsdWUsIGFDb252ZXJ0ZXIsIHJlc29sdmVkKTsKKwkJCWxvY2FsRGVwZW5kZW5jaWVzLnB1dChrZXksIHZhbHVlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEBwYXJhbSByZWxhdGl2ZVVSSQorCSAqIEBwYXJhbSBjb252ZXJ0ZXIKKwkgKiBAcGFyYW0gcmVzb2x2ZWQKKwkgKiBAcmV0dXJuCisJICovCisJcHJvdGVjdGVkIFVSSSBub3JtYWxpemUoVVJJIHJlbGF0aXZlVVJJLCBVUklDb252ZXJ0ZXIgY29udmVydGVyLCBNYXAgcmVzb2x2ZWQpIHsKKwkJVVJJIHJlc3VsdCA9IChVUkkpIHJlc29sdmVkLmdldChyZWxhdGl2ZVVSSSk7CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgeworCQkJcmVzdWx0ID0gY29udmVydGVyLm5vcm1hbGl6ZShyZWxhdGl2ZVVSSSk7CisJCQlyZXNvbHZlZC5wdXQocmVsYXRpdmVVUkksIHJlc3VsdCk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gc2V0CisJICogQHBhcmFtIHJlc291cmNlCisJICovCisJcHJvdGVjdGVkIHZvaWQgcHJvY2Nlc3NBZGRlZFJlc291cmNlKFJlc291cmNlU2V0IHNldCwgUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkJVVJJIHRhcmdldFVSSSA9IChVUkkpIGxvY2FsRGVwZW5kZW5jaWVzLmdldChyZXNvdXJjZS5nZXRVUkkoKSk7CisJCWlmICh0YXJnZXRVUkkgIT0gbnVsbCkKKwkJCXNldHVwRGVwZW5kZW5jeUFkYXB0ZXIocmVzb3VyY2UsIHRhcmdldFVSSSwgc2V0KTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Jlc291cmNlSXNMb2FkaW5nQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Jlc291cmNlSXNMb2FkaW5nQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNmVhNTkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyLmphdmEKQEAgLTAsMCArMSwxMTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIENyZWF0ZWQgb24gT2N0IDI2LCAyMDA0CisgKgorICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCisgKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CisKKy8qKgorICogQGF1dGhvciBtZGVsZGVyCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIEFkYXB0ZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgUkVTT1VSQ0VfSVNfTE9BRElOR19BREFQVEVSX0NMQVNTID0gUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyLmNsYXNzOworCisgICAgcHVibGljIFJlc291cmNlSXNMb2FkaW5nQWRhcHRlcigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlSXNMb2FkaW5nQWRhcHRlciBmaW5kQWRhcHRlcihSZXNvdXJjZSBhUmVzb3VyY2UpIHsKKyAgICAgICAgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyIGFkYXB0ZXIgPSBudWxsOworICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyIFN5bmNocm9uaXppbmcgb24gIiArIGFSZXNvdXJjZSk7CisgICAgICAgIAorICAgICAgICAvKiBTeW5jaHJvbml6ZSBvbiB0aGUgUmVzb3VyY2UgKHdoaWNoIHdpbGwgYmUgdGhlIHRhcmdldCBvZiAKKyAgICAgICAgICogdGhlIFJlc291cmNlSXNMb2FkaW5nQWRhcHRlciBpbiB0aGUgbGlzdCwgaWYgaXQgZXhpc3RzKS4KKyAgICAgICAgICogCisgICAgICAgICAqIHJlbW92ZUlzTG9hZGluZ1N1cHBvcnQoKSB3aWxsIGNvb3JkaW5hdGUgd2l0aCB0aGlzIAorICAgICAgICAgKiBzeW5jaHJvbml6YXRpb24uCisgICAgICAgICAqLworICAgICAgICBzeW5jaHJvbml6ZWQoYVJlc291cmNlLmVBZGFwdGVycygpKSB7CisgICAgICAgIAlhZGFwdGVyID0gKFJlc291cmNlSXNMb2FkaW5nQWRhcHRlcikgRWNvcmVVdGlsLmdldEFkYXB0ZXIoYVJlc291cmNlLmVBZGFwdGVycygpLCBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIuY2xhc3MpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gYWRhcHRlcjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCisgICAgICovCisgICAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisKKyAgICAgICAgaWYgKG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpICE9IG51bGwpIHsKKworICAgICAgICAgICAgLy8gbGlzdGVuIGZvciB0aGUgcmVtb3ZlIG9mIHRoZSBsb2FkaW5nIGFkYXB0ZXIKKyAgICAgICAgICAgIGlmIChpc1NldExvYWRlZFJlc291cmNlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbikpIHJlbW92ZUlzTG9hZGluZ1N1cHBvcnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgYSBuby1vcC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3YWl0Rm9yUmVzb3VyY2VUb0xvYWQoKSB7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbm90aWZpY2F0aW9uCisgICAgICogQHJldHVybgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzU2V0TG9hZGVkUmVzb3VyY2VOb3RpZmljYXRpb24oTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworICAgICAgICByZXR1cm4gbm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChudWxsKSA9PSBSZXNvdXJjZS5SRVNPVVJDRV9fSVNfTE9BREVEICYmIG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uU0VUOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZUlzTG9hZGluZ1N1cHBvcnQoKSB7CisKKyAgICAgICAgLyogU3luY2hyb25pemUgb24gdGhlIHRhcmdldCBvZiB0aGUgQWRhcHRlci4gSWYgCisgICAgICAgICAqIHRoZSBsaXN0IG9mIGFkYXB0ZXJzIGlzIHNlYXJjaGVkIGZvciBhIAorICAgICAgICAgKiBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIgdXNpbmcgdGhlIAorICAgICAgICAgKiBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIuZmluZEFkYXB0ZXIoKSBBUEksIHRoZW4KKyAgICAgICAgICogdGhlIGFjY2VzcyB0byByZW1vdmUgdGhlIEFkYXB0ZXIgdXNpbmcgdGhpcyBtZXRob2QgCisgICAgICAgICAqIHdpbGwgYmUgY29vcmRpbmF0ZWQuICAKKyAgICAgICAgICovCisgICAgICAgIGlmIChnZXRUYXJnZXQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyIFN5bmNocm9uaXppbmcgb24gIiArIGdldFRhcmdldCgpKTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoZ2V0VGFyZ2V0KCkuZUFkYXB0ZXJzKCkpIHsKKyAgICAgICAgICAgICAgICBnZXRUYXJnZXQoKS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjaXNBZGFwdGVyRm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHR5cGUgPT0gUkVTT1VSQ0VfSVNfTE9BRElOR19BREFQVEVSX0NMQVNTOworICAgIH0KKworICAgIC8qKgorICAgICAqIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZvcmNlUmVsZWFzZSgpIHsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Jlc291cmNlSXNMb2FkaW5nQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9SZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg5OWY1ZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9SZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQ3JlYXRlZCBvbiBPY3QgMjYsIDIwMDQKKyAqCisgKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KKyAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcworICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKKworCisvKioKKyAqIEBhdXRob3IgbWRlbGRlcgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5IHsKKworICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyRmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXJGYWN0b3J5KCk7CisgICAgICAgICAKKyAgICBwdWJsaWMgUmVzb3VyY2VJc0xvYWRpbmdBZGFwdGVyIGNyZWF0ZVJlc291cmNlSXNMb2FkaW5nQWRhcHRlcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUlzTG9hZGluZ0FkYXB0ZXIoKTsKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvUmV2aXNpdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1JldmlzaXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWM2N2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1JldmlzaXQuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCisgKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKKworCitwdWJsaWMgY2xhc3MgUmV2aXNpdCB7CisKKwkvKioKKwkgKiBSZXZpc2l0IGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICovCisJcHVibGljIFJldmlzaXQoKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHJldmlzaXQoKSB7CisJfQorCisKKwlwdWJsaWMgc3RhdGljIHZvaWQgdW5Db21tZW50KCkgeworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCB0b0RvKCkgeworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZhY3RvcigpIHsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRGVwcmVjYXRlZE1ldGhvZCgpIHsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlTWUoKSB7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHJldmlld0Rlc2lnbigpIHsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9TdHJpbmdVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvU3RyaW5nVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZjIzMDgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvU3RyaW5nVXRpbC5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIENyZWF0ZWQgb24gTWFyIDE4LCAyMDAzCisgKgorICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCisgKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7CisKKy8qKgorICogQGF1dGhvciBzY2hhY2hlcgorICogCisgKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKKyAqLworcHVibGljIGNsYXNzIFN0cmluZ1V0aWwgeworCS8qKgorCSAqIEVuaGFuY2VkIGVxdWFsaXR5IGNoZWNrIGZvciB0d28gc3RyaW5nIHBhcmFtZXRlcnMsIHRoYXQgdGFrZXMgaW50byBjb25zaWRlcmF0aW9uIG51bGwgdmFsdWVzLgorCSAqIElmIGJvdGggdmFsdWVzIGFyZSBudWxsLCB0aGlzIHdpbGwgcmV0dXJuIHRydWUuCisJICogCisJICogQHBhcmFtIHMxCisJICogQHBhcmFtIHMyCisJICogQHJldHVybiBib29sZWFuCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ3NFcXVhbChTdHJpbmcgczEsIFN0cmluZyBzMikgeworCQlpZiAoczEgPT0gbnVsbCkKKwkJCXJldHVybiBzMiA9PSBudWxsOworCQlyZXR1cm4gczEuZXF1YWxzKHMyKTsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvVHJhbnNsYXRvck1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9UcmFuc2xhdG9yTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZWU4YjgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvVHJhbnNsYXRvck1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDE2OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQorICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZWdpc3RyeVJlYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnBsdWdpbi5FY29yZVV0aWxpdGllc1BsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOworCisvKioKKyAqIFRoaXMgaXMgdGhlIFRyYW5zbGF0b3JNYW5hZ2VyIGNsYXNzIHVzZWQgYnkgdGhlIFRyYW5zbGF0b3JTZXJ2aWNlIGluIG9yZGVyIHRvIGRpc2NvdmVyCisgKiBhbmQgY2FjaGUgYWxsIG9mIHRoZSBleHRlbmRlZCBUcmFuc2xhdG9ycyB0byBiZSB1c2VkIGJ5IEVNRjJET01BZGFwdGVySW1wbC4KKyAqLworcHVibGljIGNsYXNzIFRyYW5zbGF0b3JNYW5hZ2VyIHsKKwkKKwkvKioKKwkgKiBUaGUgc2luZ2xldG9uIFRyYW5zbGF0b3JNYW5hZ2VyIGluc3RhbmNlCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvck1hbmFnZXIgSU5TVEFOQ0UgPSBuZXcgVHJhbnNsYXRvck1hbmFnZXIoKTsKKwkKKwkvKioKKwkgKiBDYWNoZSBvZiBhbGwgdGhlIFRyYW5zbGF0b3JEZXNjcmlwdG9ycworCSAqLworCXByaXZhdGUgZmluYWwgU2V0IHRyYW5zbGF0b3JzID0gbmV3IEhhc2hTZXQoKTsKKwkKKwkvKioKKwkgKiBEZWZhdWx0IHN0YXRpYyBlbXB0eSBhcnJheSB1c2VkIHdoZW4gbm8gZGVzY3JpcHRvcnMgZm91bmQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yRGVzY3JpcHRvcltdIE5PX0VYVEVOREVEX1RSQU5TTEFUT1JTID0gbmV3IFRyYW5zbGF0b3JEZXNjcmlwdG9yWzBdOworCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgVHJhbnNsYXRvck1hbmFnZXIKKwkgKiBAcmV0dXJuIFRyYW5zbGF0b3JNYW5hZ2VyIElOU1RBTkNFCisJICovCisJcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yTWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKworCS8qKgorCSAqIFByaXZhdGUgY29uc3RydWN0b3IKKwkgKi8KKwlwcml2YXRlIFRyYW5zbGF0b3JNYW5hZ2VyKCkgeworCQluZXcgVHJhbnNsYXRvclJlZ2lzdHJ5KCkucmVhZFJlZ2lzdHJ5KCk7CisJfQorCQorCS8qKgorCSAqIFNpbXBsZSBSZWdpc3RyeSBSZWFkZXIgdXNlZCBieSBUcmFuc2xhdG9yIE1hbmFnZXIgdG8gcmVjb2duaXplIHRoZSBUcmFuc2xhdG9yIGV4dGVuc2lvbnMKKwkgKi8KKwlwcml2YXRlIGNsYXNzIFRyYW5zbGF0b3JSZWdpc3RyeSBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKKwkJCisJCS8qKgorCQkgKiBUaGUgVHJhbnNsYXRvciBlbGVtZW50IG9mIHRoZSBleHRlbnNpb24gcG9pbnQuCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU0xBVE9SID0gInRyYW5zbGF0b3IiOyAvLyROT04tTkxTLTEkCisJCQorCQkvKioKKwkJICogRGVmYXVsdCBjb25zdHJ1Y3RvcgorCQkgKi8KKwkJcHVibGljIFRyYW5zbGF0b3JSZWdpc3RyeSgpIHsKKwkJCXN1cGVyKEVjb3JlVXRpbGl0aWVzUGx1Z2luLklELCBFY29yZVV0aWxpdGllc1BsdWdpbi5UUkFOU0xBVE9SX0VYVEVOU1RJT05fUE9JTlQpOworCQl9CisKKwkJLyoqCisJCSAqIEFkZCB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50IGlmIGl0IG1hdGNocyB0aGUgZXhwZWN0ZWQgdHJhbnNsYXRvciBlbGVtZW50IG5hbWUKKwkJICovCisJCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7CisJCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOworCQkJaWYgKFRSQU5TTEFUT1IuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgeworCQkJCWFkZFRyYW5zbGF0b3JEZXNjcmlwdG9yKG5ldyBUcmFuc2xhdG9yRGVzY3JpcHRvcihlbGVtZW50KSk7CisJCQkJCXJlc3VsdCA9IHRydWU7CisJCQl9CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJfQorCisJLyoqCisJICogRGVzY3JpYmVzIGEgVHJhbnNsYXRvciBleHRlbnNpb24gcG9pbnQgZWxlbWVudAorCSAqLworCXB1YmxpYyBjbGFzcyBUcmFuc2xhdG9yRGVzY3JpcHRvciB7CisJCisJCS8qKgorCQkgKiBRdWFsaWZpZWQgY2xhc3MgbmFtZSBhdHRyaWJ1dGUKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTTkFNRSA9ICJjbGFzc05hbWUiOyAvLyROT04tTkxTLTEkCisJCQorCQkvKioKKwkJICogVGhlIGNvbmZpZyBlbGVtZW50IGZvciB0aGlzIERlc2NyaXB0b3IKKwkJICovCisJCXByaXZhdGUgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQ7CisJCQorCQkvKioKKwkJICogdGhlIGNhY2hlZCBxdWFsaWZpZWQgY2xhc3NOYW1lIHZhbHVlIG9mIHRoaXMgZGVzY3JpcHRvcgorCQkgKi8KKwkJcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOworCQorCQkvKioKKwkJICogQ29uc3RydWN0b3IKKwkJICogQHBhcmFtIGFDb25maWdFbGVtZW50CisJCSAqLworCQlwdWJsaWMgVHJhbnNsYXRvckRlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGFDb25maWdFbGVtZW50KSB7CisJCQlzdXBlcigpOworCQkJY29uZmlnRWxlbWVudCA9IGFDb25maWdFbGVtZW50OworCQkJY2xhc3NOYW1lID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoQ0xBU1NOQU1FKTsKKwkJfQorCQkKKwkJLyoqCisJCSAqIFJldHJpZXZlIHRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBleHRlbmRlZCBUcmFuc2xhdG9yCisJCSAqIEByZXR1cm4gU3RyaW5nIGNsYXNzbmFtZQorCQkgKi8KKwkJcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7CisJCQlyZXR1cm4gY2xhc3NOYW1lOworCQl9CisJCisJCS8qKgorCQkgKiBDcmVhdGUgdGhlIGFjdHVhbCBUcmFuc2xhdG9yIGluc3RhbmNlIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudC4KKwkJICogQHJldHVybiBUcmFuc2xhdG9yCisJCSAqLworCQlwdWJsaWMgVHJhbnNsYXRvciBjcmVhdGVUcmFuc2xhdG9yKCkgeworCQkJVHJhbnNsYXRvciBpbnN0YW5jZSA9IG51bGw7CisJCQl0cnkgeworCQkJCWluc3RhbmNlID0gKFRyYW5zbGF0b3IpIGNvbmZpZ0VsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihDTEFTU05BTUUpOworCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOworCQkJfQorCQkJcmV0dXJuIGluc3RhbmNlOworCQl9CisJfQorCQorCS8qKgorCSAqIEFkZCB0aGUgVHJhbnNsYXRvckRlc2NyaXB0b3IgdG8gdGhlIGNhY2hlIG9mIGRlc2NyaXB0b3IgZXh0ZW5zaW9ucy4KKwkgKiBAcGFyYW0gZGVzY3JpcHRvcgorCSAqLworCXByaXZhdGUgdm9pZCBhZGRUcmFuc2xhdG9yRGVzY3JpcHRvcihUcmFuc2xhdG9yRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7CisJCUFzc2VydC5pc05vdE51bGwoZGVzY3JpcHRvcik7CisJCXRyYW5zbGF0b3JzLmFkZChkZXNjcmlwdG9yKTsKKwl9CisJCisJLyoqCisJICogRmluZCBhbGwgdGhlIGFzc29jaWF0ZWQgVHJhbnNsYXRvckRlc2NyaXB0b3JzIGZvciB0aGUgVHJhc2xhdG9yIGV4dGVuc2lvbnMgZGVmaW5lZC4KKwkgKiBAcmV0dXJuIFRyYW5zbGF0b3JEZXNjcmlwdG9yW10KKwkgKi8KKwlwdWJsaWMgVHJhbnNsYXRvckRlc2NyaXB0b3JbXSBmaW5kVHJhbnNsYXRvcnMoKSB7CisJCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOworCQlUcmFuc2xhdG9yRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbnVsbDsKKwkJZm9yIChJdGVyYXRvciB0cmFuc2xhdG9yc0l0ciA9IHRyYW5zbGF0b3JzLml0ZXJhdG9yKCk7IHRyYW5zbGF0b3JzSXRyLmhhc05leHQoKTspIHsKKwkJCWRlc2NyaXB0b3IgPSAoVHJhbnNsYXRvckRlc2NyaXB0b3IpIHRyYW5zbGF0b3JzSXRyLm5leHQoKTsKKwkJCXJlc3VsdC5hZGQoZGVzY3JpcHRvcik7CisJCX0KKwkJaWYgKHJlc3VsdC5zaXplKCkgPT0gMCkgeworCQkJcmV0dXJuIE5PX0VYVEVOREVEX1RSQU5TTEFUT1JTOworCQl9CisJCXJldHVybiAoVHJhbnNsYXRvckRlc2NyaXB0b3JbXSkgcmVzdWx0LnRvQXJyYXkobmV3IFRyYW5zbGF0b3JEZXNjcmlwdG9yW3Jlc3VsdC5zaXplKCldKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvVHJhbnNsYXRvclNlcnZpY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9UcmFuc2xhdG9yU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMTJhN2IKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvVHJhbnNsYXRvclNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCisgKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5UcmFuc2xhdG9yTWFuYWdlci5UcmFuc2xhdG9yRGVzY3JpcHRvcjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBzZXJ2aWNlIGNsYXNzIHRvIGRlbGl2ZXIgQVBJIHRvIHVzZSB0byByZXRyaWV2ZSBUcmFuc2xhdG9yIGV4dGVuc2lvbnMgZnJvbQorICogdGhlIFRyYW5zbGF0b3JNYW5hZ2VyIGFuZCBpdHMgUmVnaXN0cnlSZWFkZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBUcmFuc2xhdG9yU2VydmljZSB7CisKKwkvKioKKwkgKiBTdGF0aWMgS2V5IHZhbHVlIHBhaXIgb2YgZGVzY3JpcHRvcnMgYXMga2V5cyBhbmQgVHJhbnNsYXRvciBpbnN0YW5jZXMgYXMgdmFsdWVzCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIHRyYW5zbGF0b3JzID0gbmV3IEhhc2hNYXAoKTsKKwkKKwkvKioKKwkgKiBTdGF0aWMgZW1wdHkgYXJyYXkgdXNlZCB3aGVuIG5vIGV4dGVuc2lvbnMgZm91bmQKKwkgKi8KKwkvLyBuZXZlciB1c2VkCisJLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yW10gTk9fVFJBTlNMQVRPUlMgPSBuZXcgVHJhbnNsYXRvclswXTsKKwkKKwkvKioKKwkgKiBTaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIFRyYW5zbGF0b3Igc2VydmljZQorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3JTZXJ2aWNlIElOU1RBTkNFID0gbmV3IFRyYW5zbGF0b3JTZXJ2aWNlKCk7CisJCisJLyoqCisJICogRGVmYXVsdCBjb25zdHJ1Y3RvcgorCSAqLworCXByaXZhdGUgVHJhbnNsYXRvclNlcnZpY2UoKSB7CisJCXN1cGVyKCk7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvclNlcnZpY2UgZ2V0SW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJLyoqCisJICogVGhpcyB3aWxsIHJldHVybiB0aGUgYXNzb2NpYXRlZCBleHRlbnNpb24gcG9pbnQgVHJhbnNsYXRvckRlc2NyaXB0b3Igb2JqZWN0cyBmcm9tIHRoZSBtYW5hZ2VyCisJICogQHJldHVybiBUcmFuc2xhdG9yRGVzY3JpcHRvcltdCisJICovCisJcHVibGljIFRyYW5zbGF0b3JEZXNjcmlwdG9yW10gZ2V0VHJhbnNsYXRvckRlc2NyaXB0b3JzKCkgeworCQlyZXR1cm4gVHJhbnNsYXRvck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5maW5kVHJhbnNsYXRvcnMoKTsKKwl9CisJCisJLyoqCisgICAgICogVGhpcyByZXRyaWV2ZXMgdGhlIGV4dGVuZGVkIFRyYW5zbGF0b3JzIHVzaW5nIHRoZSBleHRlbnNpb24gcG9pbnQgbWFuYWdlciBhbmQgZGVzY3JpcHRvcnMKKyAgICAgKiBAcmV0dXJuIFRyYW5zbGF0b3JbXSAoTm90ZSwgdGhlIHJldHVybiB2YWx1ZSBtYXkgY29udGFpbiBudWxsIGVudHJpZXMuKQorICAgICAqLworCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0VHJhbnNsYXRvcnMoKSB7CisJCVRyYW5zbGF0b3JEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBnZXRUcmFuc2xhdG9yRGVzY3JpcHRvcnMoKTsKKwkJVHJhbnNsYXRvcltdIHJlc3VsdCA9IG5ldyBUcmFuc2xhdG9yW2Rlc2NyaXB0b3JzLmxlbmd0aF07CisJCS8vVGhlIHJlc3VsdCBpbmRleCBjb3VsZCBkaWZmZXIgZnJvbSB0aGUgZGVzY3JpcHRvcnMgaW5kZXguCisJCWludCByZXN1bHRJbmRleCA9IDA7CisJCWZvciAoaW50IGk9MDsgaTxkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgeworCQkJVHJhbnNsYXRvciBpbnN0YW5jZSA9IGdldFRyYW5zbGF0b3IoZGVzY3JpcHRvcnNbaV0pOworCQkJaWYgKGluc3RhbmNlIT1udWxsKSB7CisJCQkJcmVzdWx0W3Jlc3VsdEluZGV4XSA9IGluc3RhbmNlOworCQkJCXJlc3VsdEluZGV4Kys7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsgIAorICAgIH0KKwkKKwkvKioKKwkgKiBSZXRyaWV2ZSB0aGUgZXhpc3RpbmcgYXNzb2NpYXRlZCBUcmFuc2xhdG9yIGluc3RhbmNlIGZvciB0aGUgZGVzY3JpcHRvciwgb3IgY3JlYXRlIGEgbmV3CisJICogb25lIGFuZCBjYWNoZSBvbiB0aGUgU2V0LgorCSAqIAorCSAqIEBwYXJhbSB0cmFuc2xhdG9yRGVzY3JpcHRvcgorCSAqIEByZXR1cm4gVHJhbnNsYXRvciBhc3NvY2lhdGVkIHdpdGggdGhlIGRlc2NyaXB0b3IKKwkgKi8KKwlwdWJsaWMgVHJhbnNsYXRvciBnZXRUcmFuc2xhdG9yKFRyYW5zbGF0b3JEZXNjcmlwdG9yIHRyYW5zbGF0b3JEZXNjcmlwdG9yKSB7CisJCVRyYW5zbGF0b3IgdHJhbnNsYXRvciA9IChUcmFuc2xhdG9yKSB0cmFuc2xhdG9ycy5nZXQodHJhbnNsYXRvckRlc2NyaXB0b3IpOworCQlpZiAodHJhbnNsYXRvciAhPSBudWxsKQorCQkJcmV0dXJuIHRyYW5zbGF0b3I7CisJCQorCQlzeW5jaHJvbml6ZWQgKHRyYW5zbGF0b3JzKSB7CisJCQl0cmFuc2xhdG9yID0gdHJhbnNsYXRvckRlc2NyaXB0b3IuY3JlYXRlVHJhbnNsYXRvcigpOworCQkJaWYgKHRyYW5zbGF0b3IgIT0gbnVsbCkKKwkJCQl0cmFuc2xhdG9ycy5wdXQodHJhbnNsYXRvckRlc2NyaXB0b3IsIHRyYW5zbGF0b3IpOworCQl9CisJCXJldHVybiB0cmFuc2xhdG9yOworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9VbnN1cHBvcnRlZENyeXB0b0FsZ29yaXRobUV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1Vuc3VwcG9ydGVkQ3J5cHRvQWxnb3JpdGhtRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcxYzY2ZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9VbnN1cHBvcnRlZENyeXB0b0FsZ29yaXRobUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKKyAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOworCisKK2ltcG9ydCBvcmcub21nLkNPUkJBLlVzZXJFeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBVbnN1cHBvcnRlZENyeXB0b0FsZ29yaXRobUV4Y2VwdGlvbiBleHRlbmRzIFVzZXJFeGNlcHRpb24geworfQorCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy9XRlRVdGlsc1Jlc291cmNlSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MDYzMTgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzOworCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworCitwdWJsaWMgY2xhc3MgV0ZUVXRpbHNSZXNvdXJjZUhhbmRsZXIgZXh0ZW5kcyBOTFMgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJ3ZnR1dGlscyI7Ly8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBXRlRVdGlsc1Jlc291cmNlSGFuZGxlcigpIHsKKwkJLy8gRG8gbm90IGluc3RhbnRpYXRlCisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgREFOR0xJTkdfSFJFRl9FUlJPUl87CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW50ZWdlcl9VSV87CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRmFpbGVkX3RvX2NvbnZlcnRfXzBfX3RvX19fRVJST1JfOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudW1lcmF0aW9uX1VJXzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaG9ydF9VSV87CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ2hhcmFjdGVyX1VJXzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBMb25nX1VJXzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBEb3VibGVfVUlfOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlRGVwZW5kZW5jeVJlZ2lzdGVyX0VSUk9SXzA7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRmxvYXRfVUlfOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ5dGVfVUlfOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdhcm5pbmdfX0NvdWxkX25vdF93cml0ZV9iX1dBUk5fOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJvb2xlYW5fVUlfOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0YWNrX3RyYWNlX29mX25lc3RlZF9leGNlX0VSUk9SXzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBNb2ZPYmplY3RfVUlfOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBsZWFzZU1pZ3JhdGVZb3VyQ29kZUVycm9yX0VSUk9SXzA7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRU1GMkRPTUFkYXB0ZXJJbXBsX0VSUk9SXzA7CisKKwlzdGF0aWMgeworCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5jbGFzcyk7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKKwkJcmV0dXJuIE5MUy5iaW5kKGtleSwgYXJncyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1dyaXRlQmFja0hlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1dyaXRlQmFja0hlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMGFhNDMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvV3JpdGVCYWNrSGVscGVyLmphdmEKQEAgLTAsMCArMSwxMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKKworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworCisKKy8qKgorICogQGRlcHJlY2F0ZWQgVGhpcyBjbGFzcyB3aWxsIGJlIGRlbGV0ZWQuIElmIHlvdSBzdGlsbCBuZWVkIHRvIHVzZSB0aGlzIGNsYXNzLCBwbGVhc2UgY29udGFjdCB0aGUKKyAqICAgICAgICAgICAgIFdDQ00gdGVhbS4gQSBjbGFzcyB3aGljaCBjYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIEVuY29kZXIvRGVjb2RlcnMgdG8gc2F2ZQorICogICAgICAgICAgICAgcmVzb3VyY2VzIGlmIHRoZXkgYXJlIG1hZGUgZGlydHkgYnkgYXV0b21hdGljIGVuY29kaW5nIHN1cHBvcnQuIFVzYWdlIEV4YW1wbGU6CisgKiAKKyAqIDxwcmU+CisgKiAKKyAqIAorICogLy8gVXNlIHRoZSBzdGFuZGFyZCBXZWJTcGhlcmUgcGFzc3dvcmQgdmFsdWUgZW5jb2Rlci9kZWNvZGVyLgorICogRW5jb2RlckRlY29kZXJSZWdpc3RyeS5nZXREZWZhdWx0UmVnaXN0cnkoKS5zZXREZWZhdWx0RW5jb2RlckRlY29kZXIobmV3IGNvbS5pYm0uZWpzLnNlY3VyaXR5LnV0aWwuV0FTRW5jb2RlckRlY29kZXIoKSk7CisgKiAvLyBCZWdpbiB0cmFja2luZyBjaGFuZ2VzLi4uCisgKiBXcml0ZUJhY2tIZWxwZXIuYmVnaW4oKTsKKyAqIC8vIExvYWQgYSByZXNvdXJjZSB3aGljaCBtYXkgaGF2ZSB1bi1lbmNvZGVkIHZhbHVlcy4uLgorICogLy8gTm90ZTogVGhlIFdDQ00gd2lsbCBhdHRlbXB0IHRvIGRldGVjdCB1bi1lbmNvZGVkIHZhbHVlcy4gIElmIHVuZW5jb2RlZCB2YWx1ZXMKKyAqIC8vIGFyZSBmb3VuZCwgdGhlIHZhbHVlIHdpbGwgYmUgZW5jb2RlZCwgYW5kIHRoZSByZXNvdXJjZSB3aWxsIGJlIGFkZGVkIHRvIHRoZQorICogLy8gV3JpdGVCYWNrSGVscGVyLgorICogUmVzb3VyY2UgcmVzID0gcmVzb3VyY2VTZXQubG9hZCgmcXVvdDtteVJlc291cmNlJnF1b3Q7KTsKKyAqIC8vIEVuc3VyZSB0aGF0IGFueSBjaGFuZ2VzIGR1ZSB0byBlbmNvZGluZyBhcmUgd3JpdHRlbiBiYWNrIG91dC4KKyAqIFdyaXRlQmFja0hlbHBlci5lbmQoKTsKKyAqIDwvcHJlPgorICovCitwdWJsaWMgY2xhc3MgV3JpdGVCYWNrSGVscGVyIHsKKwlwcml2YXRlIFNldCBkaXJ0eU9iamVjdHMgPSBuZXcgSGFzaFNldCgpOworCXByaXZhdGUgYm9vbGVhbiB0cmFja2luZ0NoYW5nZXMgPSBmYWxzZTsKKwlwcml2YXRlIHN0YXRpYyBXcml0ZUJhY2tIZWxwZXIgX2luc3RhbmNlOworCXN0YXRpYyB7CisJCS8vRGVwcmVjYXRlZCBjbGFzcworCQlSZXZpc2l0LmRlbGV0ZU1lKCk7CisJfQorCisJLyoqCisJICogUHJpdmF0ZSBjb25zdHJ1Y3RvciBlbnN1cmVzIHByb3BlciB1c2FnZSB0aHJvdWdoIHNpbmdsZXRvbi4KKwkgKi8KKwlwcml2YXRlIFdyaXRlQmFja0hlbHBlcigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGEgcmVzb3VyY2Ugd2hpY2ggaXMgZGlydHksIGFuZCBuZWVkcyB0byBiZSBzYXZlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGREaXJ0eU9iamVjdChFT2JqZWN0IGRpcnR5T2JqZWN0KSB7CisJCWRpcnR5T2JqZWN0cy5hZGQoZGlydHlPYmplY3QpOworCX0KKworCS8qKgorCSAqIEJlZ2luIGNvbGxlY3Rpbmcgb2JqZWN0cyB3aGljaCBoYXZlIGNoYW5nZWQuCisJICovCisJcHVibGljIHZvaWQgYmVnaW4oKSB7CisJCXRyYWNraW5nQ2hhbmdlcyA9IHRydWU7CisJfQorCisJLyoqCisJICogQXR0ZW1wdHMgdG8gc2F2ZSBhbGwgZGlydHkgcmVzb3VyY2VzIChpZiBwb3NzaWJsZSksIHRoZW4gbWFya3MgdGhlIHJlc291cmNlcyBhcyBub24tZGlydHkuCisJICovCisJcHVibGljIHZvaWQgZW5kKCkgeworCQlzYXZlRGlydHlSZXNvdXJjZXMoKTsKKwkJcmVzZXQoKTsKKwkJdHJhY2tpbmdDaGFuZ2VzID0gZmFsc2U7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIGNoYW5nZXMgdG8gbW9mIG9iamVjdHMgYXJlIGN1cnJlbnRseSBiZWluZyB0cmFja2VkLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQWN0aXZlKCkgeworCQlyZXR1cm4gdHJhY2tpbmdDaGFuZ2VzOworCX0KKworCS8qKgorCSAqIENsZWFycyB0aGUgbGlzdCBvZiBkaXJ0eSByZXNvdXJjZXMuCisJICovCisJcHJvdGVjdGVkIHZvaWQgcmVzZXQoKSB7CisJCWRpcnR5T2JqZWN0cy5jbGVhcigpOworCX0KKworCS8qKgorCSAqIEF0dGVtcHRzIHRvIHNhdmUgYWxsIGRpcnR5IHJlc291cmNlcyAoaWYgcG9zc2libGUpLCB0aGVuIG1hcmtzIHRoZSByZXNvdXJjZXMgYXMgbm9uLWRpcnR5LgorCSAqLworCXByb3RlY3RlZCB2b2lkIHNhdmVEaXJ0eVJlc291cmNlcygpIHsKKwkJU2V0IGRpcnR5UmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKKwkJSXRlcmF0b3IgZGlydHlPYmpJdGVyID0gZGlydHlPYmplY3RzLml0ZXJhdG9yKCk7CisJCXdoaWxlIChkaXJ0eU9iakl0ZXIuaGFzTmV4dCgpKSB7CisJCQlFT2JqZWN0IGRpcnR5T2JqZWN0ID0gKEVPYmplY3QpIGRpcnR5T2JqSXRlci5uZXh0KCk7CisJCQlpZiAoZGlydHlPYmplY3QuZVJlc291cmNlKCkgIT0gbnVsbCAmJiAhZGlydHlSZXNvdXJjZXMuY29udGFpbnMoZGlydHlPYmplY3QpKSB7CisJCQkJZGlydHlSZXNvdXJjZXMuYWRkKGRpcnR5T2JqZWN0LmVSZXNvdXJjZSgpKTsKKwkJCX0KKwkJfQorCQlJdGVyYXRvciBkaXJ0eUl0ZXIgPSBkaXJ0eVJlc291cmNlcy5pdGVyYXRvcigpOworCQl3aGlsZSAoZGlydHlJdGVyLmhhc05leHQoKSkgeworCQkJUmVzb3VyY2UgZGlydHlSZXNvdXJjZSA9IChSZXNvdXJjZSkgZGlydHlJdGVyLm5leHQoKTsKKwkJCXRyeSB7CisJCQkJZGlydHlSZXNvdXJjZS5zYXZlKENvbGxlY3Rpb25zLkVNUFRZX01BUCk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCXdhcm4oZGlydHlSZXNvdXJjZSwgZSk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBBZGRzIGEgcmVzb3VyY2Ugd2hpY2ggaXMgZGlydHksIGFuZCBuZWVkcyB0byBiZSBzYXZlZC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFdyaXRlQmFja0hlbHBlciBzaW5nbGV0b24oKSB7CisJCWlmIChfaW5zdGFuY2UgPT0gbnVsbCkgeworCQkJX2luc3RhbmNlID0gbmV3IFdyaXRlQmFja0hlbHBlcigpOworCQl9CisJCXJldHVybiBfaW5zdGFuY2U7CisJfQorCisJLyoqCisJICogV2FybiB0aGUgdXNlciBvZiBwcm9ibGVtcyBkdXJpbmcgc2F2ZS4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB3YXJuKFJlc291cmNlIHJlcywgRXhjZXB0aW9uIGUpIHsKKwkJU3lzdGVtLmVyci5wcmludGxuKFdGVFV0aWxzUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhXRlRVdGlsc1Jlc291cmNlSGFuZGxlci5XYXJuaW5nX19Db3VsZF9ub3Rfd3JpdGVfYl9XQVJOXywgbmV3IE9iamVjdFtde3Jlcy5nZXRVUkkoKX0pKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mL3d0cGVtZi9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZi91dGlsaXRpZXMvWE1MVmFsdWVFbmNvZGVyRGVjb2Rlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1hNTFZhbHVlRW5jb2RlckRlY29kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWExZDJjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvdXRpbGl0aWVzL1hNTFZhbHVlRW5jb2RlckRlY29kZXIuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllczsKKworCisvKioKKyAqIEFuIFhNTCB2YWx1ZSBlc2NhcGluZyBFbmNvZGVyRGVjb2RlciBpbXBsZW1lbnRhdGlvbgorICovCitwdWJsaWMgY2xhc3MgWE1MVmFsdWVFbmNvZGVyRGVjb2RlciBleHRlbmRzIEVuY29kZXJEZWNvZGVyQWRhcHRlciBpbXBsZW1lbnRzIEVuY29kZXJEZWNvZGVyIHsKKwkvKioKKwkgKiBJZGVudGlmaWVzIHRoZSBsYXN0IHByaW50YWJsZSBjaGFyYWN0ZXIgaW4gdGhlIFVuaWNvZGUgcmFuZ2UgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhlCisJICogZW5jb2RpbmcgdXNlZCB3aXRoIHRoaXMgc2VyaWFsaXplci4gRm9yIDgtYml0IGVuY29kaW5ncyB0aGlzIHdpbGwgYmUgZWl0aGVyIDB4N0Ugb3IgMHhGRi4gRm9yCisJICogMTYtYml0IGVuY29kaW5ncyB0aGlzIHdpbGwgYmUgMHhGRkZGLiBDaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBwcmludGFibGUgd2lsbCBiZSBlc2NhcGVkIHVzaW5nCisJICogY2hhcmFjdGVyIHJlZmVyZW5jZXMuCisJICovCisJcHJpdmF0ZSBpbnQgX2xhc3RQcmludGFibGUgPSAweDdFOworCXByb3RlY3RlZCBzdGF0aWMgWE1MVmFsdWVFbmNvZGVyRGVjb2RlciBfc2luZ2xldG9uOworCisJLyoqCisJICogRW5jb2RlckRlY29kZXJBZGFwdGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICovCisJcHVibGljIFhNTFZhbHVlRW5jb2RlckRlY29kZXIoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhIGRlY29kZWQgdmVyc2lvbiBvZiB0aGUgdmFsdWUuCisJICovCisJcHVibGljIFN0cmluZyBkZWNvZGUoU3RyaW5nIHZhbHVlKSB7CisJCS8vIE5PVF9JTVBMRU1FTlRFRAorCQlyZXR1cm4gdmFsdWU7CisJfQorCisJLyoqCisJICogRXNjYXBlcyBhIHN0cmluZyBzbyBpdCBtYXkgYmUgcHJpbnRlZCBhcyB0ZXh0IGNvbnRlbnQgb3IgYXR0cmlidXRlIHZhbHVlLiBOb24gcHJpbnRhYmxlCisJICogY2hhcmFjdGVycyBhcmUgZXNjYXBlZCB1c2luZyBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4gV2hlcmUgdGhlIGZvcm1hdCBzcGVjaWZpZXMgYSBkZWF1bHQgZW50aXR5CisJICogcmVmZXJlbmNlLCB0aGF0IHJlZmVyZW5jZSBpcyB1c2VkIChlLmcuIDx0dD4mYW1wO2x0OzwvdHQ+KS4KKwkgKiAKKwkgKiBAcGFyYW0gc291cmNlCisJICogICAgICAgICAgICBUaGUgc3RyaW5nIHRvIGVzY2FwZQorCSAqLworCXB1YmxpYyBTdHJpbmcgZW5jb2RlKFN0cmluZyB2YWx1ZSkgeworCQlTdHJpbmdCdWZmZXIgc2J1ZiA9IG5ldyBTdHJpbmdCdWZmZXIodmFsdWUubGVuZ3RoKCkpOworCQlTdHJpbmcgY2hhclJlZiA9IG51bGw7CisJCWNoYXIgY2g7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoKCk7ICsraSkgeworCQkJY2ggPSB2YWx1ZS5jaGFyQXQoaSk7CisJCQkvLyBJZiB0aGVyZSBpcyBhIHN1aXRhYmxlIGVudGl0eSByZWZlcmVuY2UgZm9yIHRoaXMKKwkJCS8vIGNoYXJhY3RlciwgcHJpbnQgaXQuIFRoZSBsaXN0IG9mIGF2YWlsYWJsZSBlbnRpdHkKKwkJCS8vIHJlZmVyZW5jZXMgaXMgYWxtb3N0IGJ1dCBub3QgaWRlbnRpY2FsIGJldHdlZW4KKwkJCS8vIFhNTCBhbmQgSFRNTC4KKwkJCWNoYXJSZWYgPSBnZXRFbnRpdHlSZWYoY2gpOworCQkJaWYgKGNoYXJSZWYgIT0gbnVsbCkgeworCQkJCXNidWYuYXBwZW5kKCcmJyk7CisJCQkJc2J1Zi5hcHBlbmQoY2hhclJlZik7CisJCQkJc2J1Zi5hcHBlbmQoJzsnKTsKKwkJCX0gZWxzZSBpZiAoKGNoID49ICcgJyAmJiBjaCA8PSBfbGFzdFByaW50YWJsZSAmJiBjaCAhPSAweEY3KSB8fCBjaCA9PSAnXG4nIHx8IGNoID09ICdccicgfHwgY2ggPT0gJ1x0JykgeworCQkJCS8vIElmIHRoZSBjaGFyYWN0ZXIgaXMgbm90IHByaW50YWJsZSwgcHJpbnQgYXMgY2hhcmFjdGVyIHJlZmVyZW5jZS4KKwkJCQkvLyBOb24gcHJpbnRhYmxlcyBhcmUgYmVsb3cgQVNDSUkgc3BhY2UgYnV0IG5vdCB0YWIgb3IgbGluZQorCQkJCS8vIHRlcm1pbmF0b3IsIEFTQ0lJIGRlbGV0ZSwgb3IgYWJvdmUgYSBjZXJ0YWluIFVuaWNvZGUgdGhyZXNob2xkLgorCQkJCXNidWYuYXBwZW5kKGNoKTsKKwkJCX0gZWxzZSB7CisJCQkJc2J1Zi5hcHBlbmQoIiYjIik7Ly8kTk9OLU5MUy0xJAorCQkJCXNidWYuYXBwZW5kKEludGVnZXIudG9TdHJpbmcoY2gpKTsKKwkJCQlzYnVmLmFwcGVuZCgnOycpOworCQkJfQorCQl9CisJCXJldHVybiBzYnVmLnRvU3RyaW5nKCk7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZXNjYXBlKFN0cmluZyB2YWx1ZSkgeworCQlpZiAoX3NpbmdsZXRvbiA9PSBudWxsKSB7CisJCQlfc2luZ2xldG9uID0gbmV3IFhNTFZhbHVlRW5jb2RlckRlY29kZXIoKTsKKwkJfQorCQlyZXR1cm4gX3NpbmdsZXRvbi5lbmNvZGUodmFsdWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHN1aXRhYmxlIGVudGl0eSByZWZlcmVuY2UgZm9yIHRoaXMgY2hhcmFjdGVyIHZhbHVlLCBvciBudWxsIGlmIG5vIHN1Y2ggZW50aXR5CisJICogZXhpc3RzLiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpdGggPHR0PicmYW1wOyc8L3R0PiB3aWxsIHJldHVybiA8dHQ+IiZhbXA7YW1wOyI8L3R0Pi4KKwkgKiAKKwkgKiBAcGFyYW0gY2gKKwkgKiAgICAgICAgICAgIENoYXJhY3RlciB2YWx1ZQorCSAqIEByZXR1cm4gQ2hhcmFjdGVyIGVudGl0eSBuYW1lLCBvciBudWxsCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBnZXRFbnRpdHlSZWYoY2hhciBjaCkgeworCQkvLyBFbmNvZGUgc3BlY2lhbCBYTUwgY2hhcmFjdGVycyBpbnRvIHRoZSBlcXVpdmFsZW50IGNoYXJhY3RlciByZWZlcmVuY2VzLgorCQkvLyBUaGVzZSBmaXZlIGFyZSBkZWZpbmVkIGJ5IGRlZmF1bHQgZm9yIGFsbCBYTUwgZG9jdW1lbnRzLgorCQlzd2l0Y2ggKGNoKSB7CisJCQljYXNlICc8JyA6CisJCQkJcmV0dXJuICJsdCI7Ly8kTk9OLU5MUy0xJAorCQkJY2FzZSAnPicgOgorCQkJCXJldHVybiAiZ3QiOy8vJE5PTi1OTFMtMSQKKwkJCWNhc2UgJyInIDoKKwkJCQlyZXR1cm4gInF1b3QiOy8vJE5PTi1OTFMtMSQKKwkJCWNhc2UgJ1wnJyA6CisJCQkJcmV0dXJuICJhcG9zIjsvLyROT04tTkxTLTEkCisJCQljYXNlICcmJyA6CisJCQkJcmV0dXJuICJhbXAiOy8vJE5PTi1OTFMtMSQKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi93dHBlbWYvd2Z0dXRpbHMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL3dmdHV0aWxzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIyZTJhZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYvd3RwZW1mL3dmdHV0aWxzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyOCBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjCisjIENvbnRyaWJ1dG9yczoKKyMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitXYXJuaW5nX19Db3VsZF9ub3Rfd3JpdGVfYl9XQVJOXz1JV0FFMDAwOFcgV2FybmluZzogQ291bGQgbm90IHdyaXRlIGJhY2sgezB9CitTdGFja190cmFjZV9vZl9uZXN0ZWRfZXhjZV9FUlJPUl89SVdBRTAwMDlFIFN0YWNrIHRyYWNlIG9mIG5lc3RlZCBleGNlcHRpb246CitFbnVtZXJhdGlvbl9VSV89RW51bWVyYXRpb24KK0RvdWJsZV9VSV89RG91YmxlCitGbG9hdF9VSV89RmxvYXQKK0xvbmdfVUlfPUxvbmcKK1Nob3J0X1VJXz1TaG9ydAorQm9vbGVhbl9VSV89Qm9vbGVhbgorSW50ZWdlcl9VSV89SW50ZWdlcgorQ2hhcmFjdGVyX1VJXz1DaGFyYWN0ZXIKK0J5dGVfVUlfPUJ5dGUKK0ZhaWxlZF90b19jb252ZXJ0X18wX190b19fX0VSUk9SXz1JV0FFMDAxNEUgRmFpbGVkIHRvIGNvbnZlcnQgezB9IHRvIHsxfS4KK0RBTkdMSU5HX0hSRUZfRVJST1JfPUlXQUUwMDAxRSBVbmFibGUgdG8gcmVzb2x2ZSBIUkVGIHswfS4gQ2hlY2sgdGhlIGRlc2NyaXB0b3IgZmlsZXMgYW5kIGVuc3VyZSB0aGUgaWRzIGFyZSB2YWxpZC4KK01vZk9iamVjdF9VSV89TW9mT2JqZWN0X1VJXworUGxlYXNlTWlncmF0ZVlvdXJDb2RlRXJyb3JfRVJST1JfMD1QbGVhc2VNaWdyYXRlWW91ckNvZGVFcnJvcl9FUlJPUl8wCitFTUYyRE9NQWRhcHRlckltcGxfRVJST1JfMD1FTUYyRE9NQWRhcHRlckltcGxfRVJST1JfMAorCitSZXNvdXJjZURlcGVuZGVuY3lSZWdpc3Rlcl9FUlJPUl8wPUlXQUUwMDAyRSBUaGUgUmVzb3VyY2VTZXQgY2Fubm90IGJlIG51bGwuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU0NTE1MgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vLmNsYXNzcGF0aApAQCAtMCwwICsxLDE0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGNsYXNzcGF0aD4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm9wZXJ0eV9maWxlIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+CisJCTxhY2Nlc3NydWxlcz4KKwkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vKioiLz4KKwkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uLyoqIi8+CisJCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qZW0vKioiLz4KKwkJPC9hY2Nlc3NydWxlcz4KKwk8L2NsYXNzcGF0aGVudHJ5PgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgorPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLy5jdnNpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdlNDY3MAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vLmN2c2lnbm9yZQpAQCAtMCwwICsxLDcgQEAKK2JpbgordGVtcC5mb2xkZXIKK2J1aWxkLnhtbAorZW1md29ya2JlbmNoZWRpdC5qYXIKK0Bkb3QKK3NyYy56aXAKK2phdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZWYwMWEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLy5wcm9qZWN0CkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY0NjhmOQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0wLDAgKzEsNjIgQEAKKyNTYXQgTWFyIDI0IDAyOjA2OjQ1IEVEVCAyMDA3CitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFmYjQ3YwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSwyNiBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wCitCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCitCdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uOyBzaW5nbGV0b246PXRydWUKK0J1bmRsZS1WZXJzaW9uOiAxLjEuMjAyLnF1YWxpZmllcgorQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRU1GV29ya2JlbmNoRWRpdFBsdWdpbgorQnVuZGxlLVZlbmRvcjogJXBsdWdpblZlbmRvcgorQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2g7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0O3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQ7eC1pbnRlcm5hbDo9dHJ1ZQorUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMi4wLjApIiwKKyBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4xMDAsMy4wLjApIiwKKyBvcmcuZWNsaXBzZS5lbWYuZWRpdDtidW5kbGUtdmVyc2lvbj0iWzIuNC4wLDMuMC4wKSIsCisgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaTtidW5kbGUtdmVyc2lvbj0iWzIuNC4wLDMuMC4wKSIsCisgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWY7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIsCisgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKKyBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCisgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAorIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKKyBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIgorRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKK0J1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNCwKKyBKMlNFLTEuNQorQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vYWJvdXQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTk5ZGYzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9hYm91dC5odG1sCkBAIC0wLDAgKzEsMzQgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KKzxIVE1MPgorCis8aGVhZD4KKzx0aXRsZT5BYm91dDwvdGl0bGU+Cis8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8L2hlYWQ+CisKKzxCT0RZIGxhbmc9IkVOLVVTIj4KKworPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+CisKKzxQPkp1bmUsIDIwMDg8L1A+CisKKzxIMz5MaWNlbnNlPC9IMz4KKworPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAorKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCit1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCisoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKKzxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCitGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+CisKKzxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAorQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKK3Rlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAorQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCitsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKK3Rlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAorYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Cis8QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KKworPC9CT0RZPgorPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyODhhZDcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxOSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjCisjIENvbnRyaWJ1dG9yczoKKyMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzb3VyY2UuLiA9IHNyYy8sXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlfZmlsZS8KK291dHB1dC4uID0gYmluLworYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCisgICAgICAgICAgICAgICAuLFwKKyAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCisgICAgICAgICAgICAgICBhYm91dC5odG1sLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCitzcmMuaW5jbHVkZXMgPSBzY2hlbWEvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGMxY2U3Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9wbHVnaW4ucHJvcGVydGllcwpAQCAtMCwwICsxLDE2IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMKKyMgQ29udHJpYnV0b3JzOgorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitFTUZfUmVzb3VyY2VfRWRpdF9Nb2RlbD1FTUYgUmVzb3VyY2UgRWRpdCBNb2RlbAorRWRpdF9Nb2RlbF9FeHRlbnNpb25zPUVkaXQgTW9kZWwgRXh0ZW5zaW9ucworQWRhcHRlcl9GYWN0b3J5X0V4dGVuc2lvbj1BZGFwdGVyIEZhY3RvcnkgRXh0ZW5zaW9uCitNb2RpZmllckhlbHBlckZhY3Rvcnk9TW9kaWZpZXJIZWxwZXJGYWN0b3J5CitwbHVnaW5OYW1lPUVNRiBXb3JrYmVuY2ggRWRpdCBQbHVnLWluCitwbHVnaW5WZW5kb3I9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcGx1Z2luLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjczYjU3Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9wbHVnaW4ueG1sCkBAIC0wLDAgKzEsNDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Cis8cGx1Z2luPgorCisgICAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImVkaXRNb2RlbCIgbmFtZT0iJUVNRl9SZXNvdXJjZV9FZGl0X01vZGVsIiBzY2hlbWE9InNjaGVtYS9lZGl0TW9kZWwuZXhzZCIvPgorICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZWRpdE1vZGVsRXh0ZW5zaW9uIiBuYW1lPSIlRWRpdF9Nb2RlbF9FeHRlbnNpb25zIiBzY2hlbWE9InNjaGVtYS9lZGl0TW9kZWxFeHRlbnNpb24uZXhzZCIvPgorICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iYWRhcHRlckZhY3RvcnkiIG5hbWU9IiVBZGFwdGVyX0ZhY3RvcnlfRXh0ZW5zaW9uIiBzY2hlbWE9InNjaGVtYS9hZGFwdGVyRmFjdG9yeS5leHNkIi8+CisgICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJNb2RpZmllckhlbHBlckZhY3RvcnkiIG5hbWU9IiVNb2RpZmllckhlbHBlckZhY3RvcnkiIHNjaGVtYT0ic2NoZW1hL21vZGlmaWVySGVscGVyRmFjdG9yeS5leHNkIi8+CisKKyAgIDxleHRlbnNpb24KKyAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qZW0udXRpbC5pbnRlcm5hbFdvcmtiZW5jaENvbnRleHRGYWN0b3J5Ij4KKyAgICAgIDxmYWN0b3J5Q2xhc3MKKyAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQuRU1GV29ya2JlbmNoRWRpdENvbnRleHRGYWN0b3J5Ij4KKyAgICAgIDwvZmFjdG9yeUNsYXNzPgorICAgPC9leHRlbnNpb24+CisgICAKKyAgIDxleHRlbnNpb24KKyAgICAgICAgaWQ9ImVtZlZhbGlkYXRpb25IYW5kbGVyIgorICAgICAgICBuYW1lPSJlbWZWYWxpZGF0aW9uSGFuZGxlciIKKyAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyIj4KKyAgICAgIDx2YWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlcgorICAgICAgICBpZD0iZW1mVmFsaWRhdGlvbkhhbmRsZXIiCisgICAgICAgIGhhbmRsZXJDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRW1mVmFsaWRhdGlvbkhhbmRsZXIiCisgICAgICAgIHNlbGVjdGlvblR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ii8+CisgICA8L2V4dGVuc2lvbj4KKyAgIAorICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5wcm9wZXJ0eVRlc3RlcnMiPgorICAgIDxwcm9wZXJ0eVRlc3RlcgorICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVtZlBhY2thZ2VQcm9wZXJ0eVRlc3RlciIKKyAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0IgorICAgICAgbmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiIKKyAgICAgIHByb3BlcnRpZXM9ImVtZlBhY2thZ2UiCisgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRW1mUGFja2FnZVByb3BlcnR5VGVzdGVyIj4KKyAgICA8L3Byb3BlcnR5VGVzdGVyPgorICA8L2V4dGVuc2lvbj4KKyAgCisgIDxleHRlbnNpb24gCisgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmplbS51dGlsLnVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzIj4KKyAgICAgICA8dWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MKKyAgICAgICAgICBrZXk9IlZhbGlkYXRlRWRpdENvbnRleHQiCisgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuVmFsaWRhdGVFZGl0SGVhZGxlc3NDb250ZXh0IgorICAgICAgICAgIGNvbnRleHQ9IkhlYWRsZXNzIj4KKyAgICAgIDwvdWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3M+CisgIDwvZXh0ZW5zaW9uPgorICAKKyAgIAorPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3ByZXBhcmVmb3JwaWkueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9wcmVwYXJlZm9ycGlpLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmQxZDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9wcmVwYXJlZm9ycGlpLnhtbApAQCAtMCwwICsxLDM3IEBACis8cHJvamVjdCBuYW1lPSJQcmVwYXJlRm9yUElJIiBkZWZhdWx0PSJtYWluIiBiYXNlZGlyPSIuIj4KKwkJCisJPCEtLSBTZXR1cCB0ZW1wIHZhcmlhYmxlcyAtLT4KKwk8dGFyZ2V0IG5hbWU9ImluaXQiPgorCQk8cHJvcGVydHkgbmFtZT0ibmxzRGlyIiB2YWx1ZT0iZDovTkxTL0Nvcm9uYS8wNTI2Ii8+CisJCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4iIHZhbHVlPSJjb20uaWJtLnd0cC5lbWYud29ya2JlbmNoLmVkaXQiLz4KKwkJPHByb3BlcnR5IG5hbWU9InBsdWdpbmRpciIgdmFsdWU9ImQ6L3dvcmtzcGFjZUNvcm9uYS8ke3BsdWdpbn0iLz4KKwkJPHByb3BlcnR5IG5hbWU9Im91dHB1dERpciIgdmFsdWU9IiR7bmxzRGlyfS8ke3BsdWdpbn0iLz4KKwkJCisJCisJPC90YXJnZXQ+CisKKwk8IS0tIENyZWF0ZSB0aGUgZGVzdGluYXRpb24gZGlyIC0tPgorCTx0YXJnZXQgbmFtZT0ibmxzRGlyIiBkZXBlbmRzPSJpbml0Ij4KKwkJPG1rZGlyIGRpcj0iJHtubHNEaXJ9Ii8+CisJPC90YXJnZXQ+CisJCisJPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KKwk8dGFyZ2V0IG5hbWU9InBsdWdpbmRpciIgZGVwZW5kcz0ibmxzRGlyIj4KKwkJPGRlbGV0ZSBkaXI9IiR7b3V0cHV0RGlyfSIvPgorCQk8bWtkaXIgZGlyPSIke291dHB1dERpcn0iLz4KKwk8L3RhcmdldD4KKworCTwhLS0gTW92ZSB0aGUgZmlsZXMgdG8gdGhlIGNvcnJlY3QgbG9jYXRpb25zIGluIHRoZSB3b3Jrc3BhY2UuIC0tPgorCTx0YXJnZXQgbmFtZT0ibWFpbiIgZGVwZW5kcz0icGx1Z2luZGlyIj4KKwkKKwkJPG1lc3NhZ2VJZEdlbiBmb2xkZXJQYXRoID0gIiR7cGx1Z2luZGlyfSIgY29tcG9uZW50SWQgPSAiRSIgLz4KKwkJCisJCTxjb3B5IHRvZGlyID0gIiR7b3V0cHV0RGlyfS9wcm9wZXJ0eV9maWxlIiA+CisJCQkgPGZpbGVzZXQgZGlyPSIke3BsdWdpbmRpcn0vcHJvcGVydHlfZmlsZSI+CisgICAgICAgICAgIAkgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyIvPgorICAJCQkgPC9maWxlc2V0PgorICAJCTwvY29weT4KKworICAJCQorCTwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9wcm9wZXJ0eV9maWxlL2VtZnRvc2VkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3Byb3BlcnR5X2ZpbGUvZW1mdG9zZWQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2Q4NGRmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9wcm9wZXJ0eV9maWxlL2VtZnRvc2VkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMyBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworVW5leHBlY3RlZF9JT19leGNlcHRpb25fb2NjdXJyZWRfY3JlYXRpbmdfeG1sX2RvY3VtZW50XzFfRVhDXz1JV0FFMDAxN0UgVW5leHBlY3RlZCBJTyBleGNlcHRpb24gb2NjdXJyZWQgY3JlYXRpbmcgeG1sIGRvY3VtZW50CitFTUYyRE9NU2VkUmVuZGVyZXJfVUlfMD17MH0gc2hvdWxkIG5vdCB1c2UgYW4gT3V0cHV0U3RyZWFtIGZvciBsb2FkaW5nCitFTUYyRE9NU2VkUmVuZGVyZXJfVUlfMT17MH0gc2hvdWxkIG5vdCB1c2UgYW4gSW5wdXRTdHJlYW0gZm9yIGxvYWRpbmcKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcHJvcGVydHlfZmlsZS9lbWZ3b3JrYmVuY2hlZGl0LnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3Byb3BlcnR5X2ZpbGUvZW1md29ya2JlbmNoZWRpdC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMWQxYzMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3Byb3BlcnR5X2ZpbGUvZW1md29ya2JlbmNoZWRpdC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjEgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIworIyBDb250cmlidXRvcnM6CisjIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworRHluYW1pY0FkYXB0ZXJGYWN0b3J5X0VSUk9SXzA9SVdBRTAwMTBFIEEgbnVsbCBFUGFja2FnZSB3aWxsIG5vdCBiZSB0aWVkIHRvIGFueSBBZGFwdGVyIEZhY3RvcnkuCitDbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbl9VSV8wPVRoZXJlIGFyZSBhdCBsZWFzdCB7MH0gaW1wcm9wZXJseSByZWxlYXNlZCBlZGl0IG1vZGVscy4KK0NsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uX1VJXzE9VGhpcyBleGNlcHRpb24gd2FzIGdlbmVyYXRlZCB0byBpbmRpY2F0ZSBhbiBpbnZhbGlkIHVzYWdlIG9mIHJlZmVyZW5jZSBjb3VudHMuXG4gVHlwaWNhbGx5LCB0aGlzIG9jY3VycyBvbiBhdHRlbXB0cyB0byBvcGVuIGFuIGFscmVhZHkgb3BlbiBhcnRpZmFjdCBlZGl0LlxuIE1ha2Ugc3VyZSB0aGUgZGlzcG9zZSBtZXRob2QgaXMgY2FsbGVkIHdoZW4gZG9uZSBhY2Nlc3NpbmcuXG4gUGxlYXNlIGV4YW1pbmUgdGhlIHN0YWNrIHRyYWNlLlxuIENsaWVudCBBY2Nlc3MgRXhjZXB0aW9uIG9mIHR5cGUgezB9IFxuCitDbGllbnRBY2Nlc3NSZWdpc3RyeV9FUlJPUl8wPUlXQUUwMDExRSBLZXkgYWxyZWFkeSB1c2VkIHRvIGFjY2VzcyBSZXNvdXJjZQorQ2xpZW50QWNjZXNzUmVnaXN0cnlfRVJST1JfMT1JV0FFMDAxMkUgS2V5IGhhcyBub3QgcHJvcGVybHkgYWNjZXNzZWQgUmVzb3VyY2UuCitFZGl0TW9kZWxSZWdpc3RyeV9FUlJPUl8wPUlXQUUwMDEzRSBUaGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5IGZvciB0aGUgRWRpdCBNb2RlbCBcInswfVwiIGNvbnRhaW5zIGEgY3ljbGUuIFBsZWFzZSBjb3JyZWN0IHRoZSBlbnRyaWVzIGluIHlvdXIgcGx1Z2luLnhtbCBmaWxlcy4KK0VkaXRNb2RlbFJlZ2lzdHJ5X0VSUk9SXzE9SVdBRTAwMTRFIENvdWxkIG5vdCBjcmVhdGUgZmFjdG9yeSBiZWNhdXNlIElDb25maWd1cmF0aW9uRWxlbWVudCBpcyBudWxsLgorRWRpdE1vZGVsUmVnaXN0cnlfRVJST1JfMj1JV0FFMDAxNUUgTm8gRWRpdE1vZGVsRmFjdG9yeSBmb3Iga2V5IFwiezB9XCIKK1NuYXBzaG90X0VSUk9SXzA9SVdBRTAwMTZFIExvY2tpbmcgSW5zdXJhbmNlIFN0YWNrIFRyYWNlCitBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3JfRVJST1JfMD1JV0FFMDAxN0UgQSBwYWNrYWdlVVJJIGlzIHJlcXVpcmVkIGZvciBhbGwgQWRhcHRlciBGYWN0b3JpZXMKK0FkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvcl9FUlJPUl8xPUlXQUUwMDE4RSBBbiBpZCBpcyByZXF1aXJlZCBmb3IgYWxsIEFkYXB0ZXIgRmFjdG9yaWVzLiBDaGVjayBhbGwgYWRhcHRlciBmYWN0b3JpZXMgZGVmaW5lZCBpbiBcInswfVwiLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9yb3NlL01vZHVsZUNvcmUuZ2VubW9kZWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3Jvc2UvTW9kdWxlQ29yZS5nZW5tb2RlbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDZiZGRkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9yb3NlL01vZHVsZUNvcmUuZ2VubW9kZWwKQEAgLTAsMCArMSw0NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIgorICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCisgICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjIgorICAgIGVkaXREaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lZGl0L3NyYyIgZWRpdG9yRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZWRpdG9yL3NyYyIKKyAgICBtb2RlbFBsdWdpbklEPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiIgcnVudGltZUphcj0idHJ1ZSIKKyAgICBtb2RlbE5hbWU9IlByb2plY3RNb2R1bGUiIGVkaXRQbHVnaW5DbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnByb2plY3Rtb2R1bGUucHJvdmlkZXIuTW9kdWxlQ29yZUVkaXRQbHVnaW4iCisgICAgZWRpdG9yUGx1Z2luQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC5wcm9qZWN0bW9kdWxlLnByZXNlbnRhdGlvbi5Nb2R1bGVDb3JlRWRpdG9yUGx1Z2luIgorICAgIHJ1bnRpbWVDb21wYXRpYmlsaXR5PSJmYWxzZSI+CisgIDxmb3JlaWduTW9kZWw+bW9kdWxlQ29yZS5tZGw8L2ZvcmVpZ25Nb2RlbD4KKyAgPGZvcmVpZ25Nb2RlbD5XT1JLU1BBQ0VfUk9PVDwvZm9yZWlnbk1vZGVsPgorICA8Zm9yZWlnbk1vZGVsPkQ6XHdvcmtcV1RQPC9mb3JlaWduTW9kZWw+CisgIDxnZW5QYWNrYWdlcyBwcmVmaXg9Ik1vZHVsZUNvcmUiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgorICAgICAgZWNvcmVQYWNrYWdlPSJtb2R1bGVDb3JlLmVjb3JlIy8iPgorICAgIDxnZW5FbnVtcyBlY29yZUVudW09Im1vZHVsZUNvcmUuZWNvcmUjLy9EZXBlbmRlbmN5VHlwZSI+CisgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im1vZHVsZUNvcmUuZWNvcmUjLy9EZXBlbmRlbmN5VHlwZS91c2VzIi8+CisgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im1vZHVsZUNvcmUuZWNvcmUjLy9EZXBlbmRlbmN5VHlwZS9jb25zdW1lcyIvPgorICAgIDwvZ2VuRW51bXM+CisgICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtb2R1bGVDb3JlLmVjb3JlIy8vVVJJIi8+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibW9kdWxlQ29yZS5lY29yZSMvL1dvcmtiZW5jaE1vZHVsZSI+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1vZHVsZUNvcmUuZWNvcmUjLy9Xb3JrYmVuY2hNb2R1bGUvaGFuZGxlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbW9kdWxlQ29yZS5lY29yZSMvL1dvcmtiZW5jaE1vZHVsZS9kZXBsb3llZE5hbWUiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtb2R1bGVDb3JlLmVjb3JlIy8vV29ya2JlbmNoTW9kdWxlL3Jlc291cmNlcyIvPgorICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1vZHVsZUNvcmUuZWNvcmUjLy9Xb3JrYmVuY2hNb2R1bGUvbW9kdWxlVHlwZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1vZHVsZUNvcmUuZWNvcmUjLy9Xb3JrYmVuY2hNb2R1bGUvbW9kdWxlcyIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtb2R1bGVDb3JlLmVjb3JlIy8vV29ya2JlbmNoTW9kdWxlUmVzb3VyY2UiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1vZHVsZUNvcmUuZWNvcmUjLy9Xb3JrYmVuY2hNb2R1bGVSZXNvdXJjZS9zb3VyY2VQYXRoIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbW9kdWxlQ29yZS5lY29yZSMvL1dvcmtiZW5jaE1vZHVsZVJlc291cmNlL2RlcGxveWVkUGF0aCIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1vZHVsZUNvcmUuZWNvcmUjLy9Xb3JrYmVuY2hNb2R1bGVSZXNvdXJjZS9leGNsdXNpb25zIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1vZHVsZUNvcmUuZWNvcmUjLy9Xb3JrYmVuY2hNb2R1bGVSZXNvdXJjZS9tb2R1bGUiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibW9kdWxlQ29yZS5lY29yZSMvL01vZHVsZVR5cGUiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1vZHVsZUNvcmUuZWNvcmUjLy9Nb2R1bGVUeXBlL21ldGFkYXRhUmVzb3VyY2VzIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbW9kdWxlQ29yZS5lY29yZSMvL01vZHVsZVR5cGUvbW9kdWxlVHlwZUlkIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1vZHVsZUNvcmUuZWNvcmUjLy9Qcm9qZWN0TW9kdWxlcyI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbW9kdWxlQ29yZS5lY29yZSMvL1Byb2plY3RNb2R1bGVzL3Byb2plY3ROYW1lIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1vZHVsZUNvcmUuZWNvcmUjLy9Qcm9qZWN0TW9kdWxlcy93b3JrYmVuY2hNb2R1bGVzIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1vZHVsZUNvcmUuZWNvcmUjLy9EZXBlbmRlbnRNb2R1bGUiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1vZHVsZUNvcmUuZWNvcmUjLy9EZXBlbmRlbnRNb2R1bGUvaGFuZGxlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbW9kdWxlQ29yZS5lY29yZSMvL0RlcGVuZGVudE1vZHVsZS9kZXBsb3llZFBhdGgiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtb2R1bGVDb3JlLmVjb3JlIy8vRGVwZW5kZW50TW9kdWxlL2RlcGVuZGVuY3lUeXBlIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICA8L2dlblBhY2thZ2VzPgorPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcm9zZS9tb2R1bGVDb3JlLmNhdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcm9zZS9tb2R1bGVDb3JlLmNhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzBmNWI4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9yb3NlL21vZHVsZUNvcmUuY2F0CkBAIC0wLDAgKzEsMTA2NSBAQAorDQorKG9iamVjdCBQZXRhbA0KKyAgICB2ZXJzaW9uICAgIAk1MA0KKyAgICBfd3JpdHRlbiAgIAkiUm9zZSA4LjMuMDQwNy4yODAwIg0KKyAgICBjaGFyU2V0ICAgIAkwKQ0KKw0KKyhvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIm1vZHVsZUNvcmUiDQorICAgIGlzX3VuaXQgICAgCVRSVUUNCisgICAgaXNfbG9hZGVkICAJVFJVRQ0KKyAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCShvYmplY3QgQXR0cmlidXRlDQorCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQorCSAgICBuYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiDQorCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbiIpKQ0KKwkob2JqZWN0IEF0dHJpYnV0ZQ0KKwkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KKwkgICAgbmFtZSAgICAgICAJInByZWZpeCINCisJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJNb2R1bGVDb3JlIikpDQorCShvYmplY3QgQXR0cmlidXRlDQorCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQorCSAgICBuYW1lICAgICAgIAkibnNVUkkiDQorCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAibW9kdWxlY29yZS54bWkiKSkpDQorICAgIHF1aWQgICAgICAgCSIzQTBEQjY4QjAwNDYiDQorICAgIHZpc2libGVfY2F0ZWdvcmllcyAJKGxpc3QgdmlzaWJpbGl0eV9yZWxhdGlvbnNoaXBfbGlzdA0KKwkob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwDQorCSAgICBxdWlkICAgICAgIAkiM0YyRTgyMzYwMjVBIg0KKwkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWpiZXh0Ig0KKwkgICAgcXVpZHUgICAgICAJIjM5QUE4NjY2MDE5MCIpDQorCShvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXANCisJICAgIHF1aWQgICAgICAgCSIzRjJFODIzNjAyNUIiDQorCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3ZWJhcHBleHQiDQorCSAgICBxdWlkdSAgICAgIAkiMzlCNTM0RkQwMjRDIikNCisJKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcA0KKwkgICAgcXVpZCAgICAgICAJIjNGMkU4MjM2MDI1QyINCisJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVqYmJuZCINCisJICAgIHF1aWR1ICAgICAgCSIzOUI5NjBGQzAzQ0EiKQ0KKwkob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwDQorCSAgICBxdWlkICAgICAgIAkiM0YyRTgyMzYwMjY0Ig0KKwkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d2ViYXBwYm5kIg0KKwkgICAgcXVpZHUgICAgICAJIjM5Qjk2MTA2MDEwNyIpDQorCShvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXANCisJICAgIHF1aWQgICAgICAgCSIzRjJFODIzNjAyNjUiDQorCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpjbGllbnRibmQiDQorCSAgICBxdWlkdSAgICAgIAkiMzlCOTYxNEYwMzFGIikNCisJKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcA0KKwkgICAgcXVpZCAgICAgICAJIjNGMkU4MjM2MDI2NiINCisJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmFwcGxpY2F0aW9uZXh0Ig0KKwkgICAgcXVpZHUgICAgICAJIjNBMjJFNjA4MDMwMyIpDQorCShvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXANCisJICAgIHF1aWQgICAgICAgCSIzRjJFODIzNjAyNjciDQorCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjphcHBsaWNhdGlvbmJuZCINCisJICAgIHF1aWR1ICAgICAgCSIzOUI5NjExNTAyQTQiKQ0KKwkob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwDQorCSAgICBxdWlkICAgICAgIAkiM0YyRTgyMzYwMjY4Ig0KKwkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ajJjYm5kIg0KKwkgICAgcXVpZHUgICAgICAJIjM5Qjk2MzJFMDM4QyIpKQ0KKyAgICBleHBvcnRDb250cm9sIAkiUHVibGljIg0KKyAgICBsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KKwkob2JqZWN0IENsYXNzICJXb3JrYmVuY2hNb2R1bGUiDQorCSAgICBxdWlkICAgICAgIAkiNDFFM0RGNTgwMUZBIg0KKwkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCisJCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImhhbmRsZSINCisJCSAgICBxdWlkICAgICAgIAkiNDFFQzFENzEwMTVEIg0KKwkJICAgIHR5cGUgICAgICAgCSJVUkkiDQorCQkgICAgcXVpZHUgICAgICAJIjQxRUMyNkRBMDI3QSINCisJCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCisJCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlcGxveWVkTmFtZSINCisJCSAgICBxdWlkICAgICAgIAkiNDIwMTQ3MUQwMjA4Ig0KKwkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQorCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCisJKG9iamVjdCBDbGFzcyAiV29ya2JlbmNoTW9kdWxlUmVzb3VyY2UiDQorCSAgICBxdWlkICAgICAgIAkiNDFFM0RGNjcwMDM5Ig0KKwkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCisJCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNvdXJjZVBhdGgiDQorCQkgICAgcXVpZCAgICAgICAJIjQxRTNERjk3MDEyOCINCisJCSAgICB0eXBlICAgICAgIAkiVVJJIg0KKwkJICAgIHF1aWR1ICAgICAgCSI0MUVDMjZEQTAyN0EiDQorCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQorCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZXBsb3llZFBhdGgiDQorCQkgICAgcXVpZCAgICAgICAJIjQxRUVDNjQwMDI1QiINCisJCSAgICB0eXBlICAgICAgIAkiVVJJIg0KKwkJICAgIHF1aWR1ICAgICAgCSI0MUVDMjZEQTAyN0EiDQorCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQorCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJleGNsdXNpb25zIg0KKwkJICAgIHF1aWQgICAgICAgCSI0MUUzREY5RTAxMUUiDQorCQkgICAgc3RlcmVvdHlwZSAJIjAuLioiDQorCQkgICAgdHlwZSAgICAgICAJIlVSSSINCisJCSAgICBxdWlkdSAgICAgIAkiNDFFQzI2REEwMjdBIg0KKwkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQorCShvYmplY3QgQ2xhc3MgIk1vZHVsZVR5cGUiDQorCSAgICBxdWlkICAgICAgIAkiNDFFQzFENTEwM0UyIg0KKwkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCisJCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1ldGFkYXRhUmVzb3VyY2VzIg0KKwkJICAgIHF1aWQgICAgICAgCSI0MUVDMURGMDAyMUUiDQorCQkgICAgc3RlcmVvdHlwZSAJIjAuLioiDQorCQkgICAgdHlwZSAgICAgICAJIlVSSSINCisJCSAgICBxdWlkdSAgICAgIAkiNDFFQzI2REEwMjdBIg0KKwkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KKwkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibW9kdWxlVHlwZUlkIg0KKwkJICAgIHF1aWQgICAgICAgCSI0MUVDMjEzNDAzNTciDQorCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCisJCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KKwkob2JqZWN0IENsYXNzICJVUkkiDQorCSAgICBxdWlkICAgICAgIAkiNDFFQzI2REEwMjdBIg0KKwkgICAgc3RlcmVvdHlwZSAJImRhdGF0eXBlIg0KKwkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCisJCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkiDQorCQkgICAgcXVpZCAgICAgICAJIjQxRUMyNzA4MDNBQyINCisJCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIg0KKwkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQorCShvYmplY3QgQ2xhc3MgIlByb2plY3RNb2R1bGVzIg0KKwkgICAgcXVpZCAgICAgICAJIjQxRjU2NkRCMDI1MSINCisJICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQorCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm9qZWN0TmFtZSINCisJCSAgICBxdWlkICAgICAgIAkiNDFGNTY3RkQwMjNBIg0KKwkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQorCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCisJKG9iamVjdCBDbGFzcyAiRGVwZW5kZW50TW9kdWxlIg0KKwkgICAgcXVpZCAgICAgICAJIjQxRjZDMjRCMDIzRCINCisJICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQorCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJoYW5kbGUiDQorCQkgICAgcXVpZCAgICAgICAJIjQyMDE0NUYwMDFDOSINCisJCSAgICB0eXBlICAgICAgIAkiVVJJIg0KKwkJICAgIHF1aWR1ICAgICAgCSI0MUVDMjZEQTAyN0EiDQorCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQorCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZXBsb3llZFBhdGgiDQorCQkgICAgcXVpZCAgICAgICAJIjQyMDE0NUZBMDAxNSINCisJCSAgICB0eXBlICAgICAgIAkiVVJJIg0KKwkJICAgIHF1aWR1ICAgICAgCSI0MUVDMjZEQTAyN0EiDQorCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQorCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZXBlbmRlbmN5VHlwZSINCisJCSAgICBxdWlkICAgICAgIAkiNDIwMzkyNDMwMTZFIg0KKwkJICAgIHR5cGUgICAgICAgCSJEZXBlbmRlbmN5VHlwZSINCisJCSAgICBxdWlkdSAgICAgIAkiNDIwMzk0RjUwMTg1Ig0KKwkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQorCShvYmplY3QgQ2xhc3MgIkRlcGVuZGVuY3lUeXBlIg0KKwkgICAgcXVpZCAgICAgICAJIjQyMDM5NEY1MDE4NSINCisJICAgIGRvY3VtZW50YXRpb24gCQ0KK3x1c2VzPTANCit8Y29uc3VtZXM9MQ0KKwkgICAgDQorCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iDQorCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KKwkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidXNlcyINCisJCSAgICBxdWlkICAgICAgIAkiNDIwMzk5MzgwMThEIg0KKwkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KKwkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29uc3VtZXMiDQorCQkgICAgcXVpZCAgICAgICAJIjQyMDM5QTZFMDEzOSINCisJCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KKwkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQwIg0KKwkgICAgcXVpZCAgICAgICAJIjQxRTNFMTRCMDFFMyINCisJICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KKwkJKG9iamVjdCBSb2xlICJyZXNvdXJjZXMiDQorCQkgICAgcXVpZCAgICAgICAJIjQxRTNFMTREMDMxRCINCisJCSAgICBsYWJlbCAgICAgIAkicmVzb3VyY2VzIg0KKwkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om1vZHVsZUNvcmU6OldvcmtiZW5jaE1vZHVsZVJlc291cmNlIg0KKwkJICAgIHF1aWR1ICAgICAgCSI0MUUzREY2NzAwMzkiDQorCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLioiKQ0KKwkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQorCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KKwkJKG9iamVjdCBSb2xlICJtb2R1bGUiDQorCQkgICAgcXVpZCAgICAgICAJIjQxRTNFMTREMDMxRiINCisJCSAgICBsYWJlbCAgICAgIAkibW9kdWxlIg0KKwkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om1vZHVsZUNvcmU6OldvcmtiZW5jaE1vZHVsZSINCisJCSAgICBxdWlkdSAgICAgIAkiNDFFM0RGNTgwMUZBIg0KKwkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCisJCSAgICBpc19uYXZpZ2FibGUgCVRSVUUNCisJCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkNCisJKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMSINCisJICAgIHF1aWQgICAgICAgCSI0MUVDMUQ5ODAyQzIiDQorCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCisJCShvYmplY3QgUm9sZSAibW9kdWxlVHlwZSINCisJCSAgICBxdWlkICAgICAgIAkiNDFFQzFEOTkwMjQxIg0KKwkJICAgIGxhYmVsICAgICAgCSJtb2R1bGVUeXBlIg0KKwkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om1vZHVsZUNvcmU6Ok1vZHVsZVR5cGUiDQorCQkgICAgcXVpZHUgICAgICAJIjQxRUMxRDUxMDNFMiINCisJCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQorCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KKwkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyIg0KKwkJICAgIHF1aWQgICAgICAgCSI0MUVDMUQ5OTAyNDMiDQorCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6bW9kdWxlQ29yZTo6V29ya2JlbmNoTW9kdWxlIg0KKwkJICAgIHF1aWR1ICAgICAgCSI0MUUzREY1ODAxRkEiKSkpDQorCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMiDQorCSAgICBxdWlkICAgICAgIAkiNDFGNTY3MjAwMEU4Ig0KKwkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQorCQkob2JqZWN0IFJvbGUgIndvcmtiZW5jaE1vZHVsZXMiDQorCQkgICAgcXVpZCAgICAgICAJIjQxRjU2NzIxMDExMSINCisJCSAgICBsYWJlbCAgICAgIAkid29ya2JlbmNoTW9kdWxlcyINCisJCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojptb2R1bGVDb3JlOjpXb3JrYmVuY2hNb2R1bGUiDQorCQkgICAgcXVpZHUgICAgICAJIjQxRTNERjU4MDFGQSINCisJCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uKiIpDQorCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCisJCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQorCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQiDQorCQkgICAgcXVpZCAgICAgICAJIjQxRjU2NzIxMDExMyINCisJCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojptb2R1bGVDb3JlOjpQcm9qZWN0TW9kdWxlcyINCisJCSAgICBxdWlkdSAgICAgIAkiNDFGNTY2REIwMjUxIg0KKwkJICAgIENvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIg0KKwkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KKwkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1Ig0KKwkgICAgcXVpZCAgICAgICAJIjQyMDE0NkE1MDJFMiINCisJICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KKwkJKG9iamVjdCBSb2xlICJtb2R1bGVzIg0KKwkJICAgIHF1aWQgICAgICAgCSI0MjAxNDZBNjAyN0YiDQorCQkgICAgbGFiZWwgICAgICAJIm1vZHVsZXMiDQorCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6bW9kdWxlQ29yZTo6RGVwZW5kZW50TW9kdWxlIg0KKwkJICAgIHF1aWR1ICAgICAgCSI0MUY2QzI0QjAyM0QiDQorCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLioiKQ0KKwkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCisJCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNiINCisJCSAgICBxdWlkICAgICAgIAkiNDIwMTQ2QTYwMjgxIg0KKwkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om1vZHVsZUNvcmU6OldvcmtiZW5jaE1vZHVsZSINCisJCSAgICBxdWlkdSAgICAgIAkiNDFFM0RGNTgwMUZBIikpKSkNCisgICAgbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQorCShvYmplY3QgQ2xhc3NEaWFncmFtICJNYWluIg0KKwkgICAgcXVpZCAgICAgICAJIjQxRTNERjA2MDIxMCINCisJICAgIHRpdGxlICAgICAgCSJNYWluIg0KKwkgICAgem9vbSAgICAgICAJMTAwDQorCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KKwkgICAgbWF4X3dpZHRoICAJMjE2MDANCisJICAgIG9yaWdpbl94ICAgCTEwMA0KKwkgICAgb3JpZ2luX3kgICAJMA0KKwkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCisJCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bW9kdWxlQ29yZTo6VVJJIiBAMQ0KKwkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQorCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KKwkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCisJCSAgICBsb2NhdGlvbiAgIAkoMTkyMCwgMTY0OCkNCisJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCisJCQlzaXplICAgICAgIAkxMA0KKwkJCWZhY2UgICAgICAgCSJBcmlhbCINCisJCQlib2xkICAgICAgIAlGQUxTRQ0KKwkJCWl0YWxpY3MgICAgCUZBTFNFDQorCQkJdW5kZXJsaW5lICAJRkFMU0UNCisJCQlzdHJpa2UgICAgIAlGQUxTRQ0KKwkJCWNvbG9yICAgICAgCTANCisJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KKwkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQorCQkJUGFyZW50X1ZpZXcgCUAxDQorCQkJbG9jYXRpb24gICAJKDE0NjAsIDE1ODkpDQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCisJCQlubGluZXMgICAgIAkxDQorCQkJbWF4X3dpZHRoICAJOTIwDQorCQkJanVzdGlmeSAgICAJMA0KKwkJCWxhYmVsICAgICAgCSJVUkkiKQ0KKwkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsDQorCQkJUGFyZW50X1ZpZXcgCUAxDQorCQkJbG9jYXRpb24gICAJKDE0NjAsIDE1MzkpDQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCisJCQlhbmNob3IgICAgIAkxMA0KKwkJCW5saW5lcyAgICAgCTENCisJCQltYXhfd2lkdGggIAk5MjANCisJCQlqdXN0aWZ5ICAgIAkwDQorCQkJbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpDQorCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQorCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KKwkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQorCQkgICAgcXVpZHUgICAgICAJIjQxRUMyNkRBMDI3QSINCisJCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KKwkJCVBhcmVudF9WaWV3IAlAMQ0KKwkJCWxvY2F0aW9uICAgCSgxNDYwLCAxNjUwKQ0KKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KKwkJCSAgICBzaXplICAgICAgIAkxMA0KKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQorCQkJICAgIGNvbG9yICAgICAgCTANCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCisJCQlpY29uX3N0eWxlIAkiSWNvbiINCisJCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KKwkJCWFuY2hvciAgICAgCTINCisJCQlubGluZXMgICAgIAkyDQorCQkJbWF4X3dpZHRoICAJOTI1KQ0KKwkJICAgIHdpZHRoICAgICAgCTkzOA0KKwkJICAgIGhlaWdodCAgICAgCTI0Mg0KKwkJICAgIGFubm90YXRpb24gCTgNCisJCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KKwkJKG9iamVjdCBOb3RlVmlldyBAMg0KKwkJICAgIGxvY2F0aW9uICAgCSg0NDgsIDEyNjQpDQorCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQorCQkJc2l6ZSAgICAgICAJMTANCisJCQlmYWNlICAgICAgIAkiQXJpYWwiDQorCQkJYm9sZCAgICAgICAJRkFMU0UNCisJCQlpdGFsaWNzICAgIAlGQUxTRQ0KKwkJCXVuZGVybGluZSAgCUZBTFNFDQorCQkJc3RyaWtlICAgICAJRkFMU0UNCisJCQljb2xvciAgICAgIAkwDQorCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCisJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KKwkJCVBhcmVudF9WaWV3IAlAMg0KKwkJCWxvY2F0aW9uICAgCSgxNzYsIDEwNTUpDQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCisJCQlubGluZXMgICAgIAk4DQorCQkJbWF4X3dpZHRoICAJNTA4DQorCQkJbGFiZWwgICAgICAJDQorfFRoZSBtb2R1bGUgImhhbmRsZSIgVVJJIHdpbGwgY29udGFpbiB0aGUgc3BlY2lhbCBNb2R1bGUgcHJvdG9jb2wsIHByb2plY3QgbmFtZSwgYW5kIG1vZHVsZSBpZGVudGlmaWVyLCBhbmQgd2lsbCBiZSBmdWxseSByZXNvbHZlZCB0byBhIGZ1bGwgcGxhdGZvcm0gVVJJDQorCQkJKQ0KKwkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCisJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KKwkJICAgIHdpZHRoICAgICAgCTU2OA0KKwkJICAgIGhlaWdodCAgICAgCTQzMSkNCisJCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bW9kdWxlQ29yZTo6V29ya2JlbmNoTW9kdWxlUmVzb3VyY2UiIEAzDQorCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCisJCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQorCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KKwkJICAgIGxvY2F0aW9uICAgCSg5OTIsIDE3NDQpDQorCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQorCQkJc2l6ZSAgICAgICAJMTANCisJCQlmYWNlICAgICAgIAkiQXJpYWwiDQorCQkJYm9sZCAgICAgICAJRkFMU0UNCisJCQlpdGFsaWNzICAgIAlGQUxTRQ0KKwkJCXVuZGVybGluZSAgCUZBTFNFDQorCQkJc3RyaWtlICAgICAJRkFMU0UNCisJCQljb2xvciAgICAgIAkwDQorCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCisJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KKwkJCVBhcmVudF9WaWV3IAlAMw0KKwkJCWxvY2F0aW9uICAgCSg3MTQsIDE2MTMpDQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCisJCQlubGluZXMgICAgIAkxDQorCQkJbWF4X3dpZHRoICAJNTU2DQorCQkJanVzdGlmeSAgICAJMA0KKwkJCWxhYmVsICAgICAgCSJXb3JrYmVuY2hNb2R1bGVSZXNvdXJjZSIpDQorCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQorCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KKwkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQorCQkgICAgcXVpZHUgICAgICAJIjQxRTNERjY3MDAzOSINCisJCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KKwkJCVBhcmVudF9WaWV3IAlAMw0KKwkJCWxvY2F0aW9uICAgCSg3MTQsIDE2NzQpDQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQorCQkJICAgIHNpemUgICAgICAgCTEwDQorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCisJCQkgICAgY29sb3IgICAgICAJMA0KKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KKwkJCWljb25fc3R5bGUgCSJJY29uIg0KKwkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQorCQkJYW5jaG9yICAgICAJMg0KKwkJCW5saW5lcyAgICAgCTQNCisJCQltYXhfd2lkdGggIAk1MzEpDQorCQkgICAgd2lkdGggICAgICAJNTc0DQorCQkgICAgaGVpZ2h0ICAgICAJMjg2DQorCQkgICAgYW5ub3RhdGlvbiAJOA0KKwkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQorCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1vZHVsZUNvcmU6Ok1vZHVsZVR5cGUiIEA0DQorCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCisJCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQorCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KKwkJICAgIGxvY2F0aW9uICAgCSgxODU2LCAxMTM2KQ0KKwkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KKwkJCXNpemUgICAgICAgCTEwDQorCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KKwkJCWJvbGQgICAgICAgCUZBTFNFDQorCQkJaXRhbGljcyAgICAJRkFMU0UNCisJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KKwkJCXN0cmlrZSAgICAgCUZBTFNFDQorCQkJY29sb3IgICAgICAJMA0KKwkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQorCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCisJCQlQYXJlbnRfVmlldyAJQDQNCisJCQlsb2NhdGlvbiAgIAkoMTUwOSwgMTAzMCkNCisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KKwkJCW5saW5lcyAgICAgCTENCisJCQltYXhfd2lkdGggIAk2OTQNCisJCQlqdXN0aWZ5ICAgIAkwDQorCQkJbGFiZWwgICAgICAJIk1vZHVsZVR5cGUiKQ0KKwkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KKwkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCisJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KKwkJICAgIHF1aWR1ICAgICAgCSI0MUVDMUQ1MTAzRTIiDQorCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCisJCQlQYXJlbnRfVmlldyAJQDQNCisJCQlsb2NhdGlvbiAgIAkoMTUwOSwgMTA5MSkNCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCisJCQkgICAgc2l6ZSAgICAgICAJMTANCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KKwkJCSAgICBjb2xvciAgICAgIAkwDQorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQorCQkJaWNvbl9zdHlsZSAJIkljb24iDQorCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCisJCQlhbmNob3IgICAgIAkyDQorCQkJbmxpbmVzICAgICAJMw0KKwkJCW1heF93aWR0aCAgCTcwMCkNCisJCSAgICB3aWR0aCAgICAgIAk3MTINCisJCSAgICBoZWlnaHQgICAgIAkyMzYNCisJCSAgICBhbm5vdGF0aW9uIAk4DQorCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCisJCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bW9kdWxlQ29yZTo6UHJvamVjdE1vZHVsZXMiIEA1DQorCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCisJCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQorCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KKwkJICAgIGxvY2F0aW9uICAgCSg0MTYsIDM2OCkNCisJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCisJCQlzaXplICAgICAgIAkxMA0KKwkJCWZhY2UgICAgICAgCSJBcmlhbCINCisJCQlib2xkICAgICAgIAlGQUxTRQ0KKwkJCWl0YWxpY3MgICAgCUZBTFNFDQorCQkJdW5kZXJsaW5lICAJRkFMU0UNCisJCQlzdHJpa2UgICAgIAlGQUxTRQ0KKwkJCWNvbG9yICAgICAgCTANCisJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KKwkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQorCQkJUGFyZW50X1ZpZXcgCUA1DQorCQkJbG9jYXRpb24gICAJKDIwNCwgMjg3KQ0KKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQorCQkJbmxpbmVzICAgICAJMQ0KKwkJCW1heF93aWR0aCAgCTQyNA0KKwkJCWp1c3RpZnkgICAgCTANCisJCQlsYWJlbCAgICAgIAkiUHJvamVjdE1vZHVsZXMiKQ0KKwkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KKwkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCisJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KKwkJICAgIHF1aWR1ICAgICAgCSI0MUY1NjZEQjAyNTEiDQorCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCisJCQlQYXJlbnRfVmlldyAJQDUNCisJCQlsb2NhdGlvbiAgIAkoMjA0LCAzNDgpDQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQorCQkJICAgIHNpemUgICAgICAgCTEwDQorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCisJCQkgICAgY29sb3IgICAgICAJMA0KKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KKwkJCWljb25fc3R5bGUgCSJJY29uIg0KKwkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQorCQkJYW5jaG9yICAgICAJMg0KKwkJCW5saW5lcyAgICAgCTINCisJCQltYXhfd2lkdGggIAk0MzEpDQorCQkgICAgd2lkdGggICAgICAJNDQyDQorCQkgICAgaGVpZ2h0ICAgICAJMTg2DQorCQkgICAgYW5ub3RhdGlvbiAJOA0KKwkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQorCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1vZHVsZUNvcmU6OkRlcGVuZGVudE1vZHVsZSIgQDYNCisJCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KKwkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCisJCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQorCQkgICAgbG9jYXRpb24gICAJKDE4MjQsIDQ4MCkNCisJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCisJCQlzaXplICAgICAgIAkxMA0KKwkJCWZhY2UgICAgICAgCSJBcmlhbCINCisJCQlib2xkICAgICAgIAlGQUxTRQ0KKwkJCWl0YWxpY3MgICAgCUZBTFNFDQorCQkJdW5kZXJsaW5lICAJRkFMU0UNCisJCQlzdHJpa2UgICAgIAlGQUxTRQ0KKwkJCWNvbG9yICAgICAgCTANCisJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KKwkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQorCQkJUGFyZW50X1ZpZXcgCUA2DQorCQkJbG9jYXRpb24gICAJKDE0NzAsIDM0OSkNCisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KKwkJCW5saW5lcyAgICAgCTENCisJCQltYXhfd2lkdGggIAk3MDgNCisJCQlqdXN0aWZ5ICAgIAkwDQorCQkJbGFiZWwgICAgICAJIkRlcGVuZGVudE1vZHVsZSIpDQorCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQorCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KKwkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQorCQkgICAgcXVpZHUgICAgICAJIjQxRjZDMjRCMDIzRCINCisJCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KKwkJCVBhcmVudF9WaWV3IAlANg0KKwkJCWxvY2F0aW9uICAgCSgxNDcwLCA0MTApDQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQorCQkJICAgIHNpemUgICAgICAgCTEwDQorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCisJCQkgICAgY29sb3IgICAgICAJMA0KKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KKwkJCWljb25fc3R5bGUgCSJJY29uIg0KKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQorCQkJYW5jaG9yICAgICAJMg0KKwkJCW5saW5lcyAgICAgCTQNCisJCQltYXhfd2lkdGggIAk3MTUpDQorCQkgICAgd2lkdGggICAgICAJNzI2DQorCQkgICAgaGVpZ2h0ICAgICAJMjg2DQorCQkgICAgYW5ub3RhdGlvbiAJOA0KKwkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQorCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1vZHVsZUNvcmU6OldvcmtiZW5jaE1vZHVsZSIgQDcNCisJCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KKwkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCisJCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQorCQkgICAgbG9jYXRpb24gICAJKDk0NCwgNzUyKQ0KKwkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KKwkJCXNpemUgICAgICAgCTEwDQorCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KKwkJCWJvbGQgICAgICAgCUZBTFNFDQorCQkJaXRhbGljcyAgICAJRkFMU0UNCisJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KKwkJCXN0cmlrZSAgICAgCUZBTFNFDQorCQkJY29sb3IgICAgICAJMA0KKwkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQorCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCisJCQlQYXJlbnRfVmlldyAJQDcNCisJCQlsb2NhdGlvbiAgIAkoNzEyLCA2NDYpDQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCisJCQlubGluZXMgICAgIAkxDQorCQkJbWF4X3dpZHRoICAJNDY0DQorCQkJanVzdGlmeSAgICAJMA0KKwkJCWxhYmVsICAgICAgCSJXb3JrYmVuY2hNb2R1bGUiKQ0KKwkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KKwkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCisJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KKwkJICAgIHF1aWR1ICAgICAgCSI0MUUzREY1ODAxRkEiDQorCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCisJCQlQYXJlbnRfVmlldyAJQDcNCisJCQlsb2NhdGlvbiAgIAkoNzEyLCA3MDcpDQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQorCQkJICAgIHNpemUgICAgICAgCTEwDQorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCisJCQkgICAgY29sb3IgICAgICAJMA0KKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KKwkJCWljb25fc3R5bGUgCSJJY29uIg0KKwkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQorCQkJYW5jaG9yICAgICAJMg0KKwkJCW5saW5lcyAgICAgCTMNCisJCQltYXhfd2lkdGggIAk0NzEpDQorCQkgICAgd2lkdGggICAgICAJNDgyDQorCQkgICAgaGVpZ2h0ICAgICAJMjM2DQorCQkgICAgYW5ub3RhdGlvbiAJOA0KKwkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQorCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMCIgQDgNCisJCSAgICBsb2NhdGlvbiAgIAkoOTQwLCAxMjM1KQ0KKwkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KKwkJCXNpemUgICAgICAgCTEwDQorCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KKwkJCWJvbGQgICAgICAgCUZBTFNFDQorCQkJaXRhbGljcyAgICAJRkFMU0UNCisJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KKwkJCXN0cmlrZSAgICAgCUZBTFNFDQorCQkJY29sb3IgICAgICAJMA0KKwkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQorCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KKwkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCisJCSAgICBxdWlkdSAgICAgIAkiNDFFM0UxNEIwMUUzIg0KKwkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KKwkJCShvYmplY3QgUm9sZVZpZXcgInJlc291cmNlcyIgQDkNCisJCQkgICAgUGFyZW50X1ZpZXcgCUA4DQorCQkJICAgIGxvY2F0aW9uICAgCSg0NjAsIDM1NSkNCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQorCQkJCXNpemUgICAgICAgCTEwDQorCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCisJCQkJYm9sZCAgICAgICAJRkFMU0UNCisJCQkJaXRhbGljcyAgICAJRkFMU0UNCisJCQkJdW5kZXJsaW5lICAJRkFMU0UNCisJCQkJc3RyaWtlICAgICAJRkFMU0UNCisJCQkJY29sb3IgICAgICAJMA0KKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KKwkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMA0KKwkJCQlQYXJlbnRfVmlldyAJQDkNCisJCQkJbG9jYXRpb24gICAJKDEwNzUsIDE1MDEpDQorCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KKwkJCQkgICAgc2l6ZSAgICAgICAJMTANCisJCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCisJCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQorCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KKwkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCisJCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQorCQkJCSAgICBjb2xvciAgICAgIAkwDQorCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KKwkJCQlhbmNob3IgICAgIAkxDQorCQkJCWFuY2hvcl9sb2MgCTENCisJCQkJbmxpbmVzICAgICAJMQ0KKwkJCQltYXhfd2lkdGggIAkyMTYNCisJCQkJanVzdGlmeSAgICAJMA0KKwkJCQlsYWJlbCAgICAgIAkiK3Jlc291cmNlcyINCisJCQkJcGN0RGlzdCAgICAJMC43MjY3NzYNCisJCQkJaGVpZ2h0ICAgICAJMTM1DQorCQkJCW9yaWVudGF0aW9uIAkwKQ0KKwkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCisJCQkgICAgcXVpZHUgICAgICAJIjQxRTNFMTREMDMxRCINCisJCQkgICAgY2xpZW50ICAgICAJQDgNCisJCQkgICAgc3VwcGxpZXIgICAJQDMNCisJCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQorCQkJCSg5NDAsIDEyMzUpDQorCQkJCSg5NDAsIDE2MDEpKQ0KKwkJCSAgICBsaW5lX3N0eWxlIAkzDQorCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTQwLCAxMjM1KQ0KKwkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTQwLCAxNjAxKQ0KKwkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMQ0KKwkJCQlQYXJlbnRfVmlldyAJQDkNCisJCQkJbG9jYXRpb24gICAJKDg2MSwgMTQ5NSkNCisJCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQorCQkJCSAgICBzaXplICAgICAgIAkxMA0KKwkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KKwkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCisJCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQorCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KKwkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCisJCQkJICAgIGNvbG9yICAgICAgCTANCisJCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQorCQkJCWFuY2hvciAgICAgCTINCisJCQkJYW5jaG9yX2xvYyAJMQ0KKwkJCQlubGluZXMgICAgIAkxDQorCQkJCW1heF93aWR0aCAgCTE1DQorCQkJCWp1c3RpZnkgICAgCTANCisJCQkJbGFiZWwgICAgICAJIjAuLioiDQorCQkJCXBjdERpc3QgICAgCTAuNzEwMzgzDQorCQkJCWhlaWdodCAgICAgCTc5DQorCQkJCW9yaWVudGF0aW9uIAkxKSkNCisJCQkob2JqZWN0IFJvbGVWaWV3ICJtb2R1bGUiIEAxMg0KKwkJCSAgICBQYXJlbnRfVmlldyAJQDgNCisJCQkgICAgbG9jYXRpb24gICAJKDQ2MCwgMzU1KQ0KKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCisJCQkJc2l6ZSAgICAgICAJMTANCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KKwkJCQlib2xkICAgICAgIAlGQUxTRQ0KKwkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KKwkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KKwkJCQljb2xvciAgICAgIAkwDQorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQorCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzDQorCQkJCVBhcmVudF9WaWV3IAlAMTINCisJCQkJbG9jYXRpb24gICAJKDEwNDMsIDk3MikNCisJCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQorCQkJCSAgICBzaXplICAgICAgIAkxMA0KKwkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KKwkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCisJCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQorCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KKwkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCisJCQkJICAgIGNvbG9yICAgICAgCTANCisJCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQorCQkJCWFuY2hvciAgICAgCTENCisJCQkJYW5jaG9yX2xvYyAJMQ0KKwkJCQlubGluZXMgICAgIAkxDQorCQkJCW1heF93aWR0aCAgCTE3Mg0KKwkJCQlqdXN0aWZ5ICAgIAkwDQorCQkJCWxhYmVsICAgICAgCSIrbW9kdWxlIg0KKwkJCQlwY3REaXN0ICAgIAkwLjcyMDgyNA0KKwkJCQloZWlnaHQgICAgIAkxMDMNCisJCQkJb3JpZW50YXRpb24gCTEpDQorCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KKwkJCSAgICBxdWlkdSAgICAgIAkiNDFFM0UxNEQwMzFGIg0KKwkJCSAgICBjbGllbnQgICAgIAlAOA0KKwkJCSAgICBzdXBwbGllciAgIAlANw0KKwkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCisJCQkJKDk0MCwgMTIzNSkNCisJCQkJKDk0MCwgODcwKSkNCisJCQkgICAgbGluZV9zdHlsZSAJMw0KKwkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDk0MCwgMTIzNSkNCisJCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDk0MCwgODcwKQ0KKwkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNA0KKwkJCQlQYXJlbnRfVmlldyAJQDEyDQorCQkJCWxvY2F0aW9uICAgCSg4NjgsIDk3NikNCisJCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQorCQkJCSAgICBzaXplICAgICAgIAkxMA0KKwkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KKwkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCisJCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQorCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KKwkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCisJCQkJICAgIGNvbG9yICAgICAgCTANCisJCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQorCQkJCWFuY2hvciAgICAgCTINCisJCQkJYW5jaG9yX2xvYyAJMQ0KKwkJCQlubGluZXMgICAgIAkxDQorCQkJCW1heF93aWR0aCAgCTE1DQorCQkJCWp1c3RpZnkgICAgCTANCisJCQkJbGFiZWwgICAgICAJIjEiDQorCQkJCXBjdERpc3QgICAgCTAuNzA5MzgyDQorCQkJCWhlaWdodCAgICAgCTczDQorCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KKwkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEiIEAxNQ0KKwkJICAgIGxvY2F0aW9uICAgCSgxNjM0LCA3OTEpDQorCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQorCQkJc2l6ZSAgICAgICAJMTANCisJCQlmYWNlICAgICAgIAkiQXJpYWwiDQorCQkJYm9sZCAgICAgICAJRkFMU0UNCisJCQlpdGFsaWNzICAgIAlGQUxTRQ0KKwkJCXVuZGVybGluZSAgCUZBTFNFDQorCQkJc3RyaWtlICAgICAJRkFMU0UNCisJCQljb2xvciAgICAgIAkwDQorCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCisJCSAgICBzdGVyZW90eXBlIAlUUlVFDQorCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KKwkJICAgIHF1aWR1ICAgICAgCSI0MUVDMUQ5ODAyQzIiDQorCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQorCQkJKG9iamVjdCBSb2xlVmlldyAibW9kdWxlVHlwZSIgQDE2DQorCQkJICAgIFBhcmVudF9WaWV3IAlAMTUNCisJCQkgICAgbG9jYXRpb24gICAJKDEyOTgsIC0xMzcpDQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KKwkJCQlzaXplICAgICAgIAkxMA0KKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQorCQkJCWJvbGQgICAgICAgCUZBTFNFDQorCQkJCWl0YWxpY3MgICAgCUZBTFNFDQorCQkJCXVuZGVybGluZSAgCUZBTFNFDQorCQkJCXN0cmlrZSAgICAgCUZBTFNFDQorCQkJCWNvbG9yICAgICAgCTANCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCisJCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTcNCisJCQkJUGFyZW50X1ZpZXcgCUAxNg0KKwkJCQlsb2NhdGlvbiAgIAkoMjAxMCwgOTc3KQ0KKwkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCisJCQkJICAgIHNpemUgICAgICAgCTEwDQorCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQorCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KKwkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCisJCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQorCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KKwkJCQkgICAgY29sb3IgICAgICAJMA0KKwkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCisJCQkJYW5jaG9yICAgICAJMQ0KKwkJCQlhbmNob3JfbG9jIAkxDQorCQkJCW5saW5lcyAgICAgCTENCisJCQkJbWF4X3dpZHRoICAJMjYwDQorCQkJCWp1c3RpZnkgICAgCTANCisJCQkJbGFiZWwgICAgICAJIittb2R1bGVUeXBlIg0KKwkJCQlwY3REaXN0ICAgIAkwLjkxMTU3Mw0KKwkJCQloZWlnaHQgICAgIAkxNTMNCisJCQkJb3JpZW50YXRpb24gCTApDQorCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KKwkJCSAgICBxdWlkdSAgICAgIAkiNDFFQzFEOTkwMjQxIg0KKwkJCSAgICBjbGllbnQgICAgIAlAMTUNCisJCQkgICAgc3VwcGxpZXIgICAJQDQNCisJCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQorCQkJCSgxNjM0LCA3OTEpDQorCQkJCSgxODU3LCA3OTEpDQorCQkJCSgxODU3LCAxMDE4KSkNCisJCQkgICAgbGluZV9zdHlsZSAJMw0KKwkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE2MzQsIDc5MSkNCisJCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE4NTcsIDEwMTgpDQorCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4DQorCQkJCVBhcmVudF9WaWV3IAlAMTYNCisJCQkJbG9jYXRpb24gICAJKDE4MDQsIDk3MikNCisJCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQorCQkJCSAgICBzaXplICAgICAgIAkxMA0KKwkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KKwkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCisJCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQorCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KKwkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCisJCQkJICAgIGNvbG9yICAgICAgCTANCisJCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQorCQkJCWFuY2hvciAgICAgCTINCisJCQkJYW5jaG9yX2xvYyAJMQ0KKwkJCQlubGluZXMgICAgIAkxDQorCQkJCW1heF93aWR0aCAgCTE1DQorCQkJCWp1c3RpZnkgICAgCTANCisJCQkJbGFiZWwgICAgICAJIjEiDQorCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQorCQkJCWhlaWdodCAgICAgCTU0DQorCQkJCW9yaWVudGF0aW9uIAkxKSkNCisJCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyIiBAMTkNCisJCQkgICAgUGFyZW50X1ZpZXcgCUAxNQ0KKwkJCSAgICBsb2NhdGlvbiAgIAkoMTI5OCwgLTEzNykNCisJCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQorCQkJICAgIHF1aWR1ICAgICAgCSI0MUVDMUQ5OTAyNDMiDQorCQkJICAgIGNsaWVudCAgICAgCUAxNQ0KKwkJCSAgICBzdXBwbGllciAgIAlANw0KKwkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCisJCQkJKDE2MzQsIDc5MSkNCisJCQkJKDExODUsIDc5MSkpDQorCQkJICAgIGxpbmVfc3R5bGUgCTMNCisJCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjM0LCA3OTEpDQorCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTg1LCA3OTEpKSkpDQorCQkob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDIwDQorCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KKwkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCisJCSAgICBjbGllbnQgICAgIAlAMg0KKwkJICAgIHN1cHBsaWVyICAgCUA3DQorCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQorCQkJKDY1NywgMTA0OCkNCisJCQkoODI5LCA4NzApKQ0KKwkJICAgIGxpbmVfc3R5bGUgCTApDQorCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMyIgQDIxDQorCQkgICAgbG9jYXRpb24gICAJKDM5OSwgNjkxKQ0KKwkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KKwkJCXNpemUgICAgICAgCTEwDQorCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KKwkJCWJvbGQgICAgICAgCUZBTFNFDQorCQkJaXRhbGljcyAgICAJRkFMU0UNCisJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KKwkJCXN0cmlrZSAgICAgCUZBTFNFDQorCQkJY29sb3IgICAgICAJMA0KKwkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQorCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KKwkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCisJCSAgICBxdWlkdSAgICAgIAkiNDFGNTY3MjAwMEU4Ig0KKwkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KKwkJCShvYmplY3QgUm9sZVZpZXcgIndvcmtiZW5jaE1vZHVsZXMiIEAyMg0KKwkJCSAgICBQYXJlbnRfVmlldyAJQDIxDQorCQkJICAgIGxvY2F0aW9uICAgCSgtMzMsIDQwMykNCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQorCQkJCXNpemUgICAgICAgCTEwDQorCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCisJCQkJYm9sZCAgICAgICAJRkFMU0UNCisJCQkJaXRhbGljcyAgICAJRkFMU0UNCisJCQkJdW5kZXJsaW5lICAJRkFMU0UNCisJCQkJc3RyaWtlICAgICAJRkFMU0UNCisJCQkJY29sb3IgICAgICAJMA0KKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KKwkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMw0KKwkJCQlQYXJlbnRfVmlldyAJQDIyDQorCQkJCWxvY2F0aW9uICAgCSg0NzYsIDc0NykNCisJCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQorCQkJCSAgICBzaXplICAgICAgIAkxMA0KKwkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KKwkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCisJCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQorCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KKwkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCisJCQkJICAgIGNvbG9yICAgICAgCTANCisJCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQorCQkJCWFuY2hvciAgICAgCTENCisJCQkJYW5jaG9yX2xvYyAJMQ0KKwkJCQlubGluZXMgICAgIAkxDQorCQkJCW1heF93aWR0aCAgCTM3Mw0KKwkJCQlqdXN0aWZ5ICAgIAkwDQorCQkJCWxhYmVsICAgICAgCSIrd29ya2JlbmNoTW9kdWxlcyINCisJCQkJcGN0RGlzdCAgICAJMC4yNTMyODkNCisJCQkJaGVpZ2h0ICAgICAJNTYNCisJCQkJb3JpZW50YXRpb24gCTEpDQorCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KKwkJCSAgICBxdWlkdSAgICAgIAkiNDFGNTY3MjEwMTExIg0KKwkJCSAgICBjbGllbnQgICAgIAlAMjENCisJCQkgICAgc3VwcGxpZXIgICAJQDcNCisJCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQorCQkJCSgzOTksIDY5MSkNCisJCQkJKDcwMywgNjkxKSkNCisJCQkgICAgbGluZV9zdHlsZSAJMw0KKwkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDM5OSwgNjkxKQ0KKwkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzAzLCA2OTEpDQorCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0DQorCQkJCVBhcmVudF9WaWV3IAlAMjINCisJCQkJbG9jYXRpb24gICAJKDY0MCwgNjMyKQ0KKwkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCisJCQkJICAgIHNpemUgICAgICAgCTEwDQorCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQorCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KKwkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCisJCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQorCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KKwkJCQkgICAgY29sb3IgICAgICAJMA0KKwkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCisJCQkJYW5jaG9yICAgICAJMg0KKwkJCQlhbmNob3JfbG9jIAkxDQorCQkJCW5saW5lcyAgICAgCTENCisJCQkJbWF4X3dpZHRoICAJMTUNCisJCQkJanVzdGlmeSAgICAJMA0KKwkJCQlsYWJlbCAgICAgIAkiMC4uKiINCisJCQkJcGN0RGlzdCAgICAJMC43OTI3NjMNCisJCQkJaGVpZ2h0ICAgICAJNTkNCisJCQkJb3JpZW50YXRpb24gCTApKQ0KKwkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQiIEAyNQ0KKwkJCSAgICBQYXJlbnRfVmlldyAJQDIxDQorCQkJICAgIGxvY2F0aW9uICAgCSgtMzMsIDQwMykNCisJCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQorCQkJICAgIHF1aWR1ICAgICAgCSI0MUY1NjcyMTAxMTMiDQorCQkJICAgIGNsaWVudCAgICAgCUAyMQ0KKwkJCSAgICBzdXBwbGllciAgIAlANQ0KKwkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCisJCQkJKDM5OSwgNjkxKQ0KKwkJCQkoMzI1LCA2OTEpDQorCQkJCSgzMjUsIDQ2MSkpDQorCQkJICAgIGxpbmVfc3R5bGUgCTMNCisJCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzOTksIDY5MSkNCisJCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDMyNSwgNDYxKSkpKQ0KKwkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDUiIEAyNg0KKwkJICAgIGxvY2F0aW9uICAgCSgxMzIyLCA2MzMpDQorCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQorCQkJc2l6ZSAgICAgICAJMTANCisJCQlmYWNlICAgICAgIAkiQXJpYWwiDQorCQkJYm9sZCAgICAgICAJRkFMU0UNCisJCQlpdGFsaWNzICAgIAlGQUxTRQ0KKwkJCXVuZGVybGluZSAgCUZBTFNFDQorCQkJc3RyaWtlICAgICAJRkFMU0UNCisJCQljb2xvciAgICAgIAkwDQorCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCisJCSAgICBzdGVyZW90eXBlIAlUUlVFDQorCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KKwkJICAgIHF1aWR1ICAgICAgCSI0MjAxNDZBNTAyRTIiDQorCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQorCQkJKG9iamVjdCBSb2xlVmlldyAibW9kdWxlcyIgQDI3DQorCQkJICAgIFBhcmVudF9WaWV3IAlAMjYNCisJCQkgICAgbG9jYXRpb24gICAJKDQ5MCwgLTcxMSkNCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQorCQkJCXNpemUgICAgICAgCTEwDQorCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCisJCQkJYm9sZCAgICAgICAJRkFMU0UNCisJCQkJaXRhbGljcyAgICAJRkFMU0UNCisJCQkJdW5kZXJsaW5lICAJRkFMU0UNCisJCQkJc3RyaWtlICAgICAJRkFMU0UNCisJCQkJY29sb3IgICAgICAJMA0KKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KKwkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOA0KKwkJCQlQYXJlbnRfVmlldyAJQDI3DQorCQkJCWxvY2F0aW9uICAgCSgxMzY3LCA1NDUpDQorCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KKwkJCQkgICAgc2l6ZSAgICAgICAJMTANCisJCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCisJCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQorCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KKwkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCisJCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQorCQkJCSAgICBjb2xvciAgICAgIAkwDQorCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KKwkJCQlhbmNob3IgICAgIAkxDQorCQkJCWFuY2hvcl9sb2MgCTENCisJCQkJbmxpbmVzICAgICAJMQ0KKwkJCQltYXhfd2lkdGggIAkxODANCisJCQkJanVzdGlmeSAgICAJMA0KKwkJCQlsYWJlbCAgICAgIAkiK21vZHVsZXMiDQorCQkJCXBjdERpc3QgICAgCTAuNDc1NzM2DQorCQkJCWhlaWdodCAgICAgCTcyDQorCQkJCW9yaWVudGF0aW9uIAkwKQ0KKwkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCisJCQkgICAgcXVpZHUgICAgICAJIjQyMDE0NkE2MDI3RiINCisJCQkgICAgY2xpZW50ICAgICAJQDI2DQorCQkJICAgIHN1cHBsaWVyICAgCUA2DQorCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KKwkJCQkoMTMyMiwgNjMzKQ0KKwkJCQkoMTQ2MCwgNTg5KSkNCisJCQkgICAgbGluZV9zdHlsZSAJMA0KKwkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOQ0KKwkJCQlQYXJlbnRfVmlldyAJQDI3DQorCQkJCWxvY2F0aW9uICAgCSgxNDI3LCA2NjIpDQorCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KKwkJCQkgICAgc2l6ZSAgICAgICAJMTANCisJCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCisJCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQorCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KKwkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCisJCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQorCQkJCSAgICBjb2xvciAgICAgIAkwDQorCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KKwkJCQlhbmNob3IgICAgIAkyDQorCQkJCWFuY2hvcl9sb2MgCTENCisJCQkJbmxpbmVzICAgICAJMQ0KKwkJCQltYXhfd2lkdGggIAkxNQ0KKwkJCQlqdXN0aWZ5ICAgIAkwDQorCQkJCWxhYmVsICAgICAgCSIwLi4qIg0KKwkJCQlwY3REaXN0ICAgIAkwLjYzNjA3Nw0KKwkJCQloZWlnaHQgICAgIAk1OQ0KKwkJCQlvcmllbnRhdGlvbiAJMSkpDQorCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNiIgQDMwDQorCQkJICAgIFBhcmVudF9WaWV3IAlAMjYNCisJCQkgICAgbG9jYXRpb24gICAJKDQ5MCwgLTcxMSkNCisJCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQorCQkJICAgIHF1aWR1ICAgICAgCSI0MjAxNDZBNjAyODEiDQorCQkJICAgIGNsaWVudCAgICAgCUAyNg0KKwkJCSAgICBzdXBwbGllciAgIAlANw0KKwkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCisJCQkJKDEzMjIsIDYzMykNCisJCQkJKDExODUsIDY3NSkpDQorCQkJICAgIGxpbmVfc3R5bGUgCTApKSkNCisJCShvYmplY3QgTm90ZVZpZXcgQDMxDQorCQkgICAgbG9jYXRpb24gICAJKDI3ODQsIDQxNikNCisJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCisJCQlzaXplICAgICAgIAkxMA0KKwkJCWZhY2UgICAgICAgCSJBcmlhbCINCisJCQlib2xkICAgICAgIAlGQUxTRQ0KKwkJCWl0YWxpY3MgICAgCUZBTFNFDQorCQkJdW5kZXJsaW5lICAJRkFMU0UNCisJCQlzdHJpa2UgICAgIAlGQUxTRQ0KKwkJCWNvbG9yICAgICAgCTANCisJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KKwkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQorCQkJUGFyZW50X1ZpZXcgCUAzMQ0KKwkJCWxvY2F0aW9uICAgCSgyMzg3LCAxNjYpDQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCisJCQlubGluZXMgICAgIAkxMA0KKwkJCW1heF93aWR0aCAgCTc1OQ0KKwkJCWxhYmVsICAgICAgCQ0KK3xUaGUgZGVwZW5kZW50IG1vZHVsZSAiaGFuZGxlIiBtdXN0IGJlIHJlc29sdmFibGUgdG8gYSBXb3JrYmVuY2hNb2R1bGUuDQorfA0KK3xUaGUgRGVwbG95ZWRQYXRoIHNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgdGhlIHJlZmVyZW5jZWQgbW9kdWxlIGluIHRoaXMgZGVwbG95bWVudCBzdHJ1Y3R1cmUuDQorfA0KK3xUaGUgZGVwZW5kZW5jeVR5cGUgc3BlY2lmaWVzIGhvdyB0aGUgZGVwZW5kZW50IG1vZHVsZSBpcyBhc3NlbWJsZWQuDQorCQkJKQ0KKwkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCisJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KKwkJICAgIHdpZHRoICAgICAgCTgxOQ0KKwkJICAgIGhlaWdodCAgICAgCTUxMykNCisJCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bW9kdWxlQ29yZTo6RGVwZW5kZW5jeVR5cGUiIEAzMg0KKwkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQorCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KKwkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCisJCSAgICBsb2NhdGlvbiAgIAkoMjU2MCwgOTQ0KQ0KKwkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KKwkJCXNpemUgICAgICAgCTEwDQorCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KKwkJCWJvbGQgICAgICAgCUZBTFNFDQorCQkJaXRhbGljcyAgICAJRkFMU0UNCisJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KKwkJCXN0cmlrZSAgICAgCUZBTFNFDQorCQkJY29sb3IgICAgICAJMA0KKwkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQorCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCisJCQlQYXJlbnRfVmlldyAJQDMyDQorCQkJbG9jYXRpb24gICAJKDIzODcsIDg2MCkNCisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KKwkJCW5saW5lcyAgICAgCTENCisJCQltYXhfd2lkdGggIAkzNDYNCisJCQlqdXN0aWZ5ICAgIAkwDQorCQkJbGFiZWwgICAgICAJIkRlcGVuZGVuY3lUeXBlIikNCisJCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbA0KKwkJCVBhcmVudF9WaWV3IAlAMzINCisJCQlsb2NhdGlvbiAgIAkoMjM4NywgODEwKQ0KKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQorCQkJYW5jaG9yICAgICAJMTANCisJCQlubGluZXMgICAgIAkxDQorCQkJbWF4X3dpZHRoICAJMzQ2DQorCQkJanVzdGlmeSAgICAJMA0KKwkJCWxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQ0KKwkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KKwkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCisJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KKwkJICAgIHF1aWR1ICAgICAgCSI0MjAzOTRGNTAxODUiDQorCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCisJCQlQYXJlbnRfVmlldyAJQDMyDQorCQkJbG9jYXRpb24gICAJKDIzODcsIDkyMSkNCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCisJCQkgICAgc2l6ZSAgICAgICAJMTANCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KKwkJCSAgICBjb2xvciAgICAgIAkwDQorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQorCQkJaWNvbl9zdHlsZSAJIkljb24iDQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCisJCQlhbmNob3IgICAgIAkyDQorCQkJbmxpbmVzICAgICAJMw0KKwkJCW1heF93aWR0aCAgCTIzNykNCisJCSAgICB3aWR0aCAgICAgIAkzNjQNCisJCSAgICBoZWlnaHQgICAgIAkyOTINCisJCSAgICBhbm5vdGF0aW9uIAk4DQorCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCisJCShvYmplY3QgQXR0YWNoVmlldyAiIiBAMzMNCisJCSAgICBzdGVyZW90eXBlIAlUUlVFDQorCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KKwkJICAgIGNsaWVudCAgICAgCUA2DQorCQkgICAgc3VwcGxpZXIgICAJQDMxDQorCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQorCQkJKDIxODcsIDQ1NSkNCisJCQkoMjM3NCwgNDQzKSkNCisJCSAgICBsaW5lX3N0eWxlIAkwKSkpKSkNCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3Jvc2UvbW9kdWxlQ29yZS5lY29yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcm9zZS9tb2R1bGVDb3JlLmVjb3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNzIzZjIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3Jvc2UvbW9kdWxlQ29yZS5lY29yZQpAQCAtMCwwICsxLDQ3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCisgICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJtb2R1bGVjb3JlIgorICAgIG5zVVJJPSJtb2R1bGVjb3JlLnhtaSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSI+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya2JlbmNoTW9kdWxlIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGFuZGxlIiBlVHlwZT0iIy8vVVJJIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlcGxveWVkTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNvdXJjZXMiIHVwcGVyQm91bmQ9Ii0xIgorICAgICAgICBlVHlwZT0iIy8vV29ya2JlbmNoTW9kdWxlUmVzb3VyY2UiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1dvcmtiZW5jaE1vZHVsZVJlc291cmNlL21vZHVsZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtb2R1bGVUeXBlIiBsb3dlckJvdW5kPSIxIgorICAgICAgICBlVHlwZT0iIy8vTW9kdWxlVHlwZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtb2R1bGVzIiB1cHBlckJvdW5kPSItMSIKKyAgICAgICAgZVR5cGU9IiMvL0RlcGVuZGVudE1vZHVsZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrYmVuY2hNb2R1bGVSZXNvdXJjZSI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNvdXJjZVBhdGgiIGVUeXBlPSIjLy9VUkkiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVwbG95ZWRQYXRoIiBlVHlwZT0iIy8vVVJJIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4Y2x1c2lvbnMiIHVwcGVyQm91bmQ9Ii0xIgorICAgICAgICBlVHlwZT0iIy8vVVJJIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1vZHVsZSIgbG93ZXJCb3VuZD0iMSIKKyAgICAgICAgZVR5cGU9IiMvL1dvcmtiZW5jaE1vZHVsZSIgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1dvcmtiZW5jaE1vZHVsZS9yZXNvdXJjZXMiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTW9kdWxlVHlwZSI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1ldGFkYXRhUmVzb3VyY2VzIiB1cHBlckJvdW5kPSItMSIKKyAgICAgICAgZVR5cGU9IiMvL1VSSSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtb2R1bGVUeXBlSWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVVJJIiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2plY3RNb2R1bGVzIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvamVjdE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id29ya2JlbmNoTW9kdWxlcyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgIGVUeXBlPSIjLy9Xb3JrYmVuY2hNb2R1bGUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlcGVuZGVudE1vZHVsZSI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImhhbmRsZSIgZVR5cGU9IiMvL1VSSSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXBsb3llZFBhdGgiIGVUeXBlPSIjLy9VUkkiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVwZW5kZW5jeVR5cGUiIGVUeXBlPSIjLy9EZXBlbmRlbmN5VHlwZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IkRlcGVuZGVuY3lUeXBlIj4KKyAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+CisgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJ1c2VzPTAmI3hEOyYjeEE7Y29uc3VtZXM9MSIvPgorICAgIDwvZUFubm90YXRpb25zPgorICAgIDxlTGl0ZXJhbHMgbmFtZT0idXNlcyIvPgorICAgIDxlTGl0ZXJhbHMgbmFtZT0iY29uc3VtZXMiIHZhbHVlPSIxIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcm9zZS9tb2R1bGVDb3JlLm1kbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vcm9zZS9tb2R1bGVDb3JlLm1kbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTliNGM1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9yb3NlL21vZHVsZUNvcmUubWRsCkBAIC0wLDAgKzEsODgzOSBAQAorDQorKG9iamVjdCBQZXRhbA0KKyAgICB2ZXJzaW9uICAgIAk1MA0KKyAgICBfd3JpdHRlbiAgIAkiUm9zZSA4LjMuMDQwNy4yODAwIg0KKyAgICBjaGFyU2V0ICAgIAkwKQ0KKw0KKyhvYmplY3QgRGVzaWduICJMb2dpY2FsIFZpZXciDQorICAgIGlzX3VuaXQgICAgCVRSVUUNCisgICAgaXNfbG9hZGVkICAJVFJVRQ0KKyAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCShvYmplY3QgQXR0cmlidXRlDQorCSAgICB0b29sICAgICAgIAkiSmF2YSINCisJICAgIG5hbWUgICAgICAgCSJJREUiDQorCSAgICB2YWx1ZSAgICAgIAkiSW50ZXJuYWwgRWRpdG9yIikNCisJKG9iamVjdCBBdHRyaWJ1dGUNCisJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KKwkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMSINCisJICAgIHZhbHVlICAgICAgCSIiKQ0KKwkob2JqZWN0IEF0dHJpYnV0ZQ0KKwkgICAgdG9vbCAgICAgICAJIkphdmEiDQorCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQxIg0KKwkgICAgdmFsdWUgICAgICAJIiIpDQorCShvYmplY3QgQXR0cmlidXRlDQorCSAgICB0b29sICAgICAgIAkiSmF2YSINCisJICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkxIg0KKwkgICAgdmFsdWUgICAgICAJIiIpDQorCShvYmplY3QgQXR0cmlidXRlDQorCSAgICB0b29sICAgICAgIAkiSmF2YSINCisJICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTIiDQorCSAgICB2YWx1ZSAgICAgIAkiIikNCisJKG9iamVjdCBBdHRyaWJ1dGUNCisJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KKwkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MiINCisJICAgIHZhbHVlICAgICAgCSIiKQ0KKwkob2JqZWN0IEF0dHJpYnV0ZQ0KKwkgICAgdG9vbCAgICAgICAJIkphdmEiDQorCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MiINCisJICAgIHZhbHVlICAgICAgCSIiKQ0KKwkob2JqZWN0IEF0dHJpYnV0ZQ0KKwkgICAgdG9vbCAgICAgICAJIkphdmEiDQorCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUzIg0KKwkgICAgdmFsdWUgICAgICAJIiIpDQorCShvYmplY3QgQXR0cmlidXRlDQorCSAgICB0b29sICAgICAgIAkiSmF2YSINCisJICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDMiDQorCSAgICB2YWx1ZSAgICAgIAkiIikNCisJKG9iamVjdCBBdHRyaWJ1dGUNCisJICAgIHRvb2wgICAgICAgCSJKYXZhIg0KKwkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTMiDQorCSAgICB2YWx1ZSAgICAgIAkiIikpDQorICAgIHF1aWQgICAgICAgCSIzQTBCMjQ3NDAyNUYiDQorICAgIGVuZm9yY2VDbG9zdXJlQXV0b0xvYWQgCUZBTFNFDQorICAgIGRlZmF1bHRzICAgCShvYmplY3QgZGVmYXVsdHMNCisJcmlnaHRNYXJnaW4gCTAuMjUwMDAwDQorCWxlZnRNYXJnaW4gCTAuMjUwMDAwDQorCXRvcE1hcmdpbiAgCTAuMjUwMDAwDQorCWJvdHRvbU1hcmdpbiAJMC41MDAwMDANCisJcGFnZU92ZXJsYXAgCTAuMjUwMDAwDQorCWNsaXBJY29uTGFiZWxzIAlUUlVFDQorCWF1dG9SZXNpemUgCVRSVUUNCisJc25hcFRvR3JpZCAJVFJVRQ0KKwlncmlkWCAgICAgIAkxNg0KKwlncmlkWSAgICAgIAkxNg0KKwlkZWZhdWx0Rm9udCAJKG9iamVjdCBGb250DQorCSAgICBzaXplICAgICAgIAkxMA0KKwkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KKwkgICAgYm9sZCAgICAgICAJRkFMU0UNCisJICAgIGl0YWxpY3MgICAgCUZBTFNFDQorCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KKwkgICAgc3RyaWtlICAgICAJRkFMU0UNCisJICAgIGNvbG9yICAgICAgCTANCisJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQorCXNob3dNZXNzYWdlTnVtIAkxDQorCXNob3dDbGFzc09mT2JqZWN0IAlUUlVFDQorCW5vdGF0aW9uICAgCSJVbmlmaWVkIikNCisgICAgcm9vdF91c2VjYXNlX3BhY2thZ2UgCShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIlVzZSBDYXNlIFZpZXciDQorCXF1aWQgICAgICAgCSIzQTBCMjQ3NDAyNkEiDQorCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQorCWdsb2JhbCAgICAgCVRSVUUNCisJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpDQorCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KKwkgICAgKG9iamVjdCBVc2VDYXNlRGlhZ3JhbSAiTWFpbiINCisJCXF1aWQgICAgICAgCSIzQTBCMjQ3OTAzMzkiDQorCQl0aXRsZSAgICAgIAkiTWFpbiINCisJCXpvb20gICAgICAgCTEwMA0KKwkJbWF4X2hlaWdodCAJMjgzNTANCisJCW1heF93aWR0aCAgCTIxNjAwDQorCQlvcmlnaW5feCAgIAkwDQorCQlvcmlnaW5feSAgIAkwDQorCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkNCisgICAgcm9vdF9jYXRlZ29yeSAJKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiTG9naWNhbCBWaWV3Ig0KKwlxdWlkICAgICAgIAkiM0EwQjI0NzQwMjY5Ig0KKwlleHBvcnRDb250cm9sIAkiUHVibGljIg0KKwlnbG9iYWwgICAgIAlUUlVFDQorCXN1YnN5c3RlbSAgCSJDb21wb25lbnQgVmlldyINCisJcXVpZHUgICAgICAJIjNBMEIyNDc0MDI3RCINCisJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCisJICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIm1vZHVsZUNvcmUiDQorCQlpc191bml0ICAgIAlUUlVFDQorCQlpc19sb2FkZWQgIAlGQUxTRQ0KKwkJZmlsZV9uYW1lICAJIiRXT1JLU1BBQ0VfUk9PVFxcb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb25cXHJvc2VcXG1vZHVsZUNvcmUuY2F0Ig0KKwkJcXVpZCAgICAgICAJIjNBMERCNjhCMDA0NiIpKQ0KKwlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCisJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICJQYWNrYWdlVmlldyINCisJCXF1aWQgICAgICAgCSIzQTBCMjQ3OTAzNjAiDQorCQl0aXRsZSAgICAgIAkiUGFja2FnZVZpZXciDQorCQl6b29tICAgICAgIAkxMDANCisJCW1heF9oZWlnaHQgCTI4MzUwDQorCQltYXhfd2lkdGggIAkyMTYwMA0KKwkJb3JpZ2luX3ggICAJNjUwDQorCQlvcmlnaW5feSAgIAkwDQorCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KKwkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6Om1vZHVsZUNvcmUiIEAxDQorCQkJbG9jYXRpb24gICAJKDM1MiwgMzIwKQ0KKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KKwkJCSAgICBzaXplICAgICAgIAkxMA0KKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQorCQkJICAgIGNvbG9yICAgICAgCTANCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KKwkJCSAgICBQYXJlbnRfVmlldyAJQDENCisJCQkgICAgbG9jYXRpb24gICAJKDIwOCwgMjM2KQ0KKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KKwkJCSAgICBubGluZXMgICAgIAkyDQorCQkJICAgIG1heF93aWR0aCAgCTI4OA0KKwkJCSAgICBqdXN0aWZ5ICAgIAkwDQorCQkJICAgIGxhYmVsICAgICAgCSJtb2R1bGVDb3JlIikNCisJCQlpY29uX3N0eWxlIAkiTGFiZWwiDQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQorCQkJcXVpZHUgICAgICAJIjNBMERCNjhCMDA0NiINCisJCQl3aWR0aCAgICAgIAkzMDANCisJCQloZWlnaHQgICAgIAkxODApKSkpKQ0KKyAgICByb290X3N1YnN5c3RlbSAJKG9iamVjdCBTdWJTeXN0ZW0gIkNvbXBvbmVudCBWaWV3Ig0KKwlxdWlkICAgICAgIAkiM0EwQjI0NzQwMjdEIg0KKwlwaHlzaWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpDQorCXBoeXNpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCisJICAgIChvYmplY3QgTW9kdWxlX0RpYWdyYW0gIk1haW4iDQorCQlxdWlkICAgICAgIAkiM0EwQjI0NzkwMzM4Ig0KKwkJdGl0bGUgICAgICAJIk1haW4iDQorCQl6b29tICAgICAgIAkxMDANCisJCW1heF9oZWlnaHQgCTI4MzUwDQorCQltYXhfd2lkdGggIAkyMTYwMA0KKwkJb3JpZ2luX3ggICAJMA0KKwkJb3JpZ2luX3kgICAJMA0KKwkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkNCisJY2F0ZWdvcnkgICAJIkxvZ2ljYWwgVmlldyINCisJcXVpZHUgICAgICAJIjQxRUMxQzNCMDBBNCIpDQorICAgIHByb2Nlc3Nfc3RydWN0dXJlIAkob2JqZWN0IFByb2Nlc3Nlcw0KKwlxdWlkICAgICAgIAkiM0EwQjI0NzQwMjdFIg0KKwlQcm9jc05EZXZzIAkobGlzdA0KKwkgICAgKG9iamVjdCBQcm9jZXNzX0RpYWdyYW0gIkRlcGxveW1lbnQgVmlldyINCisJCXF1aWQgICAgICAgCSIzQTBCMjQ3NDAyOTEiDQorCQl0aXRsZSAgICAgIAkiRGVwbG95bWVudCBWaWV3Ig0KKwkJem9vbSAgICAgICAJMTAwDQorCQltYXhfaGVpZ2h0IAkyODM1MA0KKwkJbWF4X3dpZHRoICAJMjE2MDANCisJCW9yaWdpbl94ICAgCTANCisJCW9yaWdpbl95ICAgCTANCisJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQ0KKyAgICBwcm9wZXJ0aWVzIAkob2JqZWN0IFByb3BlcnRpZXMNCisJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJFY29yZSINCisJCW5hbWUgICAgICAgCSJyb3NlSWQiDQorCQl2YWx1ZSAgICAgIAkiNzUzMTE3NTQwIikNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiRWNvcmUiDQorCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCisJCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJFY29yZSINCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJFY29yZSINCisJCQluYW1lICAgICAgIAkicHJlZml4Ig0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KKwkJCW5hbWUgICAgICAgCSJwYWNrYWdlTmFtZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJFY29yZSINCisJCQluYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRWNvcmUiDQorCQkJbmFtZSAgICAgICAJIm5zTmFtZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJFY29yZSINCisJCQluYW1lICAgICAgIAkibnNVUkkiDQorCQkJdmFsdWUgICAgICAJIiIpKSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiRWNvcmUiDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiDQorCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRWNvcmUiDQorCQkJbmFtZSAgICAgICAJInBhY2thZ2VOYW1lIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KKwkJCW5hbWUgICAgICAgCSJwcmVmaXgiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRWNvcmUiDQorCQkJbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KKwkJCW5hbWUgICAgICAgCSJuc05hbWUiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRWNvcmUiDQorCQkJbmFtZSAgICAgICAJIm5zVVJJIg0KKwkJCXZhbHVlICAgICAgCSIiKSkpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIkVjb3JlIg0KKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5Ig0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KKwkJCW5hbWUgICAgICAgCSJiYXNlUGFja2FnZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJFY29yZSINCisJCQluYW1lICAgICAgIAkicHJlZml4Ig0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KKwkJCW5hbWUgICAgICAgCSJwYWNrYWdlTmFtZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJFY29yZSINCisJCQluYW1lICAgICAgIAkibnNOYW1lIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KKwkJCW5hbWUgICAgICAgCSJuc1VSSSINCisJCQl2YWx1ZSAgICAgIAkiIikpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJFY29yZSINCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJFY29yZSINCisJCQluYW1lICAgICAgIAkibnNOYW1lIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KKwkJCW5hbWUgICAgICAgCSJwcmVmaXgiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRWNvcmUiDQorCQkJbmFtZSAgICAgICAJInBhY2thZ2VOYW1lIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KKwkJCW5hbWUgICAgICAgCSJiYXNlUGFja2FnZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJFY29yZSINCisJCQluYW1lICAgICAgIAkibnNVUkkiDQorCQkJdmFsdWUgICAgICAJIiIpKSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiRWNvcmUiDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiDQorCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRWNvcmUiDQorCQkJbmFtZSAgICAgICAJIm5zVVJJIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KKwkJCW5hbWUgICAgICAgCSJwcmVmaXgiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRWNvcmUiDQorCQkJbmFtZSAgICAgICAJInBhY2thZ2VOYW1lIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KKwkJCW5hbWUgICAgICAgCSJiYXNlUGFja2FnZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJFY29yZSINCisJCQluYW1lICAgICAgIAkibnNOYW1lIg0KKwkJCXZhbHVlICAgICAgCSIiKSkpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIkVjb3JlIg0KKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJFY29yZSINCisJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRWNvcmUiDQorCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRWNvcmUiDQorCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KKwkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRWNvcmUiDQorCQkJbmFtZSAgICAgICAJImlzVW5pcXVlIg0KKwkJCXZhbHVlICAgICAgCVRSVUUpKSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiRWNvcmUiDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJFY29yZSINCisJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRWNvcmUiDQorCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRWNvcmUiDQorCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KKwkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRWNvcmUiDQorCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQorCQkJdmFsdWUgICAgICAJVFJVRSkpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCisJCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIg0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KKwkJCXZhbHVlICAgICAgCSIiKSkpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19Jbmhlcml0Ig0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiDQorCQkJdmFsdWUgICAgICAJVFJVRSkpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQorCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Ig0KKwkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIlJvb3RQYWNrYWdlIg0KKwkJCXZhbHVlICAgICAgCSJDKysgUmV2ZXJzZSBFbmdpbmVlcmVkIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIkluaXRpYWxIZWFkZXJJbmNsdWRlcyINCisJCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJCW5hbWUgICAgICAgCSJJbml0aWFsQm9keUluY2x1ZGVzIg0KKwkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIlJldkVuZ1Jvb3REaXJlY3RvcnkiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJCW5hbWUgICAgICAgCSJSZXZFbmdEaXJlY3Rvcmllc0FzUGFja2FnZXMiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIg0KKwkJCXZhbHVlICAgICAgCSIuaCIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbkZpbGVFeHRlbnNpb24iDQorCQkJdmFsdWUgICAgICAJIi5jcHAiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQluYW1lICAgICAgIAkiTmV3SGVhZGVyRmlsZURpcmVjdG9yeSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIk5ld0ltcGxlbWVudGF0aW9uRmlsZURpcmVjdG9yeSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIkZpbGVDYXBpdGFsaXphdGlvbiINCisJCQl2YWx1ZSAgICAgIAkoIkZpbGVDYXBpdGFsaXphdGlvblNldCIgMCkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJCW5hbWUgICAgICAgCSJDb2RlR2VuRXh0cmFEaXJlY3RvcmllcyINCisJCQl2YWx1ZSAgICAgIAkoIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzU2V0IiAwKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIlN0cmlwQ2xhc3NQcmVmaXgiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJCW5hbWUgICAgICAgCSJVc2VUYWJzIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQluYW1lICAgICAgIAkiVGFiV2lkdGgiDQorCQkJdmFsdWUgICAgICAJOCkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIkluZGVudFdpZHRoIg0KKwkJCXZhbHVlICAgICAgCTQpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJCW5hbWUgICAgICAgCSJBY2Nlc3NJbmRlbnRhdGlvbiINCisJCQl2YWx1ZSAgICAgIAktMikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIk1vZGVsSWRDb21tZW50UnVsZXMiDQorCQkJdmFsdWUgICAgICAJKCJNb2RlbElkQ29tbWVudFJ1bGVzU2V0IiAxKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIlBhZ2VXaWR0aCINCisJCQl2YWx1ZSAgICAgIAk4MCkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIkNsYXNzTWVtYmVyT3JkZXIiDQorCQkJdmFsdWUgICAgICAJKCJNZW1iZXJPcmRlclNldCIgMSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJCW5hbWUgICAgICAgCSJPbmVQYXJhbWV0ZXJQZXJMaW5lIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQluYW1lICAgICAgIAkiTmFtZXNwYWNlQnJhY2VTdHlsZSINCisJCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQluYW1lICAgICAgIAkiQ2xhc3NCcmFjZVN0eWxlIg0KKwkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJCW5hbWUgICAgICAgCSJGdW5jdGlvbkJyYWNlU3R5bGUiDQorCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQkJbmFtZSAgICAgICAJIk5vbmUiDQorCQkJCXZhbHVlICAgICAgCTApDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJCW5hbWUgICAgICAgCSJOYW1lc3BhY2VzIg0KKwkJCQl2YWx1ZSAgICAgIAkxKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJCQluYW1lICAgICAgIAkiUGFja2FnZXMiDQorCQkJCXZhbHVlICAgICAgCTIpKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIkZpbGVDYXBpdGFsaXphdGlvblNldCINCisJCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJCW5hbWUgICAgICAgCSJTYW1lIGFzIG1vZGVsIg0KKwkJCQl2YWx1ZSAgICAgIAkwKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJCQluYW1lICAgICAgIAkiTG93ZXIgY2FzZSINCisJCQkJdmFsdWUgICAgICAJMSkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQkJbmFtZSAgICAgICAJIlVwcGVyIGNhc2UiDQorCQkJCXZhbHVlICAgICAgCTIpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJCW5hbWUgICAgICAgCSJMb3dlciBjYXNlIHdpdGggdW5kZXJzY29yZXMiDQorCQkJCXZhbHVlICAgICAgCTMpKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIkJyYWNlU3R5bGVTZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJCQluYW1lICAgICAgIAkiQjEiDQorCQkJCXZhbHVlICAgICAgCTEpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJCW5hbWUgICAgICAgCSJCMiINCisJCQkJdmFsdWUgICAgICAJMikNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQkJbmFtZSAgICAgICAJIkIzIg0KKwkJCQl2YWx1ZSAgICAgIAkzKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJCQluYW1lICAgICAgIAkiQjQiDQorCQkJCXZhbHVlICAgICAgCTQpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJCW5hbWUgICAgICAgCSJCNSINCisJCQkJdmFsdWUgICAgICAJNSkpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQluYW1lICAgICAgIAkiTWVtYmVyT3JkZXJTZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJCQluYW1lICAgICAgIAkiUHVibGljIEZpcnN0Ig0KKwkJCQl2YWx1ZSAgICAgIAkxKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSBGaXJzdCINCisJCQkJdmFsdWUgICAgICAJMikNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQkJbmFtZSAgICAgICAJIk9yZGVyIGJ5IGtpbmQiDQorCQkJCXZhbHVlICAgICAgCTMpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWQiDQorCQkJCXZhbHVlICAgICAgCTQpKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIk1vZGVsSWRDb21tZW50UnVsZXNTZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJCQluYW1lICAgICAgIAkiQ29kZSBnZW5lcmF0aW9uIG9ubHkiDQorCQkJCXZhbHVlICAgICAgCTEpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJCW5hbWUgICAgICAgCSJDb2RlIGdlbmVyYXRpb24gYW5kIHJldmVyc2UgZW5naW5lZXJpbmciDQorCQkJCXZhbHVlICAgICAgCTIpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJCW5hbWUgICAgICAgCSJOZXZlciBnZW5lcmF0ZSBtb2RlbCBJRHMiDQorCQkJCXZhbHVlICAgICAgCTMpKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIkNyZWF0ZUJhY2t1cEZpbGVzIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQluYW1lICAgICAgIAkiQ29tbWVudFJ1bGVzIg0KKwkJCXZhbHVlICAgICAgCSgiQ29tbWVudFJ1bGVzU2V0IiAxKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIkNvbW1lbnRSdWxlc1NldCINCisJCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJCW5hbWUgICAgICAgCSJBbHdheXMgc3luY2hyb25pemUiDQorCQkJCXZhbHVlICAgICAgCTEpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJCW5hbWUgICAgICAgCSJDb2RlIGdlbmVyYXRpb24gb25seSINCisJCQkJdmFsdWUgICAgICAJMikNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQkJbmFtZSAgICAgICAJIlJldmVyc2UgZW5naW5lZXJpbmcgb25seSINCisJCQkJdmFsdWUgICAgICAJMykNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQkJbmFtZSAgICAgICAJIk5ldmVyIHN5bmNocm9uaXplIg0KKwkJCQl2YWx1ZSAgICAgIAk0KSkpKSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIg0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQorCQkJdmFsdWUgICAgICAJIiIpKSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIg0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCisJCQl2YWx1ZSAgICAgIAkiIikpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQluYW1lICAgICAgIAkiSW5pdGlhbENvZGVCb2R5Ig0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQluYW1lICAgICAgIAkiSW5saW5lIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdW5jdGlvbkJvZHkiDQorCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUZ1bmN0aW9uQm9keVNldCIgMikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bmN0aW9uQm9keVNldCINCisJCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Ig0KKwkJCQl2YWx1ZSAgICAgIAkyKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJCQluYW1lICAgICAgIAkiVHJ1ZSINCisJCQkJdmFsdWUgICAgICAJMSkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQkJbmFtZSAgICAgICAJIkZhbHNlIg0KKwkJCQl2YWx1ZSAgICAgIAkwKSkpKSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQluYW1lICAgICAgIAkiSGVhZGVyU291cmNlRmlsZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIkJvZHlTb3VyY2VGaWxlIg0KKwkJCXZhbHVlICAgICAgCSIiKSkpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQluYW1lICAgICAgIAkiSXNOYW1lc3BhY2UiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQorCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiQU5TSSBDKysgRXZlbnQgV2F0Y2hlciINCisJCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KKwkJdmFsdWUgICAgICAJRkFMU0UpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIkFOU0lDb252ZXJ0Ig0KKwkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQorCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiQWRhODMiDQorCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCisJCXZhbHVlICAgICAgCSI4MzgzMjYyMDAiKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUV4dGVuc2lvbiINCisJCQl2YWx1ZSAgICAgIAkiMS5hZGEiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUJhY2t1cEV4dGVuc2lvbiINCisJCQl2YWx1ZSAgICAgIAkiMS5hZH4iKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJTcGVjRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCisJCQl2YWx1ZSAgICAgIAkiMS5hZCMiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUV4dGVuc2lvbiINCisJCQl2YWx1ZSAgICAgIAkiMi5hZGEiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUJhY2t1cEV4dGVuc2lvbiINCisJCQl2YWx1ZSAgICAgIAkiMi5hZH4iKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJCb2R5RmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCisJCQl2YWx1ZSAgICAgIAkiMi5hZCMiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVCb2RpZXMiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGFuZGFyZE9wZXJhdGlvbnMiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiQ29tbWVudFdpZHRoIg0KKwkJCXZhbHVlICAgICAgCTYwKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCINCisJCQl2YWx1ZSAgICAgIAkzMCkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiVXNlRmlsZU5hbWUiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCisJCQl2YWx1ZSAgICAgIAkiJFJPU0VBREE4M19TT1VSQ0UiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29kZUJvZHkiDQorCQkJdmFsdWUgICAgICAJIltzdGF0ZW1lbnRdIikpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJbmFtZSAgICAgICAJIkNsYXNzTmFtZSINCisJCQl2YWx1ZSAgICAgIAkiT2JqZWN0IikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiQ2xhc3NBY2Nlc3MiDQorCQkJdmFsdWUgICAgICAJKCJJbXBsZW1lbnRhdGlvblNldCIgNDMpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJJc1N1YnR5cGUiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJbmFtZSAgICAgICAJIlBvbHltb3JwaGljVW5pdCINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiSGFuZGxlTmFtZSINCisJCQl2YWx1ZSAgICAgIAkiSGFuZGxlIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiSGFuZGxlQWNjZXNzIg0KKwkJCXZhbHVlICAgICAgCSgiSW1wbGVtZW50YXRpb25TZXQiIDQ1KSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiRGlzY3JpbWluYW50Ig0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJWYXJpYW50Ig0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJFbnVtZXJhdGlvbkxpdGVyYWxQcmVmaXgiDQorCQkJdmFsdWUgICAgICAJIkFfIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRQcmVmaXgiDQorCQkJdmFsdWUgICAgICAJIlRoZV8iKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc29yT3BlcmF0aW9ucyINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YW5kYXJkT3BlcmF0aW9ucyINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlciINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJDbGFzc1BhcmFtZXRlck5hbWUiDQorCQkJdmFsdWUgICAgICAJIlRoaXMiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JLaW5kIg0KKwkJCXZhbHVlICAgICAgCSgiQ29uc3RydWN0b3JLaW5kU2V0IiAxOTkpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JOYW1lIg0KKwkJCXZhbHVlICAgICAgCSJDcmVhdGUiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJJbmxpbmVEZWZhdWx0Q29uc3RydWN0b3IiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3RvcktpbmQiDQorCQkJdmFsdWUgICAgICAJKCJDb25zdHJ1Y3RvcktpbmRTZXQiIDE5OSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3Rvck5hbWUiDQorCQkJdmFsdWUgICAgICAJIkNvcHkiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJJbmxpbmVDb3B5Q29uc3RydWN0b3IiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JOYW1lIg0KKwkJCXZhbHVlICAgICAgCSJGcmVlIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiSW5saW5lRGVzdHJ1Y3RvciINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiQ2xhc3NFcXVhbGl0eU9wZXJhdGlvbiINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiSGFuZGxlRXF1YWxpdHlPcGVyYXRpb24iDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJbmFtZSAgICAgICAJIklubGluZUVxdWFsaXR5Ig0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJJc1Rhc2siDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KKwkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25TZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQorCQkJCXZhbHVlICAgICAgCTQ1KQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KKwkJCQl2YWx1ZSAgICAgIAk0MykNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCQluYW1lICAgICAgIAkiTGltaXRlZFByaXZhdGUiDQorCQkJCXZhbHVlICAgICAgCTIwMCkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQorCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcktpbmRTZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQorCQkJCXZhbHVlICAgICAgCTIwMikNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQorCQkJCXZhbHVlICAgICAgCTE5OSkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQorCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiUmV0dXJuVHlwZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiR2VuZXJpY0Zvcm1hbFBhcmFtZXRlcnMiDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiUmV0dXJuVHlwZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFdpdGhzIg0KKwkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiSXNTdWJ1bml0Ig0KKwkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvbiINCisJCQl2YWx1ZSAgICAgIAkoIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvblNldCIgMikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJbmFtZSAgICAgICAJIkNsYXNzUGFyYW1ldGVyTW9kZSINCisJCQl2YWx1ZSAgICAgIAkoIlBhcmFtZXRlck1vZGVTZXQiIDIwMykpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJbmFtZSAgICAgICAJIklubGluZSINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiRW50cnlDb2RlIg0KKwkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiRXhpdENvZGUiDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiINCisJCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvblNldCINCisJCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQkJbmFtZSAgICAgICAJIlNwZWMiDQorCQkJCXZhbHVlICAgICAgCTEpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQkJbmFtZSAgICAgICAJIkJvZHkiDQorCQkJCXZhbHVlICAgICAgCTIpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQkJbmFtZSAgICAgICAJIlJlbmFtaW5nIg0KKwkJCQl2YWx1ZSAgICAgIAkzKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJCW5hbWUgICAgICAgCSJTZXBhcmF0ZSINCisJCQkJdmFsdWUgICAgICAJNCkpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJNb2RlU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCQluYW1lICAgICAgIAkiSW4iDQorCQkJCXZhbHVlICAgICAgCTIwNCkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCQluYW1lICAgICAgIAkiT3V0Ig0KKwkJCQl2YWx1ZSAgICAgIAkyMDUpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQkJbmFtZSAgICAgICAJIkluT3V0Ig0KKwkJCQl2YWx1ZSAgICAgIAkyMDMpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uUmV0dXJuIg0KKwkJCQl2YWx1ZSAgICAgIAkyMDYpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KKwkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiUmVuYW1lcyINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiSW5pdGlhbENvZGVCb2R5Ig0KKwkJCXZhbHVlICAgICAgCSIke2RlZmF1bHR9IikpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiDQorCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQorCQkJdmFsdWUgICAgICAJIlRoZV8ke3N1cHBsaWVyfSIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KKwkJCXZhbHVlICAgICAgCSIke3JlbGF0aW9uc2hpcH0iKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KKwkJCXZhbHVlICAgICAgCSJHZXRfJHtyZWxhdGlvbnNoaXB9IikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQorCQkJdmFsdWUgICAgICAJIlNldF8ke3JlbGF0aW9uc2hpcH0iKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiSXNDb25zdGFudCINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJWYXJpYW50Ig0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZW5lcmljIg0KKwkJCXZhbHVlICAgICAgCSJMaXN0IikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIg0KKwkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJbmFtZSAgICAgICAJIkRlY2xhcmUiDQorCQkJdmFsdWUgICAgICAJKCJEZWNsYXJlU2V0IiAyMzQpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJEZWNsYXJlU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCQluYW1lICAgICAgIAkiQmVmb3JlIg0KKwkJCQl2YWx1ZSAgICAgIAkyMzMpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQkJbmFtZSAgICAgICAJIkFmdGVyIg0KKwkJCQl2YWx1ZSAgICAgIAkyMzQpKSkpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQorCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCisJCQl2YWx1ZSAgICAgIAkiJHthdHRyaWJ1dGV9IikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiR2V0TmFtZSINCisJCQl2YWx1ZSAgICAgIAkiR2V0XyR7YXR0cmlidXRlfSIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KKwkJCXZhbHVlICAgICAgCSJTZXRfJHthdHRyaWJ1dGV9IikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiVmFyaWFudCINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJEZWNsYXJlIg0KKwkJCXZhbHVlICAgICAgCSgiRGVjbGFyZVNldCIgMjM0KSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiRGVjbGFyZVNldCINCisJCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQkJbmFtZSAgICAgICAJIkJlZm9yZSINCisJCQkJdmFsdWUgICAgICAJMjMzKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJCW5hbWUgICAgICAgCSJBZnRlciINCisJCQkJdmFsdWUgICAgICAJMjM0KSkpKSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiQWRhODMiDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iDQorCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCisJCQl2YWx1ZSAgICAgIAkiVGhlXyR7dGFyZ2V0Q2xhc3N9IikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiR2V0TmFtZSINCisJCQl2YWx1ZSAgICAgIAkiR2V0XyR7YXNzb2NpYXRpb259IikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KKwkJCXZhbHVlICAgICAgCSJTZXRfJHthc3NvY2lhdGlvbn0iKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NpYXRlIg0KKwkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiQXNzb2NpYXRlTmFtZSINCisJCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRlIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NpYXRlIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3NvY2lhdGUiDQorCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJEaXNzb2NpYXRlTmFtZSINCisJCQl2YWx1ZSAgICAgIAkiRGlzc29jaWF0ZSIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJbmFtZSAgICAgICAJIklubGluZURpc3NvY2lhdGUiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQorCQkJCXZhbHVlICAgICAgCTIwMikNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQorCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCisJCQkJdmFsdWUgICAgICAJMTk5KQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCisJCQkJdmFsdWUgICAgICAJMjAxKSkpKSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiQWRhODMiDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCisJCQl2YWx1ZSAgICAgIAkiVGhlXyR7dGFyZ2V0Q2xhc3N9IikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQorCQkJdmFsdWUgICAgICAJIiR7dGFyZ2V0fSIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQorCQkJdmFsdWUgICAgICAJIkdldF8ke3RhcmdldH0iKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiU2V0TmFtZSINCisJCQl2YWx1ZSAgICAgIAkiU2V0XyR7dGFyZ2V0fSIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50Ig0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdlbmVyaWMiDQorCQkJdmFsdWUgICAgICAJIkxpc3QiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJDb250YWluZXJUeXBlIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCisJCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCisJCQkJdmFsdWUgICAgICAJMjAyKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCisJCQkJdmFsdWUgICAgICAJMjAxKSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJbmFtZSAgICAgICAJIkRlY2xhcmUiDQorCQkJdmFsdWUgICAgICAJKCJEZWNsYXJlU2V0IiAyMzQpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJEZWNsYXJlU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCQluYW1lICAgICAgIAkiQmVmb3JlIg0KKwkJCQl2YWx1ZSAgICAgIAkyMzMpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQkJbmFtZSAgICAgICAJIkFmdGVyIg0KKwkJCQl2YWx1ZSAgICAgIAkyMzQpKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KKwkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJBZGE4MyINCisJCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KKwkJdmFsdWUgICAgICAJRkFMU0UpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQorCQl2YWx1ZSAgICAgIAkiODM4MzI2MjAwIikNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiU3BlY0ZpbGVFeHRlbnNpb24iDQorCQkJdmFsdWUgICAgICAJIjEuYWRhIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiU3BlY0ZpbGVCYWNrdXBFeHRlbnNpb24iDQorCQkJdmFsdWUgICAgICAJIjEuYWR+IikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiU3BlY0ZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQorCQkJdmFsdWUgICAgICAJIjEuYWQjIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiQm9keUZpbGVFeHRlbnNpb24iDQorCQkJdmFsdWUgICAgICAJIjIuYWRhIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiQm9keUZpbGVCYWNrdXBFeHRlbnNpb24iDQorCQkJdmFsdWUgICAgICAJIjIuYWR+IikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiQm9keUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQorCQkJdmFsdWUgICAgICAJIjIuYWQjIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIlVzZUNvbG9uTm90YXRpb24iDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVCb2RpZXMiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGFuZGFyZE9wZXJhdGlvbnMiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiQ29tbWVudFdpZHRoIg0KKwkJCXZhbHVlICAgICAgCTYwKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCINCisJCQl2YWx1ZSAgICAgIAkzMCkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiVXNlRmlsZU5hbWUiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCisJCQl2YWx1ZSAgICAgIAkiJFJPU0VBREE5NV9TT1VSQ0UiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29kZUJvZHkiDQorCQkJdmFsdWUgICAgICAJIltzdGF0ZW1lbnRdIikpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIlR5cGVOYW1lIg0KKwkJCXZhbHVlICAgICAgCSJPYmplY3QiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJUeXBlVmlzaWJpbGl0eSINCisJCQl2YWx1ZSAgICAgIAkoIlR5cGVWaXNpYmlsaXR5U2V0IiA0MykpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIlR5cGVJbXBsZW1lbnRhdGlvbiINCisJCQl2YWx1ZSAgICAgIAkoIlR5cGVJbXBsZW1lbnRhdGlvblNldCIgMjA4KSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiVHlwZUNvbnRyb2wiDQorCQkJdmFsdWUgICAgICAJKCJUeXBlQ29udHJvbFNldCIgMjI1KSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiVHlwZUNvbnRyb2xOYW1lIg0KKwkJCXZhbHVlICAgICAgCSJDb250cm9sbGVkXyR7dHlwZX0iKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJUeXBlRGVmaW5pdGlvbiINCisJCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIlJlY29yZEltcGxlbWVudGF0aW9uIg0KKwkJCXZhbHVlICAgICAgCSgiUmVjb3JkSW1wbGVtZW50YXRpb25TZXQiIDIwOSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIlJlY29yZEtpbmRQYWNrYWdlTmFtZSINCisJCQl2YWx1ZSAgICAgIAkiJHtjbGFzc31fUmVjb3JkX0tpbmRzIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiSXNMaW1pdGVkIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJJc1N1YnR5cGUiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzVHlwZSINCisJCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlQWNjZXNzVHlwZVNldCIgMjMwKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiQWNjZXNzVHlwZU5hbWUiDQorCQkJdmFsdWUgICAgICAJIkhhbmRsZSIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIkFjY2Vzc1R5cGVWaXNpYmlsaXR5Ig0KKwkJCXZhbHVlICAgICAgCSgiVHlwZVZpc2liaWxpdHlTZXQiIDQ1KSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiQWNjZXNzVHlwZURlZmluaXRpb24iDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJBY2Nlc3NDbGFzc1dpZGUiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiTWF5YmVBbGlhc2VkIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJpemVkSW1wbGVtZW50YXRpb24iDQorCQkJdmFsdWUgICAgICAJKCJQYXJhbWV0ZXJpemVkSW1wbGVtZW50YXRpb25TZXQiIDExKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiUGFyZW50Q2xhc3NOYW1lIg0KKwkJCXZhbHVlICAgICAgCSJTdXBlcmNsYXNzIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiRW51bWVyYXRpb25MaXRlcmFsUHJlZml4Ig0KKwkJCXZhbHVlICAgICAgCSJBXyIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkUHJlZml4Ig0KKwkJCXZhbHVlICAgICAgCSJUaGVfIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiQXJyYXlPZlR5cGVOYW1lIg0KKwkJCXZhbHVlICAgICAgCSJBcnJheV9PZl8ke3R5cGV9IikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiQWNjZXNzQXJyYXlPZlR5cGVOYW1lIg0KKwkJCXZhbHVlICAgICAgCSJBY2Nlc3NfQXJyYXlfT2ZfJHt0eXBlfSIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIkFycmF5T2ZBY2Nlc3NUeXBlTmFtZSINCisJCQl2YWx1ZSAgICAgIAkiQXJyYXlfT2ZfJHthY2Nlc3NfdHlwZX0iKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJBY2Nlc3NBcnJheU9mQWNjZXNzVHlwZU5hbWUiDQorCQkJdmFsdWUgICAgICAJIkFjY2Vzc19BcnJheV9PZl8ke2FjY2Vzc190eXBlfSIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIkFycmF5SW5kZXhEZWZpbml0aW9uIg0KKwkJCXZhbHVlICAgICAgCSJQb3NpdGl2ZSByYW5nZSA8PiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzb3JPcGVyYXRpb25zIg0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIg0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyIg0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyTmFtZSINCisJCQl2YWx1ZSAgICAgIAkiVGhpcyIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIg0KKwkJCXZhbHVlICAgICAgCSgiU3VicHJvZ3JhbUtpbmRTZXQiIDE5OSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3Rvck5hbWUiDQorCQkJdmFsdWUgICAgICAJIkNyZWF0ZSIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIklubGluZURlZmF1bHRDb25zdHJ1Y3RvciINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb3B5Q29uc3RydWN0b3IiDQorCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtS2luZFNldCIgMTk5KSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yTmFtZSINCisJCQl2YWx1ZSAgICAgIAkiQ29weSIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIklubGluZUNvcHlDb25zdHJ1Y3RvciINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXN0cnVjdG9yIg0KKwkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiRGVzdHJ1Y3Rvck5hbWUiDQorCQkJdmFsdWUgICAgICAJIkZyZWUiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXN0cnVjdG9yIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVR5cGVFcXVhbGl0eSINCisJCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMjAxKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiVHlwZUVxdWFsaXR5TmFtZSINCisJCQl2YWx1ZSAgICAgIAkiJHtxdW90ZX09JHtxdW90ZX0iKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJJbmxpbmVFcXVhbGl0eSINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJUeXBlSW1wbGVtZW50YXRpb25TZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJCW5hbWUgICAgICAgCSJUYWdnZWQiDQorCQkJCXZhbHVlICAgICAgCTIwOCkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCQluYW1lICAgICAgIAkiUmVjb3JkIg0KKwkJCQl2YWx1ZSAgICAgIAkyMTApDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQkJbmFtZSAgICAgICAJIk1peGluIg0KKwkJCQl2YWx1ZSAgICAgIAkyMTEpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCisJCQkJdmFsdWUgICAgICAJNDQpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQkJbmFtZSAgICAgICAJIlRhc2siDQorCQkJCXZhbHVlICAgICAgCTIxMikpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJSZWNvcmRJbXBsZW1lbnRhdGlvblNldCINCisJCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQkJbmFtZSAgICAgICAJIlNpbmdsZVR5cGUiDQorCQkJCXZhbHVlICAgICAgCTIwOSkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCQluYW1lICAgICAgIAkiTXVsdGlwbGVUeXBlcyINCisJCQkJdmFsdWUgICAgICAJMjEzKSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlcml6ZWRJbXBsZW1lbnRhdGlvblNldCINCisJCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQkJbmFtZSAgICAgICAJIkdlbmVyaWMiDQorCQkJCXZhbHVlICAgICAgCTExKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJCW5hbWUgICAgICAgCSJVbmNvbnN0cmFpbmVkIg0KKwkJCQl2YWx1ZSAgICAgIAkyMTQpKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiVHlwZVZpc2liaWxpdHlTZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQorCQkJCXZhbHVlICAgICAgCTQ1KQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KKwkJCQl2YWx1ZSAgICAgIAk0MykpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtS2luZFNldCINCisJCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCisJCQkJdmFsdWUgICAgICAJMjAyKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCisJCQkJdmFsdWUgICAgICAJMTk5KQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCisJCQkJdmFsdWUgICAgICAJMjAxKSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQorCQkJCXZhbHVlICAgICAgCTIwMikNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQorCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCisJCQkJdmFsdWUgICAgICAJMTk5KQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCisJCQkJdmFsdWUgICAgICAJMjAxKSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIlR5cGVDb250cm9sU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCQluYW1lICAgICAgIAkiTm9uZSINCisJCQkJdmFsdWUgICAgICAJMjI1KQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJCW5hbWUgICAgICAgCSJJbml0aWFsaXphdGlvbk9ubHkiDQorCQkJCXZhbHVlICAgICAgCTIyNikNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCQluYW1lICAgICAgIAkiQXNzaWdubWVudEZpbmFsaXphdGlvbk9ubHkiDQorCQkJCXZhbHVlICAgICAgCTIyNykNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCQluYW1lICAgICAgIAkiQWxsIg0KKwkJCQl2YWx1ZSAgICAgIAkyMjgpKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NUeXBlU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCQluYW1lICAgICAgIAkiQWx3YXlzIg0KKwkJCQl2YWx1ZSAgICAgIAkyMjkpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQkJbmFtZSAgICAgICAJIkF1dG8iDQorCQkJCXZhbHVlICAgICAgCTIzMCkpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJJbmNvbXBsZXRlVHlwZSINCisJCQl2YWx1ZSAgICAgIAkoIkluY29tcGxldGVUeXBlU2V0IiAxKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiVHlwZUNvbnRyb2xWaXNpYmlsaXR5Ig0KKwkJCXZhbHVlICAgICAgCSgiVHlwZVZpc2liaWxpdHlTZXQiIDQzKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiSW5jb21wbGV0ZVR5cGVTZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJCW5hbWUgICAgICAgCSJEb05vdERlY2xhcmUiDQorCQkJCXZhbHVlICAgICAgCTEpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQkJbmFtZSAgICAgICAJIk5vRGlzY3JpbWluYW50UGFydCINCisJCQkJdmFsdWUgICAgICAJMikNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCQluYW1lICAgICAgIAkiVW5rbm93bkRpc2NyaW1pbmFudFBhcnQiDQorCQkJCXZhbHVlICAgICAgCTMpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQkJbmFtZSAgICAgICAJIktub3duRGlzY3JpbWluYW50UGFydCINCisJCQkJdmFsdWUgICAgICAJNCkpKSkpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiUmV0dXJuVHlwZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiR2VuZXJpY0Zvcm1hbFBhcmFtZXRlcnMiDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJJc1ByaXZhdGUiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQorCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCisJCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJSZXR1cm5UeXBlIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJJc1N1YnVuaXQiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uIg0KKwkJCXZhbHVlICAgICAgCSgiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uU2V0IiAyKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiUmVuYW1lcyINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVPdmVycmlkaW5nIg0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyTW9kZSINCisJCQl2YWx1ZSAgICAgIAkoIlBhcmFtZXRlck1vZGVTZXQiIDIwMykpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyQ2xhc3NXaWRlIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc09wZXJhdGlvbiINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiSW5saW5lIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJFbnRyeUNvZGUiDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJFeGl0Q29kZSINCisJCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIkVudHJ5QmFycmllckNvbmRpdGlvbiINCisJCQl2YWx1ZSAgICAgIAkiVHJ1ZSIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KKwkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCQluYW1lICAgICAgIAkiU3BlYyINCisJCQkJdmFsdWUgICAgICAJMSkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCQluYW1lICAgICAgIAkiQm9keSINCisJCQkJdmFsdWUgICAgICAJMikNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQorCQkJCXZhbHVlICAgICAgCTMpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQkJbmFtZSAgICAgICAJIlJlbmFtaW5nIg0KKwkJCQl2YWx1ZSAgICAgIAk0KQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJCW5hbWUgICAgICAgCSJSZW5hbWluZ0FzQm9keSINCisJCQkJdmFsdWUgICAgICAJNSkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCQluYW1lICAgICAgIAkiU2VwYXJhdGUiDQorCQkJCXZhbHVlICAgICAgCTYpKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiUGFyYW1ldGVyTW9kZVNldCINCisJCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQkJbmFtZSAgICAgICAJIkluIg0KKwkJCQl2YWx1ZSAgICAgIAkyMDQpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQkJbmFtZSAgICAgICAJIk91dCINCisJCQkJdmFsdWUgICAgICAJMjA1KQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJCW5hbWUgICAgICAgCSJJbk91dCINCisJCQkJdmFsdWUgICAgICAJMjAzKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJCW5hbWUgICAgICAgCSJBY2Nlc3MiDQorCQkJCXZhbHVlICAgICAgCTIyMCkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQorCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJJbml0aWFsQ29kZUJvZHkiDQorCQkJdmFsdWUgICAgICAJIiR7ZGVmYXVsdH0iKSkpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCisJCQl2YWx1ZSAgICAgIAkiVGhlXyR7c3VwcGxpZXJ9IikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvbiINCisJCQl2YWx1ZSAgICAgIAkoIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiIDIxNikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkTmFtZSINCisJCQl2YWx1ZSAgICAgIAkiJHtyZWxhdGlvbnNoaXB9IikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXQiDQorCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDE5OSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzR2V0Ig0KKwkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KKwkJCXZhbHVlICAgICAgCSJHZXRfJHtyZWxhdGlvbnNoaXB9IikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0Ig0KKwkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NTZXQiDQorCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDEpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KKwkJCXZhbHVlICAgICAgCSJTZXRfJHtyZWxhdGlvbnNoaXB9IikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIklzQWxpYXNlZCINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiSXNDb25zdGFudCINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvbiINCisJCQl2YWx1ZSAgICAgIAkoIkNvbnRhaW5lckltcGxlbWVudGF0aW9uU2V0IiAyMTcpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZW5lcmljIg0KKwkJCXZhbHVlICAgICAgCSJMaXN0IikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIg0KKwkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJCW5hbWUgICAgICAgCSJDb21wb25lbnQiDQorCQkJCXZhbHVlICAgICAgCTIxNikNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCQluYW1lICAgICAgIAkiRGlzY3JpbWluYW50Ig0KKwkJCQl2YWx1ZSAgICAgIAkyMTgpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudCINCisJCQkJdmFsdWUgICAgICAJMjE5KSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCQluYW1lICAgICAgIAkiQXJyYXkiDQorCQkJCXZhbHVlICAgICAgCTIxNykNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCQluYW1lICAgICAgIAkiR2VuZXJpYyINCisJCQkJdmFsdWUgICAgICAJMTEpKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCisJCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCisJCQkJdmFsdWUgICAgICAJMjAyKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCisJCQkJdmFsdWUgICAgICAJMjAxKSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCINCisJCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KKwkJCQl2YWx1ZSAgICAgIAkxOTkpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KKwkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiRGVjbGFyZSINCisJCQl2YWx1ZSAgICAgIAkoIkRlY2xhcmVTZXQiIDIzNCkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIkRlY2xhcmVTZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJCW5hbWUgICAgICAgCSJCZWZvcmUiDQorCQkJCXZhbHVlICAgICAgCTIzMykNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCQluYW1lICAgICAgIAkiQWZ0ZXIiDQorCQkJCXZhbHVlICAgICAgCTIzNCkpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnRDbGFzc1dpZGUiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvbiINCisJCQl2YWx1ZSAgICAgIAkoIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiIDIxNikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkTmFtZSINCisJCQl2YWx1ZSAgICAgIAkiJHthdHRyaWJ1dGV9IikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXQiDQorCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDE5OSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzR2V0Ig0KKwkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KKwkJCXZhbHVlICAgICAgCSJHZXRfJHthdHRyaWJ1dGV9IikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0Ig0KKwkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NTZXQiDQorCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDEpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KKwkJCXZhbHVlICAgICAgCSJTZXRfJHthdHRyaWJ1dGV9IikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIklzQWxpYXNlZCINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiSXNDb25zdGFudCINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiINCisJCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJCW5hbWUgICAgICAgCSJDb21wb25lbnQiDQorCQkJCXZhbHVlICAgICAgCTIxNikNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCQluYW1lICAgICAgIAkiRGlzY3JpbWluYW50Ig0KKwkJCQl2YWx1ZSAgICAgIAkyMTgpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudCINCisJCQkJdmFsdWUgICAgICAJMjE5KSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQorCQkJCXZhbHVlICAgICAgCTIwMikNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQorCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCisJCQkJdmFsdWUgICAgICAJMTk5KQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCisJCQkJdmFsdWUgICAgICAJMjAxKSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIkRlY2xhcmUiDQorCQkJdmFsdWUgICAgICAJKCJEZWNsYXJlU2V0IiAyMzQpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJEZWNsYXJlU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCQluYW1lICAgICAgIAkiQmVmb3JlIg0KKwkJCQl2YWx1ZSAgICAgIAkyMzMpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQkJbmFtZSAgICAgICAJIkFmdGVyIg0KKwkJCQl2YWx1ZSAgICAgIAkyMzQpKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiQWNjZXNzRGlzY3JpbWluYW50Q2xhc3NXaWRlIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIg0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQorCQkJdmFsdWUgICAgICAJIlRoZV8ke3RhcmdldENsYXNzfSIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0Ig0KKwkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAxOTkpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KKwkJCXZhbHVlICAgICAgCSJHZXRfJHthc3NvY2lhdGlvbn0iKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0Ig0KKwkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiU2V0TmFtZSINCisJCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXNzb2NpYXRpb259IikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jaWF0ZSINCisJCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIkFzc29jaWF0ZU5hbWUiDQorCQkJdmFsdWUgICAgICAJIkFzc29jaWF0ZSIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jaWF0ZSINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNzb2NpYXRlIg0KKwkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiRGlzc29jaWF0ZU5hbWUiDQorCQkJdmFsdWUgICAgICAJIkRpc3NvY2lhdGUiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJJbmxpbmVEaXNzb2NpYXRlIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KKwkJCQl2YWx1ZSAgICAgIAkyMDIpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KKwkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQorCQkJCXZhbHVlICAgICAgCTE5OSkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQorCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQorCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQorCQkJdmFsdWUgICAgICAJIlRoZV8ke3RhcmdldENsYXNzfSIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb24iDQorCQkJdmFsdWUgICAgICAJKCJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0IiAyMTYpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZE5hbWUiDQorCQkJdmFsdWUgICAgICAJIiR7dGFyZ2V0fSIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0Ig0KKwkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAxOTkpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc0dldCINCisJCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMjAxKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiR2V0TmFtZSINCisJCQl2YWx1ZSAgICAgIAkiR2V0XyR7dGFyZ2V0fSIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCINCisJCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzU2V0Ig0KKwkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAxKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiU2V0TmFtZSINCisJCQl2YWx1ZSAgICAgIAkiU2V0XyR7dGFyZ2V0fSIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJJc0FsaWFzZWQiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiQ29udGFpbmVySW1wbGVtZW50YXRpb24iDQorCQkJdmFsdWUgICAgICAJKCJDb250YWluZXJJbXBsZW1lbnRhdGlvblNldCIgMjE3KSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyINCisJCQl2YWx1ZSAgICAgIAkiTGlzdCIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclR5cGUiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckRlY2xhcmF0aW9ucyINCisJCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KKwkJCQl2YWx1ZSAgICAgIAkyMDIpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KKwkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCINCisJCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudCINCisJCQkJdmFsdWUgICAgICAJMjE2KQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiDQorCQkJCXZhbHVlICAgICAgCTIxOCkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCQluYW1lICAgICAgIAkiQWNjZXNzRGlzY3JpbWluYW50Ig0KKwkJCQl2YWx1ZSAgICAgIAkyMTkpKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJCW5hbWUgICAgICAgCSJBcnJheSINCisJCQkJdmFsdWUgICAgICAJMjE3KQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJCW5hbWUgICAgICAgCSJHZW5lcmljIg0KKwkJCQl2YWx1ZSAgICAgIAkxMSkpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCisJCQkJdmFsdWUgICAgICAJMTk5KQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCisJCQkJdmFsdWUgICAgICAJMjAxKSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQkJbmFtZSAgICAgICAJIkRlY2xhcmUiDQorCQkJdmFsdWUgICAgICAJKCJEZWNsYXJlU2V0IiAyMzQpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJEZWNsYXJlU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCQluYW1lICAgICAgIAkiQmVmb3JlIg0KKwkJCQl2YWx1ZSAgICAgIAkyMzMpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQkJbmFtZSAgICAgICAJIkFmdGVyIg0KKwkJCQl2YWx1ZSAgICAgIAkyMzQpKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiQWNjZXNzRGlzY3JpbWluYW50Q2xhc3NXaWRlIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiINCisJCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiQWRhOTUiDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIg0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQorCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQorCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiQ09SQkEiDQorCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCisJCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJDT1JCQSINCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KKwkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDT1JCQSINCisJCQluYW1lICAgICAgIAkiRWRpdG9yIg0KKwkJCXZhbHVlICAgICAgCSgiRWRpdG9yVHlwZSIgMTAwKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDT1JCQSINCisJCQluYW1lICAgICAgIAkiSW5jbHVkZVBhdGgiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQ09SQkEiDQorCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQ09SQkEiDQorCQkJbmFtZSAgICAgICAJIkVkaXRvclR5cGUiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQ09SQkEiDQorCQkJCW5hbWUgICAgICAgCSJCdWlsdEluIg0KKwkJCQl2YWx1ZSAgICAgIAkxMDApDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCisJCQkJbmFtZSAgICAgICAJIldpbmRvd3NTaGVsbCINCisJCQkJdmFsdWUgICAgICAJMTAxKSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQ09SQkEiDQorCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiDQorCQkJdmFsdWUgICAgICAJIiIpKSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiQ09SQkEiDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQorCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQ09SQkEiDQorCQkJbmFtZSAgICAgICAJIkFycmF5RGltZW5zaW9ucyINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDT1JCQSINCisJCQluYW1lICAgICAgIAkiQ29uc3RWYWx1ZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDT1JCQSINCisJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIg0KKwkJCXZhbHVlICAgICAgCSIiKSkpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIkNPUkJBIg0KKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KKwkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KKwkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KKwkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAlUSUgJVolICVXJSIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KKwkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KKwkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIg0KKwkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJDT1JCQSINCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDT1JCQSINCisJCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KKwkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDT1JCQSINCisJCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCisJCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgJVElICVaJSAlVyUiKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDT1JCQSINCisJCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KKwkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDT1JCQSINCisJCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCINCisJCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiQ09SQkEiDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KKwkJCW5hbWUgICAgICAgCSJDb250ZXh0Ig0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KKwkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc09uZVdheSINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJDT1JCQSINCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQorCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQ09SQkEiDQorCQkJbmFtZSAgICAgICAJIkFycmF5RGltZW5zaW9ucyINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDT1JCQSINCisJCQluYW1lICAgICAgIAkiQ2FzZVNwZWNpZmllciINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDT1JCQSINCisJCQluYW1lICAgICAgIAkiSXNSZWFkT25seSINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDT1JCQSINCisJCQluYW1lICAgICAgIAkiT3JkZXIiDQorCQkJdmFsdWUgICAgICAJIiIpKSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiQ09SQkEiDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDT1JCQSINCisJCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KKwkJCW5hbWUgICAgICAgCSJDYXNlU3BlY2lmaWVyIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQ09SQkEiDQorCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQ09SQkEiDQorCQkJbmFtZSAgICAgICAJIk9yZGVyIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KKwkJCW5hbWUgICAgICAgCSJCb3VuZGVkUm9sZVR5cGUiDQorCQkJdmFsdWUgICAgICAJKCJBc3NvY1R5cGVTZXQiIDQ3KSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDT1JCQSINCisJCQluYW1lICAgICAgIAkiQXNzb2NUeXBlU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KKwkJCQluYW1lICAgICAgIAkiQXJyYXkiDQorCQkJCXZhbHVlICAgICAgCTI0KQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQ09SQkEiDQorCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSINCisJCQkJdmFsdWUgICAgICAJNDcpKSkpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJDT1JCQSINCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIg0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiQ09SQkEiDQorCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCisJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCisJCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJInByb2plY3QiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJUYWJsZUNvdW50ZXIiDQorCQkJdmFsdWUgICAgICAJMCkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIkRvbWFpbkNvdW50ZXIiDQorCQkJdmFsdWUgICAgICAJMCkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIlNQUGFja2FnZUNvdW50ZXIiDQorCQkJdmFsdWUgICAgICAJMCkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIlRyaWdnZXJDb3VudGVyIg0KKwkJCXZhbHVlICAgICAgCTApDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJJbmRleENvdW50ZXIiDQorCQkJdmFsdWUgICAgICAJMCkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnRDb3VudGVyIg0KKwkJCXZhbHVlICAgICAgCTApDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJTdG9yZVByb2NlZHVyZUNvdW50ZXIiDQorCQkJdmFsdWUgICAgICAJMCkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb3VudGVyIg0KKwkJCXZhbHVlICAgICAgCTApDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJGb3JlaWduS2V5Q291bnRlciINCisJCQl2YWx1ZSAgICAgIAkwKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiVGFibGVQcmVmaXgiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJEb21haW5QcmVmaXgiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJUcmlnZ2VyUHJlZml4Ig0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiSW5kZXhQcmVmaXgiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50UHJlZml4Ig0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiU3RvcmVQcm9jZWR1cmVQcmVmaXgiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5UHJlZml4Ig0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiRm9yZWlnbktleVByZWZpeCINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIlZpZXdDb3VudGVyIg0KKwkJCXZhbHVlICAgICAgCTApDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJKb2luQ291bnRlciINCisJCQl2YWx1ZSAgICAgIAkwKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiVGFibGVTcGFjZUNvdW50ZXIiDQorCQkJdmFsdWUgICAgICAJMCkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJImNPTlRBSU5FUkNvdW50ZXIiDQorCQkJdmFsdWUgICAgICAJMCkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIlZpZXdQcmVmaXgiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlUHJlZml4Ig0KKwkJCXZhbHVlICAgICAgCSIiKSkpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJImRtSXRlbSINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIkRNTmFtZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIklzRGF0YWJhc2UiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJUYXJnZXREYXRhYmFzZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIkxvY2F0aW9uIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiSXNUYWJsZVNwYWNlIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiVGFibGVTcGFjZVR5cGUiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJJc0RlYXVsdCINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIkJ1ZmZlclBvb2wiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJFeHRlbnRTaXplIg0KKwkJCXZhbHVlICAgICAgCTEpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJQcmVmZXRjaFNpemUiDQorCQkJdmFsdWUgICAgICAJMSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIlBhZ2VTaXplIg0KKwkJCXZhbHVlICAgICAgCTQpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJNYW5hZ2VkQnkiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJDb250YWluZXJMaXN0Ig0KKwkJCXZhbHVlICAgICAgCSIiKSkpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJImRtSXRlbSINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIkRNTmFtZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJImRtU2NoZW1hIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiZG1Eb21haW5QYWNrYWdlIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiSXNTY2hlbWEiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJJc0RvbWFpblBhY2thZ2UiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJJc1Jvb3RTY2hlbWEiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJJc1Jvb3REb21haW5QYWNrYWdlIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiSXNTY2hlbWFQYWNrYWdlIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiRGF0YWJhc2VJRCINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIkRCTVMiDQorCQkJdmFsdWUgICAgICAJIiIpKSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiZG1JdGVtIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiRE1OYW1lIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiSXNUYWJsZSINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIklzVmlldyINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIklzRG9tYWluIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiSXNTUFBhY2thZ2UiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJTeW5vbnltbnMiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiU291cmNlSWQiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJTb3VyY2VUeXBlIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiU2VsZWN0Q2xhdXNlIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiSXNVcGRhdGFibGUiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJDaGVja09wdGlvbiINCisJCQl2YWx1ZSAgICAgIAkwKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiUGVyc2lzdFRvU2VydmVyIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiVGFibGVTcGFjZUlEIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiQ29ycmVsYXRpb25OYW1lIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiSXNVcGRhdGVhYmxlIg0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJJc1NuYXBTaG90Ig0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiSXNEaXN0aW5jdCINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIklzUGFja2FnZSINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiZG1JdGVtIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiRE1OYW1lIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiT3JkaW5hbCINCisJCQl2YWx1ZSAgICAgIAkwKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiSXNJZGVudGl0eSINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiTnVsbHNBbGxvd2VkIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiTGVuZ3RoIg0KKwkJCXZhbHVlICAgICAgCTApDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJTY2FsZSINCisJCQl2YWx1ZSAgICAgIAkwKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiQ29sdW1uVHlwZSINCisJCQl2YWx1ZSAgICAgIAkiTmF0aXZlIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIkZvckJpdERhdGEiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWVUeXBlIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiU291cmNlSWQiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJTb3VyY2VUeXBlIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiT0lEIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJImRtSXRlbSINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIkRNTmFtZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIklzUmVsYXRpb25zaGlwIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiU291cmNlSWQiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJTb3VyY2VUeXBlIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiUklNZXRob2QiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJQYXJlbnRVcGRhdGVSdWxlIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiUGFyZW50VXBkYXRlUnVsZU5hbWUiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJQYXJlbnREZWxldGVSdWxlIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiUGFyZW50RGVsZXRlUnVsZU5hbWUiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJDaGlsZEluc2VydFJlc3RyaWN0Ig0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiQ2hpbGRJbnNlcnRSZXN0cmljdE5hbWUiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJDaGlsZE11bHRpcGxpY2l0eSINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIkNoaWxkTXVsdGlwbGljaXR5TmFtZSINCisJCQl2YWx1ZSAgICAgIAkiIikpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJImRtSXRlbSINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIkRNTmFtZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnROYW1lIg0KKwkJCXZhbHVlICAgICAgCSIiKSkpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQorCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJETU5hbWUiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJJc0NvbnN0cmFpbnQiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50VHlwZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIklzSW5kZXgiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJJc1RyaWdnZXIiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJJc1N0b3JlZFByb2NlZHVyZSINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIklzQ2x1c3RlciINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2UiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJGaWxsRmFjdG9yIg0KKwkJCXZhbHVlICAgICAgCTApDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJLZXlMaXN0Ig0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiQ2hlY2tQcmVkaWNhdGUiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJJc1VuaXF1ZSINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIkRlZmVyYWxNb2RlIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiSW5pdGlhbENoZWNrVGltZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUeXBlIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiSXNJbnNlcnRFdmVudCINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIklzVXBkYXRlRXZlbnQiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJJc0RlbGV0ZUV2ZW50Ig0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiUmVmT2xkVGFibGUiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJSZWZOZXdUYWJsZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIlJlZk9sZFJvdyINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIlJlZk5ld1JvdyINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIklzUm93Ig0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiV2hlbkNsYXVzZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIkxhbmd1YWdlIg0KKwkJCXZhbHVlICAgICAgCSJTUUwiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiUHJvY1R5cGUiDQorCQkJdmFsdWUgICAgICAJIlByb2NlZHVyZSIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJJc0RldGVybWluaXN0aWMiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJTdHlsZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIlJldHVybmVkTnVsbCINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIkV4dGVybmFsTmFtZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIkxlbmd0aCINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIlNjYWxlIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiRm9yQml0RGF0YSINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZVR5cGUiDQorCQkJdmFsdWUgICAgICAJIiIpKSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtZXRlciINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJImRtSXRlbSINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIkRNTmFtZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIklzSW5QYXJhbWV0ZXIiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIklzT3V0UGFyYW1ldGVyIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiT3JkaW5hbCINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIkxlbmd0aCINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIlNjYWxlIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCisJCQluYW1lICAgICAgIAkiRm9yQml0RGF0YSINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZVR5cGUiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWUiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KKwkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25JRCINCisJCQl2YWx1ZSAgICAgIAkiIikpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQorCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCisJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIgQ29tbXVuaWNhdG9yIg0KKwkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQorCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiZnJhbWV3b3JrIg0KKwkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQorCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiSmF2YSINCisJCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KKwkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIkphdmEiDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJSb290RGlyIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlVzZVByZWZpeGVzIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkF1dG9TeW5jIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNob3dDb2RlZ2VuRGxnIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkphdmFkb2NEZWZhdWx0QXV0aG9yIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkphdmFkb2NEZWZhdWx0VmVyc2lvbiINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdFNpbmNlIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkphdmFkb2NOdW1Bc3Rlcmlza3MiDQorCQkJdmFsdWUgICAgICAJMCkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJNYXhOdW1DaGFycyINCisJCQl2YWx1ZSAgICAgIAk4MCkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJFZGl0b3IiDQorCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlZNIg0KKwkJCXZhbHVlICAgICAgCSgiVk1UeXBlIiAyMDApKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkNsYXNzUGF0aCINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIg0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJCW5hbWUgICAgICAgCSJCdWlsdEluIg0KKwkJCQl2YWx1ZSAgICAgIAkxMDApDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCQluYW1lICAgICAgIAkiV2luZG93c1NoZWxsIg0KKwkJCQl2YWx1ZSAgICAgIAkxMDEpKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJWTVR5cGUiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQkJbmFtZSAgICAgICAJIlN1biINCisJCQkJdmFsdWUgICAgICAJMjAwKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQkJbmFtZSAgICAgICAJIk1pY3Jvc29mdCINCisJCQkJdmFsdWUgICAgICAJMjAxKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQkJbmFtZSAgICAgICAJIklCTSINCisJCQkJdmFsdWUgICAgICAJMjAyKSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiSW5zdGFuY2VWYXJpYWJsZVByZWZpeCINCisJCQl2YWx1ZSAgICAgIAkibV8iKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkNsYXNzVmFyaWFibGVQcmVmaXgiDQorCQkJdmFsdWUgICAgICAJInNfIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJEZWZhdWx0QXR0cmlidXRlRGF0YVR5cGUiDQorCQkJdmFsdWUgICAgICAJImludCIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiRGVmYXVsdE9wZXJhdGlvblJldHVyblR5cGUiDQorCQkJdmFsdWUgICAgICAJInZvaWQiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIk5vQ2xhc3NDdXN0b21EbGciDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiR2xvYmFsSW1wb3J0cyINCisJCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiT3BlbkJyYWNlQ2xhc3NTdHlsZSINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIk9wZW5CcmFjZU1ldGhvZFN0eWxlIg0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiVXNlVGFicyINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJVc2VTcGFjZXMiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJTcGFjaW5nSXRlbXMiDQorCQkJdmFsdWUgICAgICAJMykNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJSb3NlRGVmYXVsdENvbW1lbnRTdHlsZSINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkFzdGVyaXNrQ29tbWVudFN0eWxlIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkphdmFDb21tZW50U3R5bGUiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiSmF2YWRvY0F1dGhvciINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJKYXZhZG9jU2luY2UiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiSmF2YWRvY1ZlcnNpb24iDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiTm90U2hvd1Jvc2VJRERsZyINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVJvc2VJRCINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdFJldHVybkxpbmUiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTEiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDEiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUyIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTIiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQyIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMyINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkzIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MyINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJSZWZlcmVuY2VDbGFzc3BhdGgiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiVkFKYXZhV29ya2luZ0ZvbGRlciINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJCZWFuUHJlZml4Ig0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkJlYW5TdWZmaXgiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiUmVtb3RlUHJlZml4Ig0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlJlbW90ZVN1ZmZpeCINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJIb21lUHJlZml4Ig0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkhvbWVTdWZmaXgiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiUHJpbWFyeUtleVByZWZpeCINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5U3VmZml4Ig0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkVKQkRURExvY2F0aW9uIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXREVERMb2NhdGlvbiINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJEZWZhdWx0RUpCVmVyc2lvbiINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJEZWZhdWx0U2VydmxldFZlcnNpb24iDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0SjJFRUphdmFkb2MiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lSmF2YURvY1RhZ3MiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiTG9jYWxQcmVmaXgiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiTG9jYWxTdWZmaXgiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiTG9jYWxIb21lUHJlZml4Ig0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkxvY2FsSG9tZVN1ZmZpeCINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJTb3VyY2VDb250cm9sIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNDQ1NlbGVjdGVkIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNDQ1Byb2plY3RTb3VyY2VSb290Ig0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNDQ1Byb2plY3ROYW1lIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNDQ0NvbW1lbnQiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiSmF2YSINCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJGaW5hbCINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIg0KKwkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJDdG9yX1NldCINCisJCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCQluYW1lICAgICAgIAkicHVibGljIg0KKwkJCQl2YWx1ZSAgICAgIAk2MikNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJCW5hbWUgICAgICAgCSJwcm90ZWN0ZWQiDQorCQkJCXZhbHVlICAgICAgCTYzKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQkJbmFtZSAgICAgICAJInByaXZhdGUiDQorCQkJCXZhbHVlICAgICAgCTY0KQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQkJbmFtZSAgICAgICAJInBhY2thZ2UiDQorCQkJCXZhbHVlICAgICAgCTY1KSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaW5hbGl6ZXIiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb2RlIg0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiRGlzYWJsZUF1dG9TeW5jIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlJlYWRPbmx5Ig0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXROYW1lIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZXh0UmVmIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIklzU2luZ2xlVGhyZWFkIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiU2VydmxldElzU2VjdXJlIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJJbmNsdWRlIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJGb3J3YXJkIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXRTZWN1cml0eVJvbGVzIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXRnZXRJbmZvIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXRYTUxGaWxlUGF0aCINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXIiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlck5hbWVzIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckhlYWRlcnMiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiU2VydmxldEludEhlYWRlciINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RGF0ZUhlYWRlciINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29va2llIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckNvb2tpZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGVudFR5cGUiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVIVE1MIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlX1hNTF9ERCINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkVKQkVudmlyb25tZW50UHJvcGVydGllcyINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJFSkJDbnhGYWN0b3J5Ig0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiRUpCU2VjdXJpdHlSb2xlcyINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJFSkJOYW1lSW5KQVIiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiDQorCQkJdmFsdWUgICAgICAJKCJFSkJTZXNzaW9uVHlwZV9TZXQiIDIwMCkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGVfU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJCW5hbWUgICAgICAgCSIiDQorCQkJCXZhbHVlICAgICAgCTIwMCkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiDQorCQkJCXZhbHVlICAgICAgCTIwMSkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJCW5hbWUgICAgICAgCSJTdGF0ZWZ1bCINCisJCQkJdmFsdWUgICAgICAJMjAyKSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlIg0KKwkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiDQorCQkJCXZhbHVlICAgICAgCTIxMSkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJCW5hbWUgICAgICAgCSJCZWFuIg0KKwkJCQl2YWx1ZSAgICAgIAkyMTIpKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiDQorCQkJdmFsdWUgICAgICAJKCJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IiAyMjApKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQkJbmFtZSAgICAgICAJIiINCisJCQkJdmFsdWUgICAgICAJMjIwKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQkJbmFtZSAgICAgICAJIkJlYW4iDQorCQkJCXZhbHVlICAgICAgCTIyMSkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiDQorCQkJCXZhbHVlICAgICAgCTIyMikpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkVKQlJlZW50cmFudCINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uU3luYyINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uIg0KKwkJCXZhbHVlICAgICAgCSgiRUpCVmVyc2lvbl9TZXQiIDIzMCkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbl9TZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQkJbmFtZSAgICAgICAJIjIuMCINCisJCQkJdmFsdWUgICAgICAJMjMwKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQkJbmFtZSAgICAgICAJIjEueCINCisJCQkJdmFsdWUgICAgICAJMjMxKSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiRUpCWE1MRmlsZVBhdGgiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiQk1QX0V4dGVuZF9DTVAiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiSmF2YSINCisJCW5hbWUgICAgICAgCSJEZWZhdWx0X1NlcnZsZXRfX0NsYXNzIg0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXROYW1lIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZXh0UmVmIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIklzU2luZ2xlVGhyZWFkIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiU2VydmxldElzU2VjdXJlIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJJbmNsdWRlIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJGb3J3YXJkIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXRTZWN1cml0eVJvbGVzIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXRnZXRJbmZvIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiDQorCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJCW5hbWUgICAgICAgCSJwdWJsaWMiDQorCQkJCXZhbHVlICAgICAgCTYyKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQkJbmFtZSAgICAgICAJInByb3RlY3RlZCINCisJCQkJdmFsdWUgICAgICAJNjMpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCQluYW1lICAgICAgIAkicHJpdmF0ZSINCisJCQkJdmFsdWUgICAgICAJNjQpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCQluYW1lICAgICAgIAkicGFja2FnZSINCisJCQkJdmFsdWUgICAgICAJNjUpKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvZGUiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJEaXNhYmxlQXV0b1N5bmMiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiUmVhZE9ubHkiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiU2VydmxldFhNTEZpbGVQYXRoIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyTmFtZXMiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXREYXRlSGVhZGVyIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZW50VHlwZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVfWE1MX0REIg0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiRUpCQ21wRmllbGQiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkVKQkNueEZhY3RvcnkiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiRUpCUmVmZXJlbmNlcyINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkVKQk5hbWVJbkpBUiINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZSINCisJCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQkJbmFtZSAgICAgICAJIiINCisJCQkJdmFsdWUgICAgICAJMjAwKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQkJbmFtZSAgICAgICAJIlN0YXRlbGVzcyINCisJCQkJdmFsdWUgICAgICAJMjAxKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIg0KKwkJCQl2YWx1ZSAgICAgIAkyMDIpKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGUiDQorCQkJdmFsdWUgICAgICAJKCJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IiAyMTEpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciINCisJCQkJdmFsdWUgICAgICAJMjExKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQkJbmFtZSAgICAgICAJIkJlYW4iDQorCQkJCXZhbHVlICAgICAgCTIxMikpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZSINCisJCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCINCisJCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCQluYW1lICAgICAgIAkiIg0KKwkJCQl2YWx1ZSAgICAgIAkyMjApDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCQluYW1lICAgICAgIAkiQmVhbiINCisJCQkJdmFsdWUgICAgICAJMjIxKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciINCisJCQkJdmFsdWUgICAgICAJMjIyKSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiRUpCUmVlbnRyYW50Ig0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25TeW5jIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb24iDQorCQkJdmFsdWUgICAgICAJKCJFSkJWZXJzaW9uX1NldCIgMjMwKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uX1NldCINCisJCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCQluYW1lICAgICAgIAkiMi4wIg0KKwkJCQl2YWx1ZSAgICAgIAkyMzApDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCQluYW1lICAgICAgIAkiMS54Ig0KKwkJCQl2YWx1ZSAgICAgIAkyMzEpKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJFSkJYTUxGaWxlUGF0aCINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJCTVBfRXh0ZW5kX0NNUCINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJTdHJpY3RmcCINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJbmFtZSAgICAgICAJIkh0dHBfU2VydmxldF9fQ2xhc3MiDQorCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JIZWFkZXJzIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiU2VydmxldENvb2tpZSINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSFRNTCINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJGaW5hbCINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIg0KKwkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJDdG9yX1NldCINCisJCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCQluYW1lICAgICAgIAkicHVibGljIg0KKwkJCQl2YWx1ZSAgICAgIAk2MikNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJCW5hbWUgICAgICAgCSJwcm90ZWN0ZWQiDQorCQkJCXZhbHVlICAgICAgCTYzKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQkJbmFtZSAgICAgICAJInByaXZhdGUiDQorCQkJCXZhbHVlICAgICAgCTY0KQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQkJbmFtZSAgICAgICAJInBhY2thZ2UiDQorCQkJCXZhbHVlICAgICAgCTY1KSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaW5hbGl6ZXIiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb2RlIg0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiRGlzYWJsZUF1dG9TeW5jIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlJlYWRPbmx5Ig0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXROYW1lIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZXh0UmVmIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIklzU2luZ2xlVGhyZWFkIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiU2VydmxldElzU2VjdXJlIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJJbmNsdWRlIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJGb3J3YXJkIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXRTZWN1cml0eVJvbGVzIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXRnZXRJbmZvIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXRYTUxGaWxlUGF0aCINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJFSkJDbXBGaWVsZCINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJFSkJSZWZlcmVuY2VzIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkVKQlNlY3VyaXR5Um9sZXMiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlIg0KKwkJCXZhbHVlICAgICAgCSgiRUpCU2Vzc2lvblR5cGVfU2V0IiAyMDApKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlX1NldCINCisJCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCQluYW1lICAgICAgIAkiIg0KKwkJCQl2YWx1ZSAgICAgIAkyMDApDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCQluYW1lICAgICAgIAkiU3RhdGVsZXNzIg0KKwkJCQl2YWx1ZSAgICAgIAkyMDEpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCQluYW1lICAgICAgIAkiU3RhdGVmdWwiDQorCQkJCXZhbHVlICAgICAgCTIwMikpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSINCisJCQl2YWx1ZSAgICAgIAkoIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiIDIxMSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCINCisJCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIg0KKwkJCQl2YWx1ZSAgICAgIAkyMTEpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCQluYW1lICAgICAgIAkiQmVhbiINCisJCQkJdmFsdWUgICAgICAJMjEyKSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlIg0KKwkJCXZhbHVlICAgICAgCSgiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIgMjIwKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJCW5hbWUgICAgICAgCSIiDQorCQkJCXZhbHVlICAgICAgCTIyMCkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJCW5hbWUgICAgICAgCSJCZWFuIg0KKwkJCQl2YWx1ZSAgICAgIAkyMjEpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIg0KKwkJCQl2YWx1ZSAgICAgIAkyMjIpKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblN5bmMiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbiINCisJCQl2YWx1ZSAgICAgIAkoIkVKQlZlcnNpb25fU2V0IiAyMzApKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb25fU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJCW5hbWUgICAgICAgCSIyLjAiDQorCQkJCXZhbHVlICAgICAgCTIzMCkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJCW5hbWUgICAgICAgCSIxLngiDQorCQkJCXZhbHVlICAgICAgCTIzMSkpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkVKQlhNTEZpbGVQYXRoIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkJNUF9FeHRlbmRfQ01QIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlN0cmljdGZwIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIkphdmEiDQorCQluYW1lICAgICAgIAkiRGVmYXVsdF9FSkJfX0NsYXNzIg0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlX1hNTF9ERCINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkVKQkVudmlyb25tZW50UHJvcGVydGllcyINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJFSkJDbnhGYWN0b3J5Ig0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiRUpCU2VjdXJpdHlSb2xlcyINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJFSkJOYW1lSW5KQVIiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiDQorCQkJdmFsdWUgICAgICAJKCJFSkJTZXNzaW9uVHlwZV9TZXQiIDIwMCkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGVfU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJCW5hbWUgICAgICAgCSIiDQorCQkJCXZhbHVlICAgICAgCTIwMCkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiDQorCQkJCXZhbHVlICAgICAgCTIwMSkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJCW5hbWUgICAgICAgCSJTdGF0ZWZ1bCINCisJCQkJdmFsdWUgICAgICAJMjAyKSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlIg0KKwkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiDQorCQkJCXZhbHVlICAgICAgCTIxMSkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJCW5hbWUgICAgICAgCSJCZWFuIg0KKwkJCQl2YWx1ZSAgICAgIAkyMTIpKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiDQorCQkJdmFsdWUgICAgICAJKCJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IiAyMjApKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQkJbmFtZSAgICAgICAJIiINCisJCQkJdmFsdWUgICAgICAJMjIwKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQkJbmFtZSAgICAgICAJIkJlYW4iDQorCQkJCXZhbHVlICAgICAgCTIyMSkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiDQorCQkJCXZhbHVlICAgICAgCTIyMikpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkVKQlJlZW50cmFudCINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJCTVBfRXh0ZW5kX0NNUCINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJGaW5hbCINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIg0KKwkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJDdG9yX1NldCINCisJCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCQluYW1lICAgICAgIAkicHVibGljIg0KKwkJCQl2YWx1ZSAgICAgIAk2MikNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJCW5hbWUgICAgICAgCSJwcm90ZWN0ZWQiDQorCQkJCXZhbHVlICAgICAgCTYzKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQkJbmFtZSAgICAgICAJInByaXZhdGUiDQorCQkJCXZhbHVlICAgICAgCTY0KQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQkJbmFtZSAgICAgICAJInBhY2thZ2UiDQorCQkJCXZhbHVlICAgICAgCTY1KSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaW5hbGl6ZXIiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb2RlIg0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiRGlzYWJsZUF1dG9TeW5jIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlJlYWRPbmx5Ig0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXROYW1lIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZXh0UmVmIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIklzU2luZ2xlVGhyZWFkIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiU2VydmxldElzU2VjdXJlIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJJbmNsdWRlIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJGb3J3YXJkIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXRTZWN1cml0eVJvbGVzIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXRnZXRJbmZvIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXRYTUxGaWxlUGF0aCINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXIiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlck5hbWVzIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckhlYWRlcnMiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiU2VydmxldEludEhlYWRlciINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RGF0ZUhlYWRlciINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29va2llIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckNvb2tpZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGVudFR5cGUiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVIVE1MIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25TeW5jIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb24iDQorCQkJdmFsdWUgICAgICAJKCJFSkJWZXJzaW9uX1NldCIgMjMwKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uX1NldCINCisJCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCQluYW1lICAgICAgIAkiMi4wIg0KKwkJCQl2YWx1ZSAgICAgIAkyMzApDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCQluYW1lICAgICAgIAkiMS54Ig0KKwkJCQl2YWx1ZSAgICAgIAkyMzEpKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJFSkJYTUxGaWxlUGF0aCINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJTdHJpY3RmcCINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCisJCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiSmF2YSINCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KKwkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIkphdmEiDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJGaW5hbCINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJOYXRpdmUiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiU3luY2hyb25pemVkIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRSZXR1cm4iDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiUmVwbGFjZUV4aXN0aW5nQ29kZSINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlN0cmljdGZwIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIkphdmEiDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlRyYW5zaWVudCINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJWb2xhdGlsZSINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eVR5cGUiDQorCQkJdmFsdWUgICAgICAJKCJCZWFuUHJvcGVydHlfU2V0IiA3MSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiQmVhblByb3BlcnR5X1NldCINCisJCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCQluYW1lICAgICAgIAkiTm90IEEgUHJvcGVydHkiDQorCQkJCXZhbHVlICAgICAgCTcxKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQkJbmFtZSAgICAgICAJIlNpbXBsZSINCisJCQkJdmFsdWUgICAgICAJNzIpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCQluYW1lICAgICAgIAkiQm91bmQiDQorCQkJCXZhbHVlICAgICAgCTczKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbmVkIg0KKwkJCQl2YWx1ZSAgICAgIAk3NCkpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkluZGl2aWR1YWxDaGFuZ2VNZ3QiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZSINCisJCQl2YWx1ZSAgICAgIAkoIlJlYWQvV3JpdGVfU2V0IiA4MSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZV9TZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQkJbmFtZSAgICAgICAJIlJlYWQgJiBXcml0ZSINCisJCQkJdmFsdWUgICAgICAJODEpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCQluYW1lICAgICAgIAkiUmVhZCBPbmx5Ig0KKwkJCQl2YWx1ZSAgICAgIAk4MikNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJCW5hbWUgICAgICAgCSJXcml0ZSBPbmx5Ig0KKwkJCQl2YWx1ZSAgICAgIAk4MykpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRUeXBlcyINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQorCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIlRyYW5zaWVudCINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJWb2xhdGlsZSINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eVR5cGUiDQorCQkJdmFsdWUgICAgICAJKCJCZWFuUHJvcGVydHlfU2V0IiA3MSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiQmVhblByb3BlcnR5X1NldCINCisJCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCQluYW1lICAgICAgIAkiTm90IEEgUHJvcGVydHkiDQorCQkJCXZhbHVlICAgICAgCTcxKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQkJbmFtZSAgICAgICAJIlNpbXBsZSINCisJCQkJdmFsdWUgICAgICAJNzIpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCQluYW1lICAgICAgIAkiQm91bmQiDQorCQkJCXZhbHVlICAgICAgCTczKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbmVkIg0KKwkJCQl2YWx1ZSAgICAgIAk3NCkpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkluZGl2aWR1YWxDaGFuZ2VNZ3QiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZSINCisJCQl2YWx1ZSAgICAgIAkoIlJlYWQvV3JpdGVfU2V0IiA4MSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZV9TZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiSmF2YSINCisJCQkJbmFtZSAgICAgICAJIlJlYWQgJiBXcml0ZSINCisJCQkJdmFsdWUgICAgICAJODEpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCQluYW1lICAgICAgIAkiUmVhZCBPbmx5Ig0KKwkJCQl2YWx1ZSAgICAgIAk4MikNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJCW5hbWUgICAgICAgCSJXcml0ZSBPbmx5Ig0KKwkJCQl2YWx1ZSAgICAgIAk4MykpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkphdmEiDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRUeXBlcyINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJKYXZhIg0KKwkJCW5hbWUgICAgICAgCSJJc05hdmlnYWJsZSINCisJCQl2YWx1ZSAgICAgIAlUUlVFKSkpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIkphdmEiDQorCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCisJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KKwkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQorCQl2YWx1ZSAgICAgIAkiMzYwMDAwMDAyIikNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiT3JhY2xlOCINCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQorCQkJbmFtZSAgICAgICAJIkRETFNjcmlwdEZpbGVuYW1lIg0KKwkJCXZhbHVlICAgICAgCSJEREwxLlNRTCIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCisJCQluYW1lICAgICAgIAkiRHJvcENsYXVzZSINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KKwkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q29sdW1uTmFtZSINCisJCQl2YWx1ZSAgICAgIAkiX0lEIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KKwkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q29sdW1uVHlwZSINCisJCQl2YWx1ZSAgICAgIAkiTlVNQkVSKDUsMCkiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQorCQkJbmFtZSAgICAgICAJIlNjaGVtYU5hbWVQcmVmaXgiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCisJCQluYW1lICAgICAgIAkiU2NoZW1hTmFtZVN1ZmZpeCINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KKwkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWVQcmVmaXgiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCisJCQluYW1lICAgICAgIAkiVGFibGVOYW1lU3VmZml4Ig0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQorCQkJbmFtZSAgICAgICAJIlR5cGVOYW1lUHJlZml4Ig0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQorCQkJbmFtZSAgICAgICAJIlR5cGVOYW1lU3VmZml4Ig0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQorCQkJbmFtZSAgICAgICAJIlZpZXdOYW1lUHJlZml4Ig0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQorCQkJbmFtZSAgICAgICAJIlZpZXdOYW1lU3VmZml4Ig0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQorCQkJbmFtZSAgICAgICAJIlZhcnJheU5hbWVQcmVmaXgiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCisJCQluYW1lICAgICAgIAkiVmFycmF5TmFtZVN1ZmZpeCINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KKwkJCW5hbWUgICAgICAgCSJOZXN0ZWRUYWJsZU5hbWVQcmVmaXgiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCisJCQluYW1lICAgICAgIAkiTmVzdGVkVGFibGVOYW1lU3VmZml4Ig0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQorCQkJbmFtZSAgICAgICAJIk9iamVjdFRhYmxlTmFtZVByZWZpeCINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KKwkJCW5hbWUgICAgICAgCSJPYmplY3RUYWJsZU5hbWVTdWZmaXgiDQorCQkJdmFsdWUgICAgICAJIiIpKSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiT3JhY2xlOCINCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KKwkJCW5hbWUgICAgICAgCSJJc1NjaGVtYSINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQorCQkJbmFtZSAgICAgICAJIk9JRCINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KKwkJCW5hbWUgICAgICAgCSJXaGVyZUNsYXVzZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KKwkJCW5hbWUgICAgICAgCSJDaGVja0NvbnN0cmFpbnQiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCisJCQluYW1lICAgICAgIAkiQ29sbGVjdGlvblR5cGVMZW5ndGgiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCisJCQluYW1lICAgICAgIAkiQ29sbGVjdGlvblR5cGVQcmVjaXNpb24iDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCisJCQluYW1lICAgICAgIAkiQ29sbGVjdGlvblR5cGVTY2FsZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KKwkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uT2ZSRUZTIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQorCQkJbmFtZSAgICAgICAJIk1ldGhvZEtpbmQiDQorCQkJdmFsdWUgICAgICAJKCJNZXRob2RLaW5kU2V0IiAxOTAzKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KKwkJCW5hbWUgICAgICAgCSJPdmVybG9hZElEIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQorCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQorCQkJbmFtZSAgICAgICAJIklzUmVhZE5vRGF0YVN0YXRlIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQorCQkJbmFtZSAgICAgICAJIklzUmVhZE5vUHJvY2Vzc1N0YXRlIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQorCQkJbmFtZSAgICAgICAJIklzV3JpdGVOb0RhdGFTdGF0ZSINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KKwkJCW5hbWUgICAgICAgCSJJc1dyaXRlTm9Qcm9jZXNzU3RhdGUiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCisJCQluYW1lICAgICAgIAkiSXNTZWxmaXNoIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQorCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUeXBlIg0KKwkJCXZhbHVlICAgICAgCSgiVHJpZ2dlclR5cGVTZXQiIDE4MDEpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQorCQkJbmFtZSAgICAgICAJIlRyaWdnZXJFdmVudCINCisJCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJFdmVudFNldCIgMTYwMSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCisJCQluYW1lICAgICAgIAkiVHJpZ2dlclRleHQiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCisJCQluYW1lICAgICAgIAkiVHJpZ2dlclJlZmVyZW5jaW5nTmFtZXMiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCisJCQluYW1lICAgICAgIAkiVHJpZ2dlckZvckVhY2giDQorCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyRm9yRWFjaFNldCIgMTcwMSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCisJCQluYW1lICAgICAgIAkiVHJpZ2dlcldoZW5DbGF1c2UiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCisJCQluYW1lICAgICAgIAkiTWV0aG9kS2luZFNldCINCisJCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KKwkJCQluYW1lICAgICAgIAkiTWFwTWV0aG9kIg0KKwkJCQl2YWx1ZSAgICAgIAkxOTAxKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCisJCQkJbmFtZSAgICAgICAJIk9yZGVyTWV0aG9kIg0KKwkJCQl2YWx1ZSAgICAgIAkxOTAyKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCisJCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KKwkJCQl2YWx1ZSAgICAgIAkxOTAzKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCisJCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCisJCQkJdmFsdWUgICAgICAJMTkwNCkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQorCQkJCW5hbWUgICAgICAgCSJPcGVyYXRvciINCisJCQkJdmFsdWUgICAgICAJMTkwNSkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQorCQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvciINCisJCQkJdmFsdWUgICAgICAJMTkwNikNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQorCQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yIg0KKwkJCQl2YWx1ZSAgICAgIAkxOTA3KQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCisJCQkJbmFtZSAgICAgICAJIlRyaWdnZXIiDQorCQkJCXZhbHVlICAgICAgCTE5MDgpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KKwkJCQluYW1lICAgICAgIAkiQ2FsY3VsYXRlZCINCisJCQkJdmFsdWUgICAgICAJMTkwOSkpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQorCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUeXBlU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQorCQkJCW5hbWUgICAgICAgCSJBRlRFUiINCisJCQkJdmFsdWUgICAgICAJMTgwMSkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQorCQkJCW5hbWUgICAgICAgCSJCRUZPUkUiDQorCQkJCXZhbHVlICAgICAgCTE4MDIpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KKwkJCQluYW1lICAgICAgIAkiSU5TVEVBRCBPRiINCisJCQkJdmFsdWUgICAgICAJMTgwMykpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQorCQkJbmFtZSAgICAgICAJIlRyaWdnZXJGb3JFYWNoU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQorCQkJCW5hbWUgICAgICAgCSJST1ciDQorCQkJCXZhbHVlICAgICAgCTE3MDEpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KKwkJCQluYW1lICAgICAgIAkiU1RBVEVNRU5UIg0KKwkJCQl2YWx1ZSAgICAgIAkxNzAyKSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCisJCQluYW1lICAgICAgIAkiVHJpZ2dlckV2ZW50U2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQorCQkJCW5hbWUgICAgICAgCSJJTlNFUlQiDQorCQkJCXZhbHVlICAgICAgCTE2MDEpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KKwkJCQluYW1lICAgICAgIAkiVVBEQVRFIg0KKwkJCQl2YWx1ZSAgICAgIAkxNjAyKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCisJCQkJbmFtZSAgICAgICAJIkRFTEVURSINCisJCQkJdmFsdWUgICAgICAJMTYwMykNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQorCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgVVBEQVRFIg0KKwkJCQl2YWx1ZSAgICAgIAkxNjA0KQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCisJCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBERUxFVEUiDQorCQkJCXZhbHVlICAgICAgCTE2MDUpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KKwkJCQluYW1lICAgICAgIAkiVVBEQVRFIE9SIERFTEVURSINCisJCQkJdmFsdWUgICAgICAJMTYwNikNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQorCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgVVBEQVRFIE9SIERFTEVURSINCisJCQkJdmFsdWUgICAgICAJMTYwNykpKSkpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KKwkJCW5hbWUgICAgICAgCSJPcmRlck51bWJlciINCisJCQl2YWx1ZSAgICAgIAkiIikpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KKwkJCW5hbWUgICAgICAgCSJPcmRlck51bWJlciINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KKwkJCW5hbWUgICAgICAgCSJJc1VuaXF1ZSINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KKwkJCW5hbWUgICAgICAgCSJOdWxsc0FsbG93ZWQiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KKwkJCW5hbWUgICAgICAgCSJMZW5ndGgiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCisJCQluYW1lICAgICAgIAkiUHJlY2lzaW9uIg0KKwkJCXZhbHVlICAgICAgCSIyIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KKwkJCW5hbWUgICAgICAgCSJTY2FsZSINCisJCQl2YWx1ZSAgICAgIAkiNiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCisJCQluYW1lICAgICAgIAkiSXNJbmRleCINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KKwkJCW5hbWUgICAgICAgCSJJc1ByaW1hcnlLZXkiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCisJCQluYW1lICAgICAgIAkiQ29tcG9zaXRlVW5pcXVlIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQorCQkJbmFtZSAgICAgICAJIkNoZWNrQ29uc3RyYWludCINCisJCQl2YWx1ZSAgICAgIAkiIikpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KKwkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQorCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiUjJFZGl0b3IiDQorCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCisJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJDb21wb25lbnRUZXN0Ig0KKwkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQorCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiY2ciDQorCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCisJCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJjZyINCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyQW5ub3RhdGlvbnMiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJWZXJzaW9uIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJVc2VNU1ZDIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIg0KKwkJCXZhbHVlICAgICAgCSJoIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUJhY2t1cEV4dGVuc2lvbiINCisJCQl2YWx1ZSAgICAgIAkiaH4iKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KKwkJCXZhbHVlICAgICAgCSJoIyIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlRXh0ZW5zaW9uIg0KKwkJCXZhbHVlICAgICAgCSJjcHAiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUJhY2t1cEV4dGVuc2lvbiINCisJCQl2YWx1ZSAgICAgIAkiY3B+IikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiQ29kZUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQorCQkJdmFsdWUgICAgICAJImNwIyIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCINCisJCQl2YWx1ZSAgICAgIAkzMCkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KKwkJCXZhbHVlICAgICAgCSIkUk9TRUNQUF9TT1VSQ0UiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJGaWxlTmFtZUZvcm1hdCINCisJCQl2YWx1ZSAgICAgIAkiMTI4dnhfYiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkJvb2xlYW5UeXBlIg0KKwkJCXZhbHVlICAgICAgCSJpbnQiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJBbGxvd1RlbXBsYXRlcyINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJBbGxvd0V4cGxpY2l0SW5zdGFudGlhdGlvbnMiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkFsbG93UHJvdGVjdGVkSW5oZXJpdGFuY2UiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiQ29tbWVudFdpZHRoIg0KKwkJCXZhbHVlICAgICAgCTYwKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJPbmVCeVZhbHVlQ29udGFpbmVyIg0KKwkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJPbmVCeVJlZmVyZW5jZUNvbnRhaW5lciINCisJCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5VmFsdWVDb250YWluZXIiDQorCQkJdmFsdWUgICAgICAJIk9wdGlvbmFsQnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVJlZmVyZW5jZUNvbnRhaW5lciINCisJCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJGaXhlZEJ5VmFsdWVDb250YWluZXIiDQorCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVZhbHVlQ29udGFpbmVyIg0KKwkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQorCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KKwkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiQm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQorCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KKwkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCisJCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCisJCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCisJCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQorCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KKwkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KKwkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciINCisJCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiDQorCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KKwkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KKwkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiQWx3YXlzS2VlcE9ycGhhbmVkQ29kZSINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJjZyINCisJCW5hbWUgICAgICAgCSJjb21waWxlcjIuMV9fUHJvamVjdCINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlckFubm90YXRpb25zIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyVmVyc2lvbiINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiINCisJCQl2YWx1ZSAgICAgIAkiaCIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVCYWNrdXBFeHRlbnNpb24iDQorCQkJdmFsdWUgICAgICAJImh+IikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCisJCQl2YWx1ZSAgICAgIAkiaCMiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUV4dGVuc2lvbiINCisJCQl2YWx1ZSAgICAgIAkiY3BwIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiQ29kZUZpbGVCYWNrdXBFeHRlbnNpb24iDQorCQkJdmFsdWUgICAgICAJImNwfiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KKwkJCXZhbHVlICAgICAgCSJjcCMiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiDQorCQkJdmFsdWUgICAgICAJMzApDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCisJCQl2YWx1ZSAgICAgIAkiJFJPU0VDUFBfU09VUkNFIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiQm9vbGVhblR5cGUiDQorCQkJdmFsdWUgICAgICAJImludCIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkFsbG93VGVtcGxhdGVzIg0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkFsbG93RXhwbGljaXRJbnN0YW50aWF0aW9ucyINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiQWxsb3dQcm90ZWN0ZWRJbmhlcml0YW5jZSINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJPbmVCeVZhbHVlQ29udGFpbmVyIg0KKwkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJPbmVCeVJlZmVyZW5jZUNvbnRhaW5lciINCisJCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5VmFsdWVDb250YWluZXIiDQorCQkJdmFsdWUgICAgICAJIk9wdGlvbmFsQnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVJlZmVyZW5jZUNvbnRhaW5lciINCisJCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJGaXhlZEJ5VmFsdWVDb250YWluZXIiDQorCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVZhbHVlQ29udGFpbmVyIg0KKwkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQorCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KKwkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiQm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQorCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KKwkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCisJCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCisJCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCisJCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQorCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KKwkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KKwkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciINCisJCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiDQorCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KKwkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KKwkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiRmlsZU5hbWVGb3JtYXQiDQorCQkJdmFsdWUgICAgICAJIjEyOHZ4X2IiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJBbHdheXNLZWVwT3JwaGFuZWRDb2RlIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJVc2VNU1ZDIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiDQorCQkJdmFsdWUgICAgICAJNjApKSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiY2ciDQorCQluYW1lICAgICAgIAkiY29tcGlsZXIzLjBfX1Byb2plY3QiDQorCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJBbm5vdGF0aW9ucyINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlclZlcnNpb24iDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iDQorCQkJdmFsdWUgICAgICAJImgiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlQmFja3VwRXh0ZW5zaW9uIg0KKwkJCXZhbHVlICAgICAgCSJofiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQorCQkJdmFsdWUgICAgICAJImgjIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiQ29kZUZpbGVFeHRlbnNpb24iDQorCQkJdmFsdWUgICAgICAJImNwcCIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlQmFja3VwRXh0ZW5zaW9uIg0KKwkJCXZhbHVlICAgICAgCSJjcH4iKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJDb2RlRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCisJCQl2YWx1ZSAgICAgIAkiY3AjIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0Ig0KKwkJCXZhbHVlICAgICAgCTMwKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQorCQkJdmFsdWUgICAgICAJIiRST1NFQ1BQX1NPVVJDRSIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkJvb2xlYW5UeXBlIg0KKwkJCXZhbHVlICAgICAgCSJpbnQiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJBbGxvd1RlbXBsYXRlcyINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJBbGxvd0V4cGxpY2l0SW5zdGFudGlhdGlvbnMiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkFsbG93UHJvdGVjdGVkSW5oZXJpdGFuY2UiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiT25lQnlWYWx1ZUNvbnRhaW5lciINCisJCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiT25lQnlSZWZlcmVuY2VDb250YWluZXIiDQorCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIg0KKwkJCXZhbHVlICAgICAgCSJPcHRpb25hbEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlSZWZlcmVuY2VDb250YWluZXIiDQorCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiRml4ZWRCeVZhbHVlQ29udGFpbmVyIg0KKwkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlWYWx1ZUNvbnRhaW5lciINCisJCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KKwkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCisJCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KKwkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCisJCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQorCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQorCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQorCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KKwkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCisJCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCisJCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiDQorCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KKwkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCisJCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCisJCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lRm9ybWF0Ig0KKwkJCXZhbHVlICAgICAgCSIxMjh2eF9iIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiQWx3YXlzS2VlcE9ycGhhbmVkQ29kZSINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiVXNlTVNWQyINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiQ29tbWVudFdpZHRoIg0KKwkJCXZhbHVlICAgICAgCTYwKSkpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJImNnIg0KKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJDbGFzc0tleSINCisJCQl2YWx1ZSAgICAgIAkiY2xhc3MiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyINCisJCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiTm9uZSINCisJCQkJdmFsdWUgICAgICAJMCkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIg0KKwkJCQl2YWx1ZSAgICAgIAkxKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCINCisJCQkJdmFsdWUgICAgICAJMikNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiQWxsIg0KKwkJCQl2YWx1ZSAgICAgIAkzKSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIlB1dEJvZGllc0luU3BlYyINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiDQorCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yVmlzaWJpbGl0eSINCisJCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJFeHBsaWNpdERlZmF1bHRDb25zdHJ1Y3RvciINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb3B5Q29uc3RydWN0b3IiDQorCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yVmlzaWJpbGl0eSINCisJCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiSW5saW5lQ29weUNvbnN0cnVjdG9yIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJFeHBsaWNpdENvcHlDb25zdHJ1Y3RvciINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXN0cnVjdG9yIg0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JWaXNpYmlsaXR5Ig0KKwkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yS2luZCINCisJCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiSW5saW5lRGVzdHJ1Y3RvciINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NpZ25tZW50T3BlcmF0aW9uIg0KKwkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRWaXNpYmlsaXR5Ig0KKwkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50S2luZCINCisJCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiSW5saW5lQXNzaWdubWVudE9wZXJhdGlvbiINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVFcXVhbGl0eU9wZXJhdGlvbnMiDQorCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiRXF1YWxpdHlWaXNpYmlsaXR5Ig0KKwkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJFcXVhbGl0eUtpbmQiDQorCQkJdmFsdWUgICAgICAJKCJGcmllbmRLaW5kU2V0IiAyMDApKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJJbmxpbmVFcXVhbGl0eU9wZXJhdGlvbnMiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUmVsYXRpb25hbE9wZXJhdGlvbnMiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIlJlbGF0aW9uYWxWaXNpYmlsaXR5Ig0KKwkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJSZWxhdGlvbmFsS2luZCINCisJCQl2YWx1ZSAgICAgIAkoIkZyaWVuZEtpbmRTZXQiIDIwMCkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIklubGluZVJlbGF0aW9uYWxPcGVyYXRpb25zIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0b3JhZ2VNZ210T3BlcmF0aW9ucyINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiU3RvcmFnZU1nbXRWaXNpYmlsaXR5Ig0KKwkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJJbmxpbmVTdG9yYWdlTWdtdE9wZXJhdGlvbnMiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3Vic2NyaXB0T3BlcmF0aW9uIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRWaXNpYmlsaXR5Ig0KKwkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRLaW5kIg0KKwkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRSZXN1bHRUeXBlIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJJbmxpbmVTdWJzY3JpcHRPcGVyYXRpb24iDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVyZWZlcmVuY2VPcGVyYXRpb24iDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlVmlzaWJpbGl0eSINCisJCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VLaW5kIg0KKwkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZVJlc3VsdFR5cGUiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIklubGluZURlcmVmZXJlbmNlT3BlcmF0aW9uIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluZGlyZWN0aW9uT3BlcmF0aW9uIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvblZpc2liaWxpdHkiDQorCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uS2luZCINCisJCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25SZXN1bHRUeXBlIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJJbmxpbmVJbmRpcmVjdGlvbk9wZXJhdGlvbiINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdHJlYW1PcGVyYXRpb25zIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJTdHJlYW1WaXNpYmlsaXR5Ig0KKwkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJJbmxpbmVTdHJlYW1PcGVyYXRpb25zIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJUaHJlZUtpbmRTZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQorCQkJCXZhbHVlICAgICAgCTIwMCkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCisJCQkJdmFsdWUgICAgICAJMjAxKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCisJCQkJdmFsdWUgICAgICAJMjAyKSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIktpbmRTZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQorCQkJCXZhbHVlICAgICAgCTIwMCkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCisJCQkJdmFsdWUgICAgICAJMjAxKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCisJCQkJdmFsdWUgICAgICAJMjAyKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQorCQkJCXZhbHVlICAgICAgCTIwMykpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJGcmllbmRLaW5kU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KKwkJCQl2YWx1ZSAgICAgIAkyMDApDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJjZyINCisJCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQorCQkJCXZhbHVlICAgICAgCTIwMSkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQorCQkJCXZhbHVlICAgICAgCTIwMikNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiRnJpZW5kIg0KKwkJCQl2YWx1ZSAgICAgIAkyMDQpKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJEZWNsYXJlQW5kRGVmaW5lIg0KKwkJCQl2YWx1ZSAgICAgIAkxOTkpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJjZyINCisJCQkJbmFtZSAgICAgICAJIkRlY2xhcmVPbmx5Ig0KKwkJCQl2YWx1ZSAgICAgIAkyMDUpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJjZyINCisJCQkJbmFtZSAgICAgICAJIkRvTm90RGVjbGFyZSINCisJCQkJdmFsdWUgICAgICAJMjA2KSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIlZpc2liaWxpdHlTZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQorCQkJCXZhbHVlICAgICAgCTQ1KQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQorCQkJCXZhbHVlICAgICAgCTQ0KQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KKwkJCQl2YWx1ZSAgICAgIAk0MykNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iDQorCQkJCXZhbHVlICAgICAgCTE0KSkpKSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiY2ciDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQorCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KKwkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJOb25lIg0KKwkJCQl2YWx1ZSAgICAgIAkwKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQorCQkJCXZhbHVlICAgICAgCTEpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJjZyINCisJCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KKwkJCQl2YWx1ZSAgICAgIAkyKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJBbGwiDQorCQkJCXZhbHVlICAgICAgCTMpKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCisJCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgJVElICVaJSAlVyUiKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KKwkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQorCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJBbGxvd0V4dGVuc2lvbmxlc3NGaWxlTmFtZSINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCINCisJCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkluY2x1ZGVGb3JtYXQiDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgDQorfC8vICRwYWNrYWdlDQorfCNpbmNsdWRlICIkZmlsZSINCit8DQorCQkJKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiSW5jbHVkZVByZWNvbXBpbGVkSGVhZGVyIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJJbmNsdWRlT3JkZXIiDQorCQkJdmFsdWUgICAgICAJIkFNSVIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlIg0KKwkJCXZhbHVlICAgICAgCSgiSW5saW5pbmdTdHlsZVNldCIgMjA3KSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZVNldCINCisJCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJjZyINCisJCQkJbmFtZSAgICAgICAJIkluQ2xhc3NEZWNsYXJhdGlvbiINCisJCQkJdmFsdWUgICAgICAJMjA4KQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJGb2xsb3dpbmdDbGFzc0RlY2xhcmF0aW9uIg0KKwkJCQl2YWx1ZSAgICAgIAkyMDcpKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiVHlwZXNEZWZpbmVkIg0KKwkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiSW5jbHVkZUNsb3N1cmUiDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJImNnIg0KKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyINCisJCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiTm9uZSINCisJCQkJdmFsdWUgICAgICAJMCkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIg0KKwkJCQl2YWx1ZSAgICAgIAkxKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCINCisJCQkJdmFsdWUgICAgICAJMikNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiQWxsIg0KKwkJCQl2YWx1ZSAgICAgIAkzKSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICVRJSAlWiUgJVclIikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCisJCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KKwkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiQWxsb3dFeHRlbnNpb25sZXNzRmlsZU5hbWUiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkluY2x1ZGVGb3JtYXQiDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgDQorfC8vICRwYWNrYWdlDQorfCNpbmNsdWRlICIkZmlsZSINCit8DQorCQkJKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiSW5jbHVkZVByZWNvbXBpbGVkSGVhZGVyIg0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkluY2x1ZGVPcmRlciINCisJCQl2YWx1ZSAgICAgIAkiQU1JUiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCisJCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGUiDQorCQkJdmFsdWUgICAgICAJKCJJbmxpbmluZ1N0eWxlU2V0IiAyMDcpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiSW5DbGFzc0RlY2xhcmF0aW9uIg0KKwkJCQl2YWx1ZSAgICAgIAkyMDgpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJjZyINCisJCQkJbmFtZSAgICAgICAJIkZvbGxvd2luZ0NsYXNzRGVjbGFyYXRpb24iDQorCQkJCXZhbHVlICAgICAgCTIwNykpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJUeXBlc0RlZmluZWQiDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJJbmNsdWRlQ2xvc3VyZSINCisJCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiY2ciDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiT3BlcmF0aW9uS2luZCINCisJCQl2YWx1ZSAgICAgIAkoIk9wZXJhdGlvbktpbmRTZXQiIDIwMCkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbktpbmRTZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQorCQkJCXZhbHVlICAgICAgCTIwMCkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCisJCQkJdmFsdWUgICAgICAJMjAxKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCisJCQkJdmFsdWUgICAgICAJMjAyKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQorCQkJCXZhbHVlICAgICAgCTIwMykNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiRnJpZW5kIg0KKwkJCQl2YWx1ZSAgICAgIAkyMDQpKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVBYnN0cmFjdEJvZHkiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIlNwZWNpYWxEZWNsUmV0dXJuVHlwZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNDb25zdCINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNFeHBsaWNpdCINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiSW5saW5lIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJFbnRyeUNvZGUiDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJFeGl0Q29kZSINCisJCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkNDUmVnaW9uIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyINCisJCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiTm9uZSINCisJCQkJdmFsdWUgICAgICAJMCkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIg0KKwkJCQl2YWx1ZSAgICAgIAkxKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCINCisJCQkJdmFsdWUgICAgICAJMikNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiQWxsIg0KKwkJCQl2YWx1ZSAgICAgIAkzKSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkJvZHlBbm5vdGF0aW9ucyINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVGcmllbmRCb2R5Ig0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZyaWVuZERlY2wiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiY2ciDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIg0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiT3JkZXJlZCINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQorCQkJdmFsdWUgICAgICAJInRoZV8kc3VwcGxpZXIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQorCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSINCisJCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiUHVibGljIg0KKwkJCQl2YWx1ZSAgICAgIAk0NSkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KKwkJCQl2YWx1ZSAgICAgIAk0NCkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCisJCQkJdmFsdWUgICAgICAJNDMpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJjZyINCisJCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIg0KKwkJCQl2YWx1ZSAgICAgIAkxNCkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5Ig0KKwkJCQl2YWx1ZSAgICAgIAkyMTApKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiDQorCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIg0KKwkJCQl2YWx1ZSAgICAgIAkwKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIg0KKwkJCQl2YWx1ZSAgICAgIAkxKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJDb25zdCINCisJCQkJdmFsdWUgICAgICAJMikpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KKwkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiR2V0TmFtZSINCisJCQl2YWx1ZSAgICAgIAkiZ2V0XyRyZWxhdGlvbnNoaXAiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KKwkJCXZhbHVlICAgICAgCSJzZXRfJHJlbGF0aW9uc2hpcCIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIg0KKwkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KKwkJCQl2YWx1ZSAgICAgIAkyMDApDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJjZyINCisJCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQorCQkJCXZhbHVlICAgICAgCTIwMSkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQorCQkJCXZhbHVlICAgICAgCTIwMikNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiU3RhdGljIg0KKwkJCQl2YWx1ZSAgICAgIAkyMDMpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJjZyINCisJCQkJbmFtZSAgICAgICAJIkZyaWVuZCINCisJCQkJdmFsdWUgICAgICAJMjA0KSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0Ig0KKwkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJGYWxzZSINCisJCQkJdmFsdWUgICAgICAJMCkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiVHJ1ZSINCisJCQkJdmFsdWUgICAgICAJMSkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiINCisJCQkJdmFsdWUgICAgICAJMikpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5Ig0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJIYXNSZWxUeXBlU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiQXJyYXkiDQorCQkJCXZhbHVlICAgICAgCTI0KQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSINCisJCQkJdmFsdWUgICAgICAJNDcpKSkpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJjZyINCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KKwkJCXZhbHVlICAgICAgCSJ0aGVfJHRhcmdldENsYXNzIikpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJjZyINCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19Jbmhlcml0Ig0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJJbnN0YW5jZUFyZ3VtZW50cyINCisJCQl2YWx1ZSAgICAgIAkiIikpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJjZyINCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCisJCQl2YWx1ZSAgICAgIAkidGhlXyR0YXJnZXRDbGFzcyIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCisJCQl2YWx1ZSAgICAgIAkiJHRhcmdldCIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5Ig0KKwkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQorCQkJCXZhbHVlICAgICAgCTQ1KQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQorCQkJCXZhbHVlICAgICAgCTQ0KQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KKwkJCQl2YWx1ZSAgICAgIAk0MykNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iDQorCQkJCXZhbHVlICAgICAgCTE0KQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiDQorCQkJCXZhbHVlICAgICAgCTIxMCkpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSINCisJCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiDQorCQkJCXZhbHVlICAgICAgCTApDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJjZyINCisJCQkJbmFtZSAgICAgICAJIk11dGFibGUiDQorCQkJCXZhbHVlICAgICAgCTEpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJjZyINCisJCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KKwkJCQl2YWx1ZSAgICAgIAkyKSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2V0Ig0KKwkJCXZhbHVlICAgICAgCSIkZGF0YS5nZXQoJGtleXMpIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiQ29udGFpbmVyU2V0Ig0KKwkJCXZhbHVlICAgICAgCSIkZGF0YS5zZXQoJGtleXMsJHZhbHVlKSIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZENvbnRhaW5lciINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0NvbnRhaW5lciINCisJCQl2YWx1ZSAgICAgIAkiJHN1cHBsaWVyICoiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzSW5pdGlhbFZhbHVlIg0KKwkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiDQorCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQorCQkJCXZhbHVlICAgICAgCTIwMCkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCisJCQkJdmFsdWUgICAgICAJMjAxKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCisJCQkJdmFsdWUgICAgICAJMjAyKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQorCQkJCXZhbHVlICAgICAgCTIwMykNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiRnJpZW5kIg0KKwkJCQl2YWx1ZSAgICAgIAkyMDQpKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIg0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQorCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0Ig0KKwkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJGYWxzZSINCisJCQkJdmFsdWUgICAgICAJMCkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiVHJ1ZSINCisJCQkJdmFsdWUgICAgICAJMSkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiINCisJCQkJdmFsdWUgICAgICAJMikpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiU2V0TmFtZSINCisJCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZSINCisJCQl2YWx1ZSAgICAgIAkoIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlU2V0IiAyKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2VTZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJGYWxzZSINCisJCQkJdmFsdWUgICAgICAJMCkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiVHJ1ZSINCisJCQkJdmFsdWUgICAgICAJMSkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19HZXRTZXRCeVJlZmVyZW5jZSINCisJCQkJdmFsdWUgICAgICAJMikpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVF1YWxpZmllZEdldE9wZXJhdGlvbiINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXROYW1lIg0KKwkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldElzQ29uc3QiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0UmVzdWx0SXNDb25zdCINCisJCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJJbmxpbmVRdWFsaWZpZWRHZXQiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVRdWFsaWZpZWRTZXRPcGVyYXRpb24iDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiUXVhbGlmaWVkU2V0TmFtZSINCisJCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRTZXRSZXR1cm5zVmFsdWUiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIklubGluZVF1YWxpZmllZFNldCINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NEYXRhTWVtYmVyIg0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyTmFtZSINCisJCQl2YWx1ZSAgICAgIAkiJHRhcmdldCIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyVmlzaWJpbGl0eSINCisJCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiUHVibGljIg0KKwkJCQl2YWx1ZSAgICAgIAk0NSkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KKwkJCQl2YWx1ZSAgICAgIAk0NCkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCisJCQkJdmFsdWUgICAgICAJNDMpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJjZyINCisJCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIg0KKwkJCQl2YWx1ZSAgICAgIAkxNCkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5Ig0KKwkJCQl2YWx1ZSAgICAgIAkyMTApKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJNdXRhYmlsaXR5Ig0KKwkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCINCisJCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJjZyINCisJCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCINCisJCQkJdmFsdWUgICAgICAJMCkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiTXV0YWJsZSINCisJCQkJdmFsdWUgICAgICAJMSkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiQ29uc3QiDQorCQkJCXZhbHVlICAgICAgCTIpKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJJc1ZvbGF0aWxlIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0U2V0S2luZHMiDQorCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzR2V0T3BlcmF0aW9uIg0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXROYW1lIg0KKwkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRJc0NvbnN0Ig0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRSZXN1bHRJc0NvbnN0Ig0KKwkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jQ2xhc3NHZXQiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzU2V0T3BlcmF0aW9uIg0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NTZXROYW1lIg0KKwkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NTZXRSZXR1cm5zVmFsdWUiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jQ2xhc3NTZXQiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0ZvcndhcmRSZWZlcmVuY2VPbmx5Ig0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkFzc29jVHlwZVNldCINCisJCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJjZyINCisJCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KKwkJCQl2YWx1ZSAgICAgIAkyNCkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiDQorCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiY2ciDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KKwkJCXZhbHVlICAgICAgCSIkYXR0cmlidXRlIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiDQorCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCINCisJCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJjZyINCisJCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCisJCQkJdmFsdWUgICAgICAJNDUpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJjZyINCisJCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCisJCQkJdmFsdWUgICAgICAJNDQpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJjZyINCisJCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQorCQkJCXZhbHVlICAgICAgCTQzKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCisJCQkJdmFsdWUgICAgICAJMTQpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJjZyINCisJCQkJbmFtZSAgICAgICAJIkF0QXR0cmlidXRlVmlzaWJpbGl0eSINCisJCQkJdmFsdWUgICAgICAJMjExKSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5Ig0KKwkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCINCisJCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJjZyINCisJCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCINCisJCQkJdmFsdWUgICAgICAJMCkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiTXV0YWJsZSINCisJCQkJdmFsdWUgICAgICAJMSkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiQ29uc3QiDQorCQkJCXZhbHVlICAgICAgCTIpKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIg0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIg0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQorCQkJdmFsdWUgICAgICAJImdldF8kYXR0cmlidXRlIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiU2V0TmFtZSINCisJCQl2YWx1ZSAgICAgIAkic2V0XyRhdHRyaWJ1dGUiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyINCisJCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCINCisJCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJjZyINCisJCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCisJCQkJdmFsdWUgICAgICAJMjAwKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KKwkJCQl2YWx1ZSAgICAgIAkyMDEpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJjZyINCisJCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KKwkJCQl2YWx1ZSAgICAgIAkyMDIpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJjZyINCisJCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCisJCQkJdmFsdWUgICAgICAJMjAzKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQorCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0Ig0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiDQorCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCINCisJCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJjZyINCisJCQkJbmFtZSAgICAgICAJIkZhbHNlIg0KKwkJCQl2YWx1ZSAgICAgIAkwKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJUcnVlIg0KKwkJCQl2YWx1ZSAgICAgIAkxKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIg0KKwkJCQl2YWx1ZSAgICAgIAkyKSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiQ0NSZWdpb24iDQorCQkJdmFsdWUgICAgICAJIiIpKSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiY2ciDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fVXNlcyINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkJvZHlSZWZlcmVuY2VPbmx5Ig0KKwkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJImNnIg0KKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KKwkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiRGlyZWN0b3J5SXNPblNlYXJjaExpc3QiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIlByZWNvbXBpbGVkSGVhZGVyIg0KKwkJCXZhbHVlICAgICAgCSIiKSkpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJImNnIg0KKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5Ig0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJJc05hbWVzcGFjZSINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJjZyINCisJCQluYW1lICAgICAgIAkiSW5kZW50Ig0KKwkJCXZhbHVlICAgICAgCTIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiY2ciDQorCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyINCisJCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiTm9uZSINCisJCQkJdmFsdWUgICAgICAJMCkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIg0KKwkJCQl2YWx1ZSAgICAgIAkxKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiY2ciDQorCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCINCisJCQkJdmFsdWUgICAgICAJMikNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJImNnIg0KKwkJCQluYW1lICAgICAgIAkiQWxsIg0KKwkJCQl2YWx1ZSAgICAgIAkzKSkpKSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiTVNWQyINCisJCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KKwkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIk1TVkMiDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCW5hbWUgICAgICAgCSJWZXJzaW9uIg0KKwkJCXZhbHVlICAgICAgCSI1LjAiKSkpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIk1TVkMiDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQorCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQluYW1lICAgICAgIAkiVHlwZSINCisJCQl2YWx1ZSAgICAgIAkoIk1TVkNDbGFzc1R5cGVTZXQiIDApKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIk1TVkNDbGFzc1R5cGVTZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQkJbmFtZSAgICAgICAJIk5vcm1hbCINCisJCQkJdmFsdWUgICAgICAJMCkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJCW5hbWUgICAgICAgCSJJbnRlcmZhY2VfUGFydCINCisJCQkJdmFsdWUgICAgICAJMSkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJCW5hbWUgICAgICAgCSJDb25uZWN0aW9uX1BhcnQiDQorCQkJCXZhbHVlICAgICAgCTIpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCQluYW1lICAgICAgIAkiQ2xhc3NfRmFjdG9yeSINCisJCQkJdmFsdWUgICAgICAJMykpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIkNPYmplY3RGdW5jdGlvbmFsaXR5Ig0KKwkJCXZhbHVlICAgICAgCSgiQ09iamVjdEZ1bmN0aW9uYWxpdHlTZXQiIDApKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIkNPYmplY3RGdW5jdGlvbmFsaXR5U2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJCW5hbWUgICAgICAgCSJOb25lIg0KKwkJCQl2YWx1ZSAgICAgIAkwKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQkJbmFtZSAgICAgICAJIkR5bmFtaWMiDQorCQkJCXZhbHVlICAgICAgCTEpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCQluYW1lICAgICAgIAkiRHluY3JlYXRlIg0KKwkJCQl2YWx1ZSAgICAgIAkyKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQkJbmFtZSAgICAgICAJIlNlcmlhbCINCisJCQkJdmFsdWUgICAgICAJMykpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT3ZlcnJpZGVHcm91cCINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFHcm91cCINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCW5hbWUgICAgICAgCSJBRlhfREFUQV9FbnRyaWVzIg0KKwkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpZWxkR3JvdXAiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQluYW1lICAgICAgIAkiQUZYX0ZJRUxEX0VudHJpZXMiDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTWVzc2FnZUdyb3VwIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTWVzc2FnZU1hcCINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCW5hbWUgICAgICAgCSJBRlhfTVNHX01BUF9FbnRyaWVzIg0KKwkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCW5hbWUgICAgICAgCSJNRVNTQUdFX01BUF9FbnRyaWVzIg0KKwkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCW5hbWUgICAgICAgCSJPTEVGYWN0b3J5Ig0KKwkJCXZhbHVlICAgICAgCSgiT0xFRmFjdG9yeVNldCIgMCkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQluYW1lICAgICAgIAkiT0xFRmFjdG9yeVNldCINCisJCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCQluYW1lICAgICAgIAkiTm9uZSINCisJCQkJdmFsdWUgICAgICAJMCkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJCW5hbWUgICAgICAgCSJCdWlsdF9pbiINCisJCQkJdmFsdWUgICAgICAJMSkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiDQorCQkJCXZhbHVlICAgICAgCTIpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCQluYW1lICAgICAgIAkiTGljZW5zZWQiDQorCQkJCXZhbHVlICAgICAgCTMpKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCW5hbWUgICAgICAgCSJPTEVOYW1lIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIk9MRUNsYXNzSUQiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVPTEVDdGxUeXBlIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIk9MRUN0bFR5cGUiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVPTEVUeXBlTGliIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJJRCINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliTWFqb3IiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQluYW1lICAgICAgIAkiT0xFVHlwZUxpYk1pbm9yIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJvcFBhZ2VJRHMiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQluYW1lICAgICAgIAkiT0xFUHJvcFBhZ2VJRHMiDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzcGF0Y2hNYXAiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX0VudHJpZXMiDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyINCisJCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydGllcyINCisJCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQluYW1lICAgICAgIAkiU3RvY2tGdW5jdGlvbnMiDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoRGVmVmFsdWUiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNwSWRFbnVtIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQX0lEX0VudHJpZXMiDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW50ZXJmYWNlTWFwIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIklOVEVSRkFDRV9NQVBfRW50cmllcyINCisJCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQluYW1lICAgICAgIAkiSW5pdEludGVyZmFjZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUV2ZW50TWFwIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9FbnRyaWVzIg0KKwkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfTUFQX0VudHJpZXMiDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIkVWRU5UX01BUF9FbnRyaWVzIg0KKwkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCW5hbWUgICAgICAgCSJTdG9ja0V2ZW50cyINCisJCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVFdmVudFNpbmtNYXAiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19FbnRyaWVzIg0KKwkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX01BUF9FbnRyaWVzIg0KKwkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCW5hbWUgICAgICAgCSJFVkVOVFNJTktfTUFQX0VudHJpZXMiDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIlByb3BOb3RpZnlTaW5rcyINCisJCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb25uZWN0aW9uTWFwIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIkNPTk5FQ1RJT05fTUFQX0VudHJpZXMiDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIkNvbm5lY3Rpb25Qb2ludElJRCINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCW5hbWUgICAgICAgCSJJbmhlcml0YW5jZVR5cGUiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQluYW1lICAgICAgIAkiRGVjbFNwZWMiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQluYW1lICAgICAgIAkiT0xFQ29tbWFuZHMiDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIk1GQ0RlY2xhcmVzIg0KKwkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCW5hbWUgICAgICAgCSJNRkNJbXBsZW1lbnRzIg0KKwkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCW5hbWUgICAgICAgCSJBVExfRGVjbGFyZXMiDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ09NTWFwIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIkNPTV9NQVBfRW50cmllcyINCisJCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb25uZWN0aW9uUG9pbnRNYXAiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQluYW1lICAgICAgIAkiQ09OTkVDVElPTl9QT0lOVF9NQVBfRW50cmllcyINCisJCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVNc2dNYXAiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQluYW1lICAgICAgIAkiTVNHX01BUF9FbnRyaWVzIg0KKwkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByb3BlcnR5TWFwIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIlBST1BFUlRZX01BUF9FbnRyaWVzIg0KKwkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCW5hbWUgICAgICAgCSJUeXBlIg0KKwkJCXZhbHVlICAgICAgCSgiTVNWQ09wZXJhdGlvblR5cGVTZXQiIDApKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIk1TVkNPcGVyYXRpb25UeXBlU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiDQorCQkJCXZhbHVlICAgICAgCTApDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCQluYW1lICAgICAgIAkiVmlydHVhbF9PdmVycmlkZSINCisJCQkJdmFsdWUgICAgICAJMSkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJCW5hbWUgICAgICAgCSJNZXNzYWdlX0hhbmRsZXIiDQorCQkJCXZhbHVlICAgICAgCTIpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCQluYW1lICAgICAgIAkiRGlzcGF0Y2hfSGFuZGxlciINCisJCQkJdmFsdWUgICAgICAJMykNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJCW5hbWUgICAgICAgCSJFdmVudF9GaXJpbmdfRnVuY3Rpb24iDQorCQkJCXZhbHVlICAgICAgCTQpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCQluYW1lICAgICAgIAkiRXZlbnRfU2lua19IYW5kbGVyIg0KKwkJCQl2YWx1ZSAgICAgIAk1KQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQkJbmFtZSAgICAgICAJIlN0ZF9PTEVfTWV0aG9kIg0KKwkJCQl2YWx1ZSAgICAgIAk2KQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQkJbmFtZSAgICAgICAJIkNvbW1hbmRfUGFyc2VyIg0KKwkJCQl2YWx1ZSAgICAgIAk3KQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X0dldF9GdW5jdGlvbiINCisJCQkJdmFsdWUgICAgICAJOCkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eV9TZXRfRnVuY3Rpb24iDQorCQkJCXZhbHVlICAgICAgCTkpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfTm90aWZ5X0Z1bmN0aW9uIg0KKwkJCQl2YWx1ZSAgICAgIAkxMCkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJCW5hbWUgICAgICAgCSJNYWNyb19HZW5lcmF0ZWRfRnVuY3Rpb24iDQorCQkJCXZhbHVlICAgICAgCTExKSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQluYW1lICAgICAgIAkiQUZYX01TR19NQVBfRW50cmllcyINCisJCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQluYW1lICAgICAgIAkiTUVTU0FHRV9NQVBfRW50cmllcyINCisJCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIg0KKwkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyINCisJCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX01BUF9FbnRyaWVzIg0KKwkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCW5hbWUgICAgICAgCSJFVkVOVF9NQVBfRW50cmllcyINCisJCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19NQVBfRW50cmllcyINCisJCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQluYW1lICAgICAgIAkiRVZFTlRTSU5LX01BUF9FbnRyaWVzIg0KKwkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCW5hbWUgICAgICAgCSJCb2R5SW1hZ2UiDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIk1TVkMiDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCW5hbWUgICAgICAgCSJUeXBlIg0KKwkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiDQorCQkJCXZhbHVlICAgICAgCTApDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCQluYW1lICAgICAgIAkiTWVtYmVyX1Byb3BlcnR5Ig0KKwkJCQl2YWx1ZSAgICAgIAkxKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiDQorCQkJCXZhbHVlICAgICAgCTIpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiDQorCQkJCXZhbHVlICAgICAgCTMpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCQluYW1lICAgICAgIAkiRmllbGRfRGF0YSINCisJCQkJdmFsdWUgICAgICAJNCkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSINCisJCQkJdmFsdWUgICAgICAJNSkpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyINCisJCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiINCisJCQl2YWx1ZSAgICAgIAkiIikpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCW5hbWUgICAgICAgCSJUeXBlIg0KKwkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiDQorCQkJCXZhbHVlICAgICAgCTApDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCQluYW1lICAgICAgIAkiTWVtYmVyX1Byb3BlcnR5Ig0KKwkJCQl2YWx1ZSAgICAgIAkxKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiDQorCQkJCXZhbHVlICAgICAgCTIpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiDQorCQkJCXZhbHVlICAgICAgCTMpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCQluYW1lICAgICAgIAkiRmllbGRfRGF0YSINCisJCQkJdmFsdWUgICAgICAJNCkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSINCisJCQkJdmFsdWUgICAgICAJNSkpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyINCisJCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiINCisJCQl2YWx1ZSAgICAgIAkiIikpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCW5hbWUgICAgICAgCSJUeXBlIg0KKwkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiDQorCQkJCXZhbHVlICAgICAgCTApDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCQluYW1lICAgICAgIAkiTWVtYmVyX1Byb3BlcnR5Ig0KKwkJCQl2YWx1ZSAgICAgIAkxKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiDQorCQkJCXZhbHVlICAgICAgCTIpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiDQorCQkJCXZhbHVlICAgICAgCTMpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCQluYW1lICAgICAgIAkiRmllbGRfRGF0YSINCisJCQkJdmFsdWUgICAgICAJNCkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSINCisJCQkJdmFsdWUgICAgICAJNSkpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyINCisJCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiDQorCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiINCisJCQl2YWx1ZSAgICAgIAkiIikpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5jbHVkZXNHcm91cCINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCW5hbWUgICAgICAgCSJBRlhfSU5DTFVERVNfRW50cmllcyINCisJCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnNlcnRMb2NhdGlvbiINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIk1TVkMiDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5jbHVkZXNHcm91cCINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJNU1ZDIg0KKwkJCW5hbWUgICAgICAgCSJBRlhfSU5DTFVERVNfRW50cmllcyINCisJCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiTVNWQyINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnNlcnRMb2NhdGlvbiINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJjZyINCisJCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KKwkJdmFsdWUgICAgICAJRkFMU0UpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIlJvc2UgTW9kZWwgSW50ZWdyYXRvciINCisJCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KKwkJdmFsdWUgICAgICAJRkFMU0UpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIlJvc2UgV2ViIFB1Ymxpc2hlciINCisJCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KKwkJdmFsdWUgICAgICAJRkFMU0UpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIkNPTSINCisJCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KKwkJdmFsdWUgICAgICAJIjc4MzYwNjM3OCIpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIkNPTSINCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDT00iDQorCQkJbmFtZSAgICAgICAJIlR5cGVLaW5kcyINCisJCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJDT00iDQorCQkJCW5hbWUgICAgICAgCSJlbnVtIg0KKwkJCQl2YWx1ZSAgICAgIAkxMDApDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJDT00iDQorCQkJCW5hbWUgICAgICAgCSJyZWNvcmQiDQorCQkJCXZhbHVlICAgICAgCTEwMSkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkNPTSINCisJCQkJbmFtZSAgICAgICAJIm1vZHVsZSINCisJCQkJdmFsdWUgICAgICAJMTAyKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQ09NIg0KKwkJCQluYW1lICAgICAgIAkiaW50ZXJmYWNlIg0KKwkJCQl2YWx1ZSAgICAgIAkxMDMpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJDT00iDQorCQkJCW5hbWUgICAgICAgCSJkaXNwaW50ZXJmYWNlIg0KKwkJCQl2YWx1ZSAgICAgIAkxMDQpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJDT00iDQorCQkJCW5hbWUgICAgICAgCSJjb2NsYXNzIg0KKwkJCQl2YWx1ZSAgICAgIAkxMDUpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJDT00iDQorCQkJCW5hbWUgICAgICAgCSJhbGlhcyINCisJCQkJdmFsdWUgICAgICAJMTA2KQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQ09NIg0KKwkJCQluYW1lICAgICAgIAkidW5pb24iDQorCQkJCXZhbHVlICAgICAgCTEwNykNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkNPTSINCisJCQkJbmFtZSAgICAgICAJIm1heCINCisJCQkJdmFsdWUgICAgICAJMTA4KQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQ09NIg0KKwkJCQluYW1lICAgICAgIAkiKG5vbmUpIg0KKwkJCQl2YWx1ZSAgICAgIAkxMDkpKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDT00iDQorCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQ09NIg0KKwkJCW5hbWUgICAgICAgCSJraW5kIg0KKwkJCXZhbHVlICAgICAgCSgiVHlwZUtpbmRzIiAxMDkpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNPTSINCisJCQluYW1lICAgICAgIAkidXVpZCINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDT00iDQorCQkJbmFtZSAgICAgICAJInZlcnNpb24iDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQ09NIg0KKwkJCW5hbWUgICAgICAgCSJoZWxwc3RyaW5nIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNPTSINCisJCQluYW1lICAgICAgIAkiaGVscGNvbnRleHQiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQ09NIg0KKwkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNPTSINCisJCQluYW1lICAgICAgIAkiZGxsbmFtZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDT00iDQorCQkJbmFtZSAgICAgICAJImFsaWFzIg0KKwkJCXZhbHVlICAgICAgCSIiKSkpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIkNPTSINCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQorCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQ09NIg0KKwkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNPTSINCisJCQluYW1lICAgICAgIAkiaWQiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQ09NIg0KKwkJCW5hbWUgICAgICAgCSJoZWxwc3RyaW5nIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNPTSINCisJCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyINCisJCQl2YWx1ZSAgICAgIAkiIikpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJDT00iDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNPTSINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDT00iDQorCQkJbmFtZSAgICAgICAJImlkIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNPTSINCisJCQluYW1lICAgICAgIAkiaGVscHN0cmluZyINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDT00iDQorCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiDQorCQkJdmFsdWUgICAgICAJIiIpKSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiQ09NIg0KKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNPTSINCisJCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDT00iDQorCQkJbmFtZSAgICAgICAJImZpbGVuYW1lIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNPTSINCisJCQluYW1lICAgICAgIAkibGlicmFyeSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDT00iDQorCQkJbmFtZSAgICAgICAJInV1aWQiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQ09NIg0KKwkJCW5hbWUgICAgICAgCSJ2ZXJzaW9uIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNPTSINCisJCQluYW1lICAgICAgIAkiaGVscHN0cmluZyINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDT00iDQorCQkJbmFtZSAgICAgICAJImhlbHBmaWxlIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNPTSINCisJCQluYW1lICAgICAgIAkiaGVscGNvbnRleHQiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQ09NIg0KKwkJCW5hbWUgICAgICAgCSJsY2lkIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNPTSINCisJCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyINCisJCQl2YWx1ZSAgICAgIAkiIikpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJDT00iDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iDQorCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQ09NIg0KKwkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIg0KKwkJCXZhbHVlICAgICAgCSIiKSkpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIkNPTSINCisJCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KKwkJdmFsdWUgICAgICAJRkFMU0UpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIlZlcnNpb24gQ29udHJvbCINCisJCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KKwkJdmFsdWUgICAgICAJRkFMU0UpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCisJCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KKwkJdmFsdWUgICAgICAJIjc4MzYwNjM3OCIpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQorCQkJbmFtZSAgICAgICAJIlVwZGF0ZUNvZGUiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQorCQkJbmFtZSAgICAgICAJIlVwZGF0ZU1vZGVsIg0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KKwkJCW5hbWUgICAgICAgCSJJbnN0YW5jaW5nU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCisJCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQorCQkJCXZhbHVlICAgICAgCTIyMSkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCisJCQkJbmFtZSAgICAgICAJIlB1YmxpY05vdENyZWF0YWJsZSINCisJCQkJdmFsdWUgICAgICAJMjEzKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KKwkJCQluYW1lICAgICAgIAkiU2luZ2xlVXNlIg0KKwkJCQl2YWx1ZSAgICAgIAkyMTQpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQorCQkJCW5hbWUgICAgICAgCSJHbG9iYWxTaW5nbGVVc2UiDQorCQkJCXZhbHVlICAgICAgCTIxNSkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCisJCQkJbmFtZSAgICAgICAJIk11bHRpVXNlIg0KKwkJCQl2YWx1ZSAgICAgIAkyMTkpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQorCQkJCW5hbWUgICAgICAgCSJHbG9iYWxNdWx0aVVzZSINCisJCQkJdmFsdWUgICAgICAJMjIwKSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KKwkJCW5hbWUgICAgICAgCSJCYXNlU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCisJCQkJbmFtZSAgICAgICAJIihub25lKSINCisJCQkJdmFsdWUgICAgICAJMjIyKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KKwkJCQluYW1lICAgICAgIAkiMCINCisJCQkJdmFsdWUgICAgICAJMjIzKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KKwkJCQluYW1lICAgICAgIAkiMSINCisJCQkJdmFsdWUgICAgICAJMjI0KSkpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KKwkJCW5hbWUgICAgICAgCSJPcHRpb25CYXNlIg0KKwkJCXZhbHVlICAgICAgCSgiQmFzZVNldCIgMjIyKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQorCQkJbmFtZSAgICAgICAJIk9wdGlvbkV4cGxpY2l0Ig0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KKwkJCW5hbWUgICAgICAgCSJPcHRpb25Db21wYXJlIg0KKwkJCXZhbHVlICAgICAgCSgiQ29tcGFyZVNldCIgMjAyKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQorCQkJbmFtZSAgICAgICAJIkluc3RhbmNpbmciDQorCQkJdmFsdWUgICAgICAJKCJJbnN0YW5jaW5nU2V0IiAyMTkpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCisJCQluYW1lICAgICAgIAkiQ29tcGFyZVNldCINCisJCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQorCQkJCW5hbWUgICAgICAgCSIobm9uZSkiDQorCQkJCXZhbHVlICAgICAgCTIwMikNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCisJCQkJbmFtZSAgICAgICAJIkJpbmFyeSINCisJCQkJdmFsdWUgICAgICAJMjAzKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KKwkJCQluYW1lICAgICAgIAkiVGV4dCINCisJCQkJdmFsdWUgICAgICAJMjA0KSkpKSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQorCQkJbmFtZSAgICAgICAJIkxpYnJhcnlOYW1lIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCisJCQluYW1lICAgICAgIAkiQWxpYXNOYW1lIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCisJCQluYW1lICAgICAgIAkiSXNTdGF0aWMiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KKwkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVJRCINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQorCQkJbmFtZSAgICAgICAJIlJlcGxhY2VFeGlzdGluZ0JvZHkiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KKwkJCW5hbWUgICAgICAgCSJEZWZhdWx0Qm9keSINCisJCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQorCQkJbmFtZSAgICAgICAJIk5ldyINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQorCQkJbmFtZSAgICAgICAJIldpdGhFdmVudHMiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KKwkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVJRCINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQorCQkJbmFtZSAgICAgICAJIlByb3BlcnR5TmFtZSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQorCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdCINCisJCQl2YWx1ZSAgICAgIAkiIikpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQorCQkJbmFtZSAgICAgICAJIlVwZGF0ZUNvZGUiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQorCQkJbmFtZSAgICAgICAJIk5ldyINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQorCQkJbmFtZSAgICAgICAJIldpdGhFdmVudHMiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KKwkJCW5hbWUgICAgICAgCSJGdWxsTmFtZSINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQorCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUlEIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCisJCQluYW1lICAgICAgIAkiUHJvcGVydHlOYW1lIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCisJCQluYW1lICAgICAgIAkiU3Vic2NyaXB0Ig0KKwkJCXZhbHVlICAgICAgCSIiKSkpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19Jbmhlcml0Ig0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCisJCQluYW1lICAgICAgIAkiSW1wbGVtZW50c0RlbGVnYXRpb24iDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQorCQkJbmFtZSAgICAgICAJIkZ1bGxOYW1lIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQorCQkJbmFtZSAgICAgICAJIkJ5VmFsIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCisJCQluYW1lICAgICAgIAkiQnlSZWYiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KKwkJCW5hbWUgICAgICAgCSJPcHRpb25hbCINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQorCQkJbmFtZSAgICAgICAJIlBhcmFtQXJyYXkiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCisJCQluYW1lICAgICAgIAkiUHJvamVjdEZpbGUiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KKwkJCW5hbWUgICAgICAgCSJVcGRhdGVDb2RlIg0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KKwkJCW5hbWUgICAgICAgCSJVcGRhdGVNb2RlbCINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCisJCQluYW1lICAgICAgIAkiSW1wb3J0UmVmZXJlbmNlcyINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCisJCQluYW1lICAgICAgIAkiUXVpY2tJbXBvcnQiDQorCQkJdmFsdWUgICAgICAJVFJVRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQorCQkJbmFtZSAgICAgICAJIkltcG9ydEJpbmFyeSINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQorCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCisJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJWaXN1YWxTdHVkaW8iDQorCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCisJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJXZWIgTW9kZWxlciINCisJCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KKwkJdmFsdWUgICAgICAJRkFMU0UpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQorCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCisJCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQorCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiWE1MX0RURCINCisJCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KKwkJCXZhbHVlICAgICAgCVRSVUUpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiWE1MX0RURCINCisJCQluYW1lICAgICAgIAkiRWRpdG9yIg0KKwkJCXZhbHVlICAgICAgCSgiRWRpdG9yVHlwZSIgMTAwKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KKwkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQorCQkJbmFtZSAgICAgICAJIkVkaXRvclR5cGUiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiWE1MX0RURCINCisJCQkJbmFtZSAgICAgICAJIkJ1aWx0SW4iDQorCQkJCXZhbHVlICAgICAgCTEwMCkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQorCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiDQorCQkJCXZhbHVlICAgICAgCTEwMSkpKSkpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQorCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiWE1MX0RURCINCisJCQluYW1lICAgICAgIAkiRW50aXR5X1N5c3RlbUlEIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQorCQkJbmFtZSAgICAgICAJIkVudGl0eV9QdWJsaWNJRCINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KKwkJCW5hbWUgICAgICAgCSJOb3RhdGlvblZhbHVlIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQorCQkJbmFtZSAgICAgICAJIkludGVybmFsVmFsdWUiDQorCQkJdmFsdWUgICAgICAJIiIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiWE1MX0RURCINCisJCQluYW1lICAgICAgIAkiUGFyYW1ldGVyRW50aXR5Ig0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQorCQkJbmFtZSAgICAgICAJIkV4dGVybmFsRW50aXR5Ig0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQorCQkJbmFtZSAgICAgICAJIk5vdGF0aW9uX1N5c3RlbUlEIg0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQorCQkJbmFtZSAgICAgICAJIk5vdGF0aW9uX1B1YmxpY0lEIg0KKwkJCXZhbHVlICAgICAgCSIiKSkpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQorCQkJbmFtZSAgICAgICAJIkRlZmF1bHREZWNsVHlwZSINCisJCQl2YWx1ZSAgICAgIAkiIikpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQorCQkJbmFtZSAgICAgICAJIkFzc2lnbiBBbGwiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiWE1MX0RURCINCisJCQluYW1lICAgICAgIAkiQ29tcG9uZW50UGF0aCINCisJCQl2YWx1ZSAgICAgIAkiIikpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KKwkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQorCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiQ2xlYXJDYXNlIg0KKwkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQorCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiUmVxdWlzaXRlUHJvIg0KKwkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQorCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiU29EQSINCisJCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KKwkJdmFsdWUgICAgICAJRkFMU0UpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIlRvcExpbmsiDQorCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCisJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQorCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSINCisJCQl2YWx1ZSAgICAgIAlUUlVFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQluYW1lICAgICAgIAkiUmV2RW5nUm9vdERpcmVjdG9yeSINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIlJvb3RQYWNrYWdlIg0KKwkJCXZhbHVlICAgICAgCSJDKysgUmV2ZXJzZSBFbmdpbmVlcmVkIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIlJldkVuZ0RpcmVjdG9yaWVzQXNQYWNrYWdlcyINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iDQorCQkJdmFsdWUgICAgICAJIi5oIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uRmlsZUV4dGVuc2lvbiINCisJCQl2YWx1ZSAgICAgIAkiLmNwcCIpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJCW5hbWUgICAgICAgCSJOZXdIZWFkZXJGaWxlRGlyZWN0b3J5Ig0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQluYW1lICAgICAgIAkiTmV3SW1wbGVtZW50YXRpb25GaWxlRGlyZWN0b3J5Ig0KKwkJCXZhbHVlICAgICAgCSIiKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQluYW1lICAgICAgIAkiRmlsZUNhcGl0YWxpemF0aW9uIg0KKwkJCXZhbHVlICAgICAgCSgiRmlsZUNhcGl0YWxpemF0aW9uU2V0IiAwKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzIg0KKwkJCXZhbHVlICAgICAgCSgiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXNTZXQiIDApKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQluYW1lICAgICAgIAkiU3RyaXBDbGFzc1ByZWZpeCINCisJCQl2YWx1ZSAgICAgIAkiIikNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIlVzZVRhYnMiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJCW5hbWUgICAgICAgCSJUYWJXaWR0aCINCisJCQl2YWx1ZSAgICAgIAk4KQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQluYW1lICAgICAgIAkiSW5kZW50V2lkdGgiDQorCQkJdmFsdWUgICAgICAJNCkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIkFjY2Vzc0luZGVudGF0aW9uIg0KKwkJCXZhbHVlICAgICAgCS0yKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQluYW1lICAgICAgIAkiTW9kZWxJZENvbW1lbnRSdWxlcyINCisJCQl2YWx1ZSAgICAgIAkoIk1vZGVsSWRDb21tZW50UnVsZXNTZXQiIDEpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQluYW1lICAgICAgIAkiUGFnZVdpZHRoIg0KKwkJCXZhbHVlICAgICAgCTgwKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQluYW1lICAgICAgIAkiQ2xhc3NNZW1iZXJPcmRlciINCisJCQl2YWx1ZSAgICAgIAkoIk1lbWJlck9yZGVyU2V0IiAxKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIk9uZVBhcmFtZXRlclBlckxpbmUiDQorCQkJdmFsdWUgICAgICAJRkFMU0UpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJCW5hbWUgICAgICAgCSJOYW1lc3BhY2VCcmFjZVN0eWxlIg0KKwkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJCW5hbWUgICAgICAgCSJDbGFzc0JyYWNlU3R5bGUiDQorCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uQnJhY2VTdHlsZSINCisJCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Ig0KKwkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIkluaXRpYWxIZWFkZXJJbmNsdWRlcyINCisJCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJCW5hbWUgICAgICAgCSJJbml0aWFsQm9keUluY2x1ZGVzIg0KKwkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQkJbmFtZSAgICAgICAJIk5vbmUiDQorCQkJCXZhbHVlICAgICAgCTApDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJCW5hbWUgICAgICAgCSJOYW1lc3BhY2VzIg0KKwkJCQl2YWx1ZSAgICAgIAkxKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJCQluYW1lICAgICAgIAkiUGFja2FnZXMiDQorCQkJCXZhbHVlICAgICAgCTIpKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIkZpbGVDYXBpdGFsaXphdGlvblNldCINCisJCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJCW5hbWUgICAgICAgCSJTYW1lIGFzIG1vZGVsIg0KKwkJCQl2YWx1ZSAgICAgIAkwKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJCQluYW1lICAgICAgIAkiTG93ZXIgY2FzZSINCisJCQkJdmFsdWUgICAgICAJMSkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQkJbmFtZSAgICAgICAJIlVwcGVyIGNhc2UiDQorCQkJCXZhbHVlICAgICAgCTIpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJCW5hbWUgICAgICAgCSJMb3dlciBjYXNlIHdpdGggdW5kZXJzY29yZXMiDQorCQkJCXZhbHVlICAgICAgCTMpKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIkJyYWNlU3R5bGVTZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJCQluYW1lICAgICAgIAkiQjEiDQorCQkJCXZhbHVlICAgICAgCTEpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJCW5hbWUgICAgICAgCSJCMiINCisJCQkJdmFsdWUgICAgICAJMikNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQkJbmFtZSAgICAgICAJIkIzIg0KKwkJCQl2YWx1ZSAgICAgIAkzKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJCQluYW1lICAgICAgIAkiQjQiDQorCQkJCXZhbHVlICAgICAgCTQpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJCW5hbWUgICAgICAgCSJCNSINCisJCQkJdmFsdWUgICAgICAJNSkpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQluYW1lICAgICAgIAkiTWVtYmVyT3JkZXJTZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJCQluYW1lICAgICAgIAkiUHVibGljIEZpcnN0Ig0KKwkJCQl2YWx1ZSAgICAgIAkxKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSBGaXJzdCINCisJCQkJdmFsdWUgICAgICAJMikNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQkJbmFtZSAgICAgICAJIk9yZGVyIGJ5IGtpbmQiDQorCQkJCXZhbHVlICAgICAgCTMpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWQiDQorCQkJCXZhbHVlICAgICAgCTQpKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIk1vZGVsSWRDb21tZW50UnVsZXNTZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJCQluYW1lICAgICAgIAkiQ29kZSBnZW5lcmF0aW9uIG9ubHkiDQorCQkJCXZhbHVlICAgICAgCTEpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJCW5hbWUgICAgICAgCSJDb2RlIGdlbmVyYXRpb24gYW5kIHJldmVyc2UgZW5naW5lZXJpbmciDQorCQkJCXZhbHVlICAgICAgCTIpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJCW5hbWUgICAgICAgCSJOZXZlciBnZW5lcmF0ZSBtb2RlbCBJRHMiDQorCQkJCXZhbHVlICAgICAgCTMpKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIkNyZWF0ZUJhY2t1cEZpbGVzIg0KKwkJCXZhbHVlICAgICAgCUZBTFNFKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQluYW1lICAgICAgIAkiQ29tbWVudFJ1bGVzIg0KKwkJCXZhbHVlICAgICAgCSgiQ29tbWVudFJ1bGVzU2V0IiAxKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJbmFtZSAgICAgICAJIkNvbW1lbnRSdWxlc1NldCINCisJCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJCW5hbWUgICAgICAgCSJBbHdheXMgc3luY2hyb25pemUiDQorCQkJCXZhbHVlICAgICAgCTEpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQorCQkJCW5hbWUgICAgICAgCSJDb2RlIGdlbmVyYXRpb24gb25seSINCisJCQkJdmFsdWUgICAgICAJMikNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQkJbmFtZSAgICAgICAJIlJldmVyc2UgZW5naW5lZXJpbmcgb25seSINCisJCQkJdmFsdWUgICAgICAJMykNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCisJCQkJbmFtZSAgICAgICAJIk5ldmVyIHN5bmNocm9uaXplIg0KKwkJCQl2YWx1ZSAgICAgIAk0KSkpKSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiQWRhODMiDQorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iDQorCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJbmFtZSAgICAgICAJIk1vZGUiDQorCQkJdmFsdWUgICAgICAJKCJQYXJhbWV0ZXJNb2RlU2V0IiAyMzIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJNb2RlU2V0Ig0KKwkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCQluYW1lICAgICAgIAkiRGVmYXVsdCINCisJCQkJdmFsdWUgICAgICAJMjMyKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJCW5hbWUgICAgICAgCSJJbiINCisJCQkJdmFsdWUgICAgICAJMjA0KQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQWRhODMiDQorCQkJCW5hbWUgICAgICAgCSJPdXQiDQorCQkJCXZhbHVlICAgICAgCTIwNSkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KKwkJCQluYW1lICAgICAgIAkiSW5PdXQiDQorCQkJCXZhbHVlICAgICAgCTIwMykpKSkpDQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIg0KKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCW5hbWUgICAgICAgCSJNb2RlIg0KKwkJCXZhbHVlICAgICAgCSgiUGFyYW1ldGVyTW9kZVNldCIgMjMyKSkNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQluYW1lICAgICAgIAkiUGFyYW1ldGVyTW9kZVNldCINCisJCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQkJbmFtZSAgICAgICAJIkRlZmF1bHQiDQorCQkJCXZhbHVlICAgICAgCTIzMikNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCQluYW1lICAgICAgIAkiSW4iDQorCQkJCXZhbHVlICAgICAgCTIwNCkNCisJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KKwkJCQluYW1lICAgICAgIAkiT3V0Ig0KKwkJCQl2YWx1ZSAgICAgIAkyMDUpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQkJbmFtZSAgICAgICAJIkluT3V0Ig0KKwkJCQl2YWx1ZSAgICAgIAkyMDMpDQorCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCisJCQkJbmFtZSAgICAgICAJIkFjY2VzcyINCisJCQkJdmFsdWUgICAgICAJMjIwKSkpKSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiRGVwbG95Ig0KKwkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQorCQl2YWx1ZSAgICAgIAlGQUxTRSkNCisJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiDQorCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KKwkJCW5hbWUgICAgICAgCSJCb2R5UmVmZXJlbmNlT25seSINCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCisJCXRvb2wgICAgICAgCSJDT1JCQSINCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSINCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCXRvb2wgICAgICAgCSJDT1JCQSINCisJCQluYW1lICAgICAgIAkiRGlyZWN0aW9uIg0KKwkJCXZhbHVlICAgICAgCSgiUGFyYW1EaXJlY3Rpb25UeXBlU2V0IiAxMDIpKQ0KKwkJICAgIChvYmplY3QgQXR0cmlidXRlDQorCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KKwkJCW5hbWUgICAgICAgCSJQYXJhbURpcmVjdGlvblR5cGVTZXQiDQorCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQ09SQkEiDQorCQkJCW5hbWUgICAgICAgCSJpbiINCisJCQkJdmFsdWUgICAgICAJMTAyKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQ09SQkEiDQorCQkJCW5hbWUgICAgICAgCSJpbm91dCINCisJCQkJdmFsdWUgICAgICAJMTAzKQ0KKwkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KKwkJCQl0b29sICAgICAgIAkiQ09SQkEiDQorCQkJCW5hbWUgICAgICAgCSJvdXQiDQorCQkJCXZhbHVlICAgICAgCTEwNCkpKSkpKQ0KKwlxdWlkICAgICAgIAkiM0EwQjI0NzQwMjdGIikpDQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zY2hlbWEvYWRhcHRlckZhY3RvcnkuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc2NoZW1hL2FkYXB0ZXJGYWN0b3J5LmV4c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAxMDBkYwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc2NoZW1hL2FkYXB0ZXJGYWN0b3J5LmV4c2QKQEAgLTAsMCArMSwxNDQgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQorPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCis8c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24iPg0KKzxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uIiBpZD0iYWRhcHRlckZhY3RvcnkiIG5hbWU9IkFkYXB0ZXIgRmFjdG9yeSBFeHRlbnNpb24iLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgVGhpcyBpcyB1c2VkIHRvIHJlZ2lzdGVyIGFuIGFkYXB0ZXIgZmFjdG9yeSB3aXRoIHRoZSBkeW5hbWljIGFkYXB0ZXIgZmFjdG9yeS4NCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQorICAgICAgPGNvbXBsZXhUeXBlPg0KKyAgICAgICAgIDxzZXF1ZW5jZT4NCisgICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFkYXB0ZXJGYWN0b3J5IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQorICAgICAgICAgPC9zZXF1ZW5jZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICA8L2NvbXBsZXhUeXBlPg0KKyAgIDwvZWxlbWVudD4NCisNCisgICA8ZWxlbWVudCBuYW1lPSJhZGFwdGVyRmFjdG9yeSI+DQorICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgRGVmaW5lcyB0aGUgQWRhcHRlciBGYWN0b3J5IGJlaW5nIGFkZGVkLiBBbGwgYWRkZWQgQWRhcHRlciBGYWN0b3JpZXMgYXJlIHF1ZXJpYWJsZSB3aGVuZXZlciB0aGVpciBGdW5jdGlvbiBHcm91cCBhbmQgb3B0aW9uYWwgVmlld2VyIElkIGFyZSBzcGVjaWZpZWQuDQorICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICA8Y29tcGxleFR5cGU+DQorICAgICAgICAgPHNlcXVlbmNlPg0KKyAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idmlldyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KKyAgICAgICAgIDwvc2VxdWVuY2U+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYWNrYWdlVVJJIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIFRoZSBwYWNrYWdlIFVSSSB0aGF0IHlvdSBhcmUgZXh0ZW5kaW5nIChmb3IgZXhhbXBsZSAmcXVvdDtlamIueG1pJnF1b3Q7KQ0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc05hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcyB3aGljaCBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Lg0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICBUaGUgVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIEFkYXB0ZXIgRmFjdG9yeSBleHRlbnNpb24uICBUaGlzIHdpbGwgYXNzb2NpYXRlIGl0IHdpdGggb25lIG9yIG1vcmUgZnVuY3Rpb24gZ3JvdXBzIGJhc2VkIG9uIHRoZSBmdW5jdGlvbiBncm91cCBwYXR0ZXJucy4gIEZ1bmN0aW9uIEdyb3VwcyBhbGxvdyBDb250ZW50IGFuZCBBY3Rpb25zIHRvIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQgYmFzZWQgb24gcHJvamVjdC1zcGVjaWZpYyBpbmZvcm1hdGlvbi4gR2VuZXJhbGx5LCB0aGV5IGFyZSB1c2VkIGJ5IHZlbmRvcnMgd2hvIHdpc2ggdG8gYWRkIGZ1bmN0aW9uYWxpdHkgc3BlY2lmaWMgdG8gdGhlaXIgcHJvZHVjdHMsIGUuZy4gSjJFRSBBcHBsaWNhdGlvbiBTZXJ2ZXJzLg0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmdW5jdGlvbkdyb3VwSUQiIHR5cGU9InN0cmluZyI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICA8L2NvbXBsZXhUeXBlPg0KKyAgIDwvZWxlbWVudD4NCisNCisgICA8ZWxlbWVudCBuYW1lPSJ2aWV3Ij4NCisgICAgICA8Y29tcGxleFR5cGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCB2aWV3ZXIgSWQgd2hpY2ggd2lsbCBsaW1pdCB0aGUgaW52b2NhdGlvbiBvZiB0aGUgZGVmaW5lZCBBZGFwdGVyIEZhY3RvcnkgdG8gdGhlIGdpdmVuIHZpZXdlciBpZC4NCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgIDwvY29tcGxleFR5cGU+DQorICAgPC9lbGVtZW50Pg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4mbHQ7L2ImZ3Q7DQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCisgICA8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQorICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgIA0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorICAgPGFubm90YXRpb24+DQorICAgICAgPGFwcEluZm8+DQorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQorICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgIA0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorICAgPGFubm90YXRpb24+DQorICAgICAgPGFwcEluZm8+DQorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KKyAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICANCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQorICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQorQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCithdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQordGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2ENCitocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zY2hlbWEvZWRpdE1vZGVsLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NjaGVtYS9lZGl0TW9kZWwuZXhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDc0M2IyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zY2hlbWEvZWRpdE1vZGVsLmV4c2QKQEAgLTAsMCArMSwxOTggQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQorPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCis8c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24iPg0KKzxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uIiBpZD0iZWRpdE1vZGVsIiBuYW1lPSJFTUYgUmVzb3VyY2UgRWRpdCBNb2RlbCIvPg0KKyAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICBFZGl0IG1vZGVscyBwcm92aWRlIGEgZnJhbWV3b3JrIGZvciBtYW5hZ2luZyBhIHNldCBvZiBFTUYgcmVzb3VyY2VzIHdpdGhpbiBhIHVuaXQgb2Ygd29yay4gIEZvciBleGFtcGxlLCBhIHdvcmtzcGFjZSBvcGVyYXRpb24gbWF5IGFmZmVjdCBhIGNoYW5nZSB0byBtdWx0aXBsZSBFTUYgcmVzb3VyY2VzLiBFZGl0IG1vZGVscyBwcm92aWRlIGJhc2ljIHNlcnZpY2VzIHN1Y2ggYXMgbG9hZHMsIHNhdmVzICh3aGVuIG5lY2Vzc2FyeSksIGFuZCB2YWxpZGF0ZSBlZGl0IGZvciB0aGUgbWFuYWdlZCByZXNvdXJjZXMuICBFZGl0IG1vZGVscyBhcmUgcmVmZXJlbmNlIGNvdW50ZWQsIHRoZXJlZm9yZSBhIHNpbmdsZSBpbnN0YW5jZSBvZiBhbiBlZGl0IG1vZGVsIGNhbiBiZSBzaGFyZWQgYnkgbW9yZSB0aGFuIG9uZSBvcGVyYXRpb24gb3IgZWRpdG9yLiAgQnkgZGVjbGFyaW5nIGFuIGVkaXQgbW9kZWwsIGEgcGx1Z2luIHByb3ZpZGVyIGVuYWJsZXMgb3RoZXIgY29tcG9uZW50cyB0byBjb250cmlidXRlIHJlc291cmNlcyB0byBiZSBtYW5hZ2VkIGJ5IHRoYXQgZWRpdCBtb2RlbC4NCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQorICAgICAgPGNvbXBsZXhUeXBlPg0KKyAgICAgICAgIDxzZXF1ZW5jZT4NCisgICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVkaXRNb2RlbCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KKyAgICAgICAgIDwvc2VxdWVuY2U+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgPC9jb21wbGV4VHlwZT4NCisgICA8L2VsZW1lbnQ+DQorDQorICAgPGVsZW1lbnQgbmFtZT0iZWRpdE1vZGVsIj4NCisgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICBUaGUgZGVjbGFyYXRpb24gZm9yIGFuIGVkaXQgbW9kZWwgdG8gYmUgdXNlZCBpbiB0aGUgd29ya3NwYWNlLg0KKyAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgPGNvbXBsZXhUeXBlPg0KKyAgICAgICAgIDxzZXF1ZW5jZT4NCisgICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVkaXRNb2RlbFJlc291cmNlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQorICAgICAgICAgPC9zZXF1ZW5jZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImVkaXRNb2RlbElEIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBlZGl0IG1vZGVsLg0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWN0b3J5Q2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgQW4gb3B0aW9uYWwgZmFjdG9yeSBjbGFzcyB0aGF0IGlzIHVzZWQgZm9yIHRoaXMgZWRpdCBtb2RlbC4gIFRoZSBjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUgaW50ZXJmYWNlICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEZhY3RvcnkmbHQ7L2NvZGUmZ3Q7LiBJZiBub25lIGlzIHNwZWNpZmllZCwgdGhlbiBhIGdlbmVyaWMgJmx0O2NvZGUmZ3Q7RWRpdE1vZGVsJmx0Oy9jb2RlJmd0OyBpcyBjcmVhdGVkLg0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsb2FkVW5rbm93blJlc291cmNlc0FzUmVhZE9ubHkiIHR5cGU9ImJvb2xlYW4iPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXJlbnRNb2RlbElEIiB0eXBlPSJzdHJpbmciPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgPC9jb21wbGV4VHlwZT4NCisgICA8L2VsZW1lbnQ+DQorDQorICAgPGVsZW1lbnQgbmFtZT0iZWRpdE1vZGVsUmVzb3VyY2UiPg0KKyAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIFRoaXMgaXMgYW4gaW5kaXZpZHVhbCBjb250cmlidXRpb24gb2YgYSByZXNvdXJjZSB0byB0aGUgZWRpdCBtb2RlbC4gIElmIG1vcmUgdGhhbiBvbmUgaW5zdGFuY2Ugb2YgdGhlIHNhbWUgVVJJIGlzIHJlZ2lzdGVyZWQgYWdhaW5zdCBhbiBlZGl0IG1vZGVsIGlkLCB0aGUgcmVzb3VyY2UgaXMgc3RpbGwgb25seSBsb2FkZWQgb25jZS4NCisgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgIDxjb21wbGV4VHlwZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IlVSSSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICBUaGUgVVJJIG9mIHRoZSByZXNvdXJjZSByZWxhdGl2ZSB0byB0aGUgcm9vdCBjb250YWluZXIgZnJvbSB3aGljaCBFTUYgcmVzb3VyY2VzIGFyZSBsb2FkZWQuDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImF1dG9sb2FkIiB0eXBlPSJib29sZWFuIiB1c2U9ImRlZmF1bHQiIHZhbHVlPSJmYWxzZSI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgSW5kaWNhdG9yIHdoaWNoIGRldGVybWluZXMgd2hldGhlciB0aGlzIHJlc291cmNlIHNob3VsZCBiZSBhdXRvbG9hZGVkIHdoZW4gdGhlIGVkaXQgbW9kZWwgaXMgY3JlYXRlZCwgb3Igd2hlbiBhbiBJRmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgcmVzb3VyY2UgaXMgYWRkZWQuDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICA8L2NvbXBsZXhUeXBlPg0KKyAgIDwvZWxlbWVudD4NCisgICANCisgICA8ZWxlbWVudCBuYW1lPSJyZXNvdXJjZUV4dGVuc2lvbiI+DQorICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgVGhpcyBhbGxvd3MgcmVnaXN0cmF0aW9uIG9mIGZpbGVzIGZvciBhdXRvbG9hZGluZyBhY2NvcmRpbmcgdG8gZmlsZSBleHRlbnNpb24uDQorICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICA8Y29tcGxleFR5cGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIFRoZSBmaWxlIGV4dGVuc2lvbiBpdHNlbGYgKCZxdW90O215eG1pJnF1b3Q7KQ0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgPC9jb21wbGV4VHlwZT4NCisgICA8L2VsZW1lbnQ+DQorDQorICAgPGFubm90YXRpb24+DQorICAgICAgPGFwcEluZm8+DQorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KKyAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAxLjANCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgJmx0O3ByZSZndDsNCisgICAmbHQ7ZXh0ZW5zaW9uDQorICAgICAgICAgaWQ9JnF1b3Q7ZWRpdE1vZGVsLmFjbWUucGFyZW50JnF1b3Q7DQorICAgICAgICAgbmFtZT0mcXVvdDtBY21lIFBhcmVudCBFZGl0IE1vZGVsJnF1b3Q7DQorICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZWRpdE1vZGVsJnF1b3Q7Jmd0Ow0KKyAgICAgICZsdDtlZGl0TW9kZWwNCisgICAgICAgICAgICBlZGl0TW9kZWxJRD0mcXVvdDtjb20uYWNtZS5hY21lcHJvLnBhcmVudC5lZGl0TW9kZWwmcXVvdDsNCisgICAgICAgICAgICBmYWN0b3J5Q2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRmFjdG9yeSZxdW90OyZndDsNCisgICAgICAgICZsdDtlZGl0TW9kZWxSZXNvdXJjZSBVUkk9JnF1b3Q7RElSL3Jlc291cmNlMC54bWwmcXVvdDsvJmd0Ow0KKyAgICAgICAgJmx0O2VkaXRNb2RlbFJlc291cmNlIFVSST0mcXVvdDtESVIvcmVzb3VyY2UxLnhtbCZxdW90Oy8mZ3Q7DQorICAgICAgJmx0Oy9lZGl0TW9kZWwmZ3Q7DQorICAgJmx0Oy9leHRlbnNpb24mZ3Q7DQorDQorICAgJmx0O2V4dGVuc2lvbg0KKyAgICAgICAgIGlkPSZxdW90O2VkaXRNb2RlbC5hY21lLmNoaWxkJnF1b3Q7DQorICAgICAgICAgbmFtZT0mcXVvdDtBY21lIENoaWxkIEVkaXQgTW9kZWwmcXVvdDsNCisgICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lZGl0TW9kZWwmcXVvdDsmZ3Q7DQorICAgICAgJmx0O2VkaXRNb2RlbA0KKyAgICAgICAgICAgIGVkaXRNb2RlbElEPSZxdW90O2NvbS5hY21lLmFjbWVwcm8uY2hpbGQuZWRpdE1vZGVsJnF1b3Q7DQorICAgICAgICAgICAgZmFjdG9yeUNsYXNzPSZxdW90O29yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEZhY3RvcnkmcXVvdDsNCisgICAgICAgICAgICBwYXJlbnRNb2RlbElEPSZxdW90O2NvbS5hY21lLmFjbWVwcm8ucGFyZW50LmVkaXRNb2RlbCZxdW90OyZndDsNCisgICAgICAgICZsdDtlZGl0TW9kZWxSZXNvdXJjZSBVUkk9JnF1b3Q7RElSL3Jlc291cmNlMi54bWwmcXVvdDsvJmd0Ow0KKyAgICAgICAgJmx0O2VkaXRNb2RlbFJlc291cmNlIFVSST0mcXVvdDtESVIvcmVzb3VyY2UzLnhtbCZxdW90Oy8mZ3Q7DQorICAgICAgJmx0Oy9lZGl0TW9kZWwmZ3Q7DQorICAgJmx0Oy9leHRlbnNpb24mZ3Q7DQorJmx0Oy9wcmUmZ3Q7DQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCisgICA8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgRWRpdCBNb2RlbHMgY2FuIGJlIGFjY2Vzc2VkIHRocm91Z2ggdGhlICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHQmbHQ7L2NvZGUmZ3Q7Lg0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorICAgPGFubm90YXRpb24+DQorICAgICAgPGFwcEluZm8+DQorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KKyAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICANCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQorICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQorQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCithdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgDQordGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2ENCitocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Ow0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zY2hlbWEvZWRpdE1vZGVsRXh0ZW5zaW9uLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NjaGVtYS9lZGl0TW9kZWxFeHRlbnNpb24uZXhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDZkMmFlCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zY2hlbWEvZWRpdE1vZGVsRXh0ZW5zaW9uLmV4c2QKQEAgLTAsMCArMSwxMzAgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQorPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCis8c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24iPg0KKzxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uIiBpZD0iZWRpdE1vZGVsRXh0ZW5zaW9uIiBuYW1lPSJFZGl0IE1vZGVsIEV4dGVuc2lvbnMiLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgVGhlIEVkaXQgTW9kZWwgRXh0ZW5zaW9uIGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIGNvbnRyaWJ1dGUgZXhwZWN0ZWQgcmVzb3VyY2VzIHRvIEVkaXQgTW9kZWxzLiBUaGUgZnVuY3Rpb25Hcm91cElEIGFsbG93cyB1c2VycyB0byBzZWxlY3Qgd2hpY2ggZXh0ZW5zaW9ucyB0aGV5IGNob29zZSB0byBoYXZlIGVuYWJsZWQuDQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCisgICA8aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iZWRpdE1vZGVsLmV4c2QiLz4NCisNCisgICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KKyAgICAgIDxjb21wbGV4VHlwZT4NCisgICAgICAgICA8c2VxdWVuY2U+DQorICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlZGl0TW9kZWxFeHRlbnNpb24iIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCisgICAgICAgICA8L3NlcXVlbmNlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgIDwvY29tcGxleFR5cGU+DQorICAgPC9lbGVtZW50Pg0KKw0KKyAgIDxlbGVtZW50IG5hbWU9ImVkaXRNb2RlbEV4dGVuc2lvbiI+DQorICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgRWRpdCBtb2RlbCBleHRlbnNpb25zIGFsbG93IGNvbXBvbmVudHMgdG8gY29udHJpYnV0ZSBrbm93biByZXNvdXJjZSBVUklzIHRvIGFuIGVkaXQgbW9kZWwuICBXaGVuZXZlciBhbiBlZGl0IG1vZGVsIGlzIGxvYWRlZCwgdGhlIHJlc291cmNlcyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgbG9hZGVkIGFuZCBtYW5hZ2VkIGJ5IHRoZSBlZGl0IG1vZGVsLiAgQ2hhbmdlcyB0byB0aGUgcmVzb3VyY2VzIHdpbGwgYmUgdHJhY2tlZCBhbmQgc2F2ZWQgZHVyaW5nIG9wZXJhdGlvbnMgb3IgZWRpdG9yIHNhdmVzLg0KKyAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgPGNvbXBsZXhUeXBlPg0KKyAgICAgICAgIDxzZXF1ZW5jZT4NCisgICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVkaXRNb2RlbFJlc291cmNlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQorICAgICAgICAgPC9zZXF1ZW5jZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImVkaXRNb2RlbElEIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIFRoZSB1bmlxdWUgaWQgb2YgdGhlIGVkaXQgbW9kZWwgYmVpbmcgZXh0ZW5kZWQuDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBleHRlbnNpb24uICBUaGlzIHdpbGwgYmUgdXNlZCB0byBhc3NvY2lhdGUgaXQgd2l0aCBhIGZ1bmN0aW9uIGdyb3VwIHBhdHRlcm4gYmluZGluZy4NCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgIDwvY29tcGxleFR5cGU+DQorICAgPC9lbGVtZW50Pg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgMS4wDQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCisgICA8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQorICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICZsdDtwcmUmZ3Q7DQorICAgJmx0O2V4dGVuc2lvbg0KKyAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVkaXRNb2RlbEV4dGVuc2lvbiZxdW90OyZndDsNCisgICAgICAmbHQ7ZWRpdE1vZGVsRXh0ZW5zaW9uDQorICAgICAgICAgICAgZWRpdE1vZGVsSUQ9JnF1b3Q7b3JnLnNhbXBsZS5pbmhlcml0YW5jZS5wYXJlbnQuZWRpdE1vZGVsJnF1b3Q7DQorICAgICAgICAgICAgZnVuY3Rpb25Hcm91cElEPSZxdW90O29yZy5zYW1wbGUuZ3JvdXAmcXVvdDsmZ3Q7DQorICAgICAgICAgJmx0O2VkaXRNb2RlbFJlc291cmNlIFVSST0mcXVvdDtESVIvZXh0ZW5zaW9uMC54bWwmcXVvdDsvJmd0Ow0KKyAgICAgICAgICZsdDtlZGl0TW9kZWxSZXNvdXJjZSBVUkk9JnF1b3Q7RElSL2V4dGVuc2lvbjEueG1sJnF1b3Q7LyZndDsNCisgICAgICAmbHQ7L2VkaXRNb2RlbEV4dGVuc2lvbiZndDsNCisgICAmbHQ7L2V4dGVuc2lvbiZndDsNCismbHQ7L3ByZSZndDsNCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KKyAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICANCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgDQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCisgICA8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KKyAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KK0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQorYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KK3RoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthDQoraHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKzwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc2NoZW1hL21vZGlmaWVySGVscGVyRmFjdG9yeS5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zY2hlbWEvbW9kaWZpZXJIZWxwZXJGYWN0b3J5LmV4c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNjMDdkYgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc2NoZW1hL21vZGlmaWVySGVscGVyRmFjdG9yeS5leHNkCkBAIC0wLDAgKzEsMTYwIEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KKzwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQorPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uIj4NCis8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbiIgaWQ9Ik1vZGlmaWVySGVscGVyRmFjdG9yeSIgbmFtZT0iTW9kaWZpZXIgSGVscGVyIEZhY3RvcnkiLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgDQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCisgICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KKyAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIFRoaXMgaXMgdXNlZCB0byByZWdpc3RlciBmb3IgdGhlIG1vZGVsIG1vZGlmaWVycy4NCisgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgIDxjb21wbGV4VHlwZT4NCisgICAgICAgICA8c2VxdWVuY2U+DQorICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmYWN0b3J5IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQorICAgICAgICAgPC9zZXF1ZW5jZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQNCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICA8L2NvbXBsZXhUeXBlPg0KKyAgIDwvZWxlbWVudD4NCisNCisgICA8ZWxlbWVudCBuYW1lPSJmYWN0b3J5Ij4NCisgICAgICA8Y29tcGxleFR5cGU+DQorICAgICAgICAgPHNlcXVlbmNlPg0KKyAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icGFja2FnZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KKyAgICAgICAgIDwvc2VxdWVuY2U+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgIDwvY29tcGxleFR5cGU+DQorICAgPC9lbGVtZW50Pg0KKw0KKyAgIDxlbGVtZW50IG5hbWU9InBhY2thZ2UiPg0KKyAgICAgIDxjb21wbGV4VHlwZT4NCisgICAgICAgICA8c2VxdWVuY2U+DQorICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ0eXBlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQorICAgICAgICAgPC9zZXF1ZW5jZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InVyaSIgdHlwZT0ic3RyaW5nIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgIDwvY29tcGxleFR5cGU+DQorICAgPC9lbGVtZW50Pg0KKw0KKyAgIDxlbGVtZW50IG5hbWU9InR5cGUiPg0KKyAgICAgIDxjb21wbGV4VHlwZT4NCisgICAgICAgICA8c2VxdWVuY2U+DQorICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmZWF0dXJlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQorICAgICAgICAgPC9zZXF1ZW5jZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICA8L2NvbXBsZXhUeXBlPg0KKyAgIDwvZWxlbWVudD4NCisNCisgICA8ZWxlbWVudCBuYW1lPSJmZWF0dXJlIj4NCisgICAgICA8Y29tcGxleFR5cGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhY3Rpb24iIHR5cGU9InN0cmluZyI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICA8L2NvbXBsZXhUeXBlPg0KKyAgIDwvZWxlbWVudD4NCisNCisgICA8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQorICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0Ow0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorICAgPGFubm90YXRpb24+DQorICAgICAgPGFwcEluZm8+DQorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KKyAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICANCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KKyAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICANCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgDQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCisgICA8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KKyAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KK0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQorYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KK3RoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthDQoraHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKzwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL0NvbXBhdGliaWxpdHlXb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9Db21wYXRpYmlsaXR5V29ya2JlbmNoVVJJQ29udmVydGVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZTBjZDEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9Db21wYXRpYmlsaXR5V29ya2JlbmNoVVJJQ29udmVydGVySW1wbC5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQ3JlYXRlZCBvbiBNYXIgNCwgMjAwNAorICoKKyAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KKyAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cworICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkNvbXBhdGliaWxpdHlVUklDb252ZXJ0ZXI7CisKKy8qKgorICogQGF1dGhvciBzY2hhY2hlcgorICogCisgKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KKyAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cworICovCitwdWJsaWMgY2xhc3MgQ29tcGF0aWJpbGl0eVdvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwgZXh0ZW5kcyBXb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsIGltcGxlbWVudHMgQ29tcGF0aWJpbGl0eVVSSUNvbnZlcnRlciB7CisJLyoqCisJICogIAorCSAqLworCXB1YmxpYyBDb21wYXRpYmlsaXR5V29ya2JlbmNoVVJJQ29udmVydGVySW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gYW5JbnB1dENvbnRhaW5lcgorCSAqLworCXB1YmxpYyBDb21wYXRpYmlsaXR5V29ya2JlbmNoVVJJQ29udmVydGVySW1wbChJQ29udGFpbmVyIGFuSW5wdXRDb250YWluZXIpIHsKKwkJc3VwZXIoYW5JbnB1dENvbnRhaW5lcik7CisJfQorCisJLyoqCisJICogQHBhcmFtIGFDb250YWluZXIKKwkgKiBAcGFyYW0gYVN5bmNocm9uaXplcgorCSAqLworCXB1YmxpYyBDb21wYXRpYmlsaXR5V29ya2JlbmNoVVJJQ29udmVydGVySW1wbChJQ29udGFpbmVyIGFDb250YWluZXIsIFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyIGFTeW5jaHJvbml6ZXIpIHsKKwkJc3VwZXIoYUNvbnRhaW5lciwgYVN5bmNocm9uaXplcik7CisJfQorCisJLyoqCisJICogQHBhcmFtIGFuSW5wdXRDb250YWluZXIKKwkgKiBAcGFyYW0gYW5PdXRwdXRDb250YWluZXIKKwkgKi8KKwlwdWJsaWMgQ29tcGF0aWJpbGl0eVdvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwoSUNvbnRhaW5lciBhbklucHV0Q29udGFpbmVyLCBJQ29udGFpbmVyIGFuT3V0cHV0Q29udGFpbmVyKSB7CisJCXN1cGVyKGFuSW5wdXRDb250YWluZXIsIGFuT3V0cHV0Q29udGFpbmVyKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gYW5JbnB1dENvbnRhaW5lcgorCSAqIEBwYXJhbSBhbk91dHB1dENvbnRhaW5lcgorCSAqIEBwYXJhbSBhU3luY2hyb25pemVyCisJICovCisJcHVibGljIENvbXBhdGliaWxpdHlXb3JrYmVuY2hVUklDb252ZXJ0ZXJJbXBsKElDb250YWluZXIgYW5JbnB1dENvbnRhaW5lciwgSUNvbnRhaW5lciBhbk91dHB1dENvbnRhaW5lciwgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgYVN5bmNocm9uaXplcikgeworCQlzdXBlcihhbklucHV0Q29udGFpbmVyLCBhbk91dHB1dENvbnRhaW5lciwgYVN5bmNocm9uaXplcik7CisJfQorCisJLyoqCisJICogQHNlZSBjb20uaWJtLmV0b29scy54bWkuaGVscGVycy5Db21wYXRpYmlsaXR5VVJJQ29udmVydGVyI2RlTm9ybWFsaXplKFVSSSkKKwkgKi8KKwlwdWJsaWMgVVJJIGRlTm9ybWFsaXplKFVSSSB1cmkpIHsKKwkJaWYgKFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5pc1BsYXRmb3JtUmVzb3VyY2VVUkkodXJpKSkgeworCQkJSUZpbGUgYUZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRQbGF0Zm9ybUZpbGUodXJpKTsKKwkJCWlmIChhRmlsZSAhPSBudWxsKSB7CisJCQkJSVByb2plY3QgZmlsZVByb2plY3QgPSBhRmlsZS5nZXRQcm9qZWN0KCk7CisJCQkJLy9JZiBpdCBpcyBub3QgaW4gdGhlIHNhbWUgcHJvamVjdCB0aGVuIGp1c3QgcmV0dXJuIHRoZSBVUkkgYXMgaXMuCisJCQkJaWYgKHJlc291cmNlU2V0U3luY2hyb25pemVyLmdldFByb2plY3QoKSA9PSBmaWxlUHJvamVjdCkKKwkJCQkJcmV0dXJuIGdldENvbnRhaW5lclJlbGF0aXZlVVJJKGFGaWxlKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdXJpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvRHluYW1pY0dyb3d0aE1vZGVsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9EeW5hbWljR3Jvd3RoTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmE5YTZkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvRHluYW1pY0dyb3d0aE1vZGVsLmphdmEKQEAgLTAsMCArMSw5OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworCisKK3B1YmxpYyBjbGFzcyBEeW5hbWljR3Jvd3RoTW9kZWwgeworCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5JTVVNX09QVElNQUxfU0laRSA9IDEwOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FTU9SWV9USFJFU0hIT0xEID0gMTAwOworCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT1RJQ0VBQkxFX0NIQU5HRSA9IDU7CisJCisJCisJLyogU3RvcmVzIGEgRklGTyBsaXN0IG9mIHRoZSBLZXkgdHlwZXMgKElQYXRoKSovCisJcHJpdmF0ZSBmaW5hbCBMaXN0IHF1ZXVlID0gbmV3IExpbmtlZExpc3QoKTsKKwkKKwkvKiBXZSB1c2UgYW4gaW50W10gYXMgdGhlIHZhbHVlIHNvIHdlIGRvbid0IGhhdmUgdG8ga2VlcCBjcmVhdGluZyBJbnRlZ2VyIG9iamVjdHMgKi8KKwlwcml2YXRlIGZpbmFsIE1hcC8qIDxJUGF0aCwgaW50W10+ICovIHVuaXF1ZXNNYXAgPSBuZXcgSGFzaE1hcCgpOworCQorCQorCS8qKgorCSAqIEluamVjdCB0aGUga2V5IGludG8gdGhlIER5bmFtaWNHcm93dGhNb2RlbC4gTWF5IG9yIG1heSBub3QgYWZmZWN0IHRoZSAKKwkgKiBkeW5hbWljIHNpemUuCisJICoKKwkgKiBAcGFyYW0ga2V5IFRoZSBrZXkgdG8gaW5qZWN0IGludG8gdGhlIG1vZGVsCisJICogQHJldHVybiBUcnVlIGlmIHRoZSBvcHRpbWFsIHNpemUgY2hhbmdlZCBncmVhdGhlciB0aGFuIHtAdmFsdWUgTk9USUNFQUJMRV9DSEFOR0V9IGFzIGEgcmVzdWx0IG9mIHRoZSBpbmplY3Rpb24uCisJICovCisJcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGluamVjdEtleShJUGF0aCBrZXkpIHsKKwkJCisJCWludCBvcmlnaW5hbFNpemUgPSBnZXRPcHRpbWFsU2l6ZSgpOworCQkKKwkJaW50W10gY291bnQgPSBudWxsOworCQlpZiggKGNvdW50ID0gKGludFtdKSB1bmlxdWVzTWFwLmdldChrZXkpKSAhPSBudWxsICkgeworCQkJLyogaW5jcmVtZW50IHRoZSBjb3VudCAqLworCQkJKytjb3VudFswXTsKKwkJfSBlbHNlIHsKKwkJCS8qIGluc2VydCB0aGUgZmlyc3QgY291bnQgKi8KKwkJCXVuaXF1ZXNNYXAucHV0KGtleSwgY291bnQgPSBuZXcgaW50W10geyAxIH0gKTsKKwkJfQorCQkKKwkJaWYoIHF1ZXVlLnNpemUoKSA9PSBNRU1PUllfVEhSRVNISE9MRCApIHsKKwkJCQorCQkJLyogdGFrZSB0aGUgb2xkZXN0IHZhbHVlIG9mZiB0aGUgcXVldWUgKi8KKwkJCUlQYXRoIG9sZGVzdEtleSA9IChJUGF0aCkgcXVldWUucmVtb3ZlKDApOworCQkJCisJCQkvKiBkZXRlcm1pbmUgaWYgYW5vdGhlciBpbnN0YW5jZSBvZiB0aGUgb2xkZXN0IGtleSBpcyBzdGlsbCBpbiB0aGUgcXVldWUgKi8KKwkJCWNvdW50ID0gKGludFtdKSB1bmlxdWVzTWFwLmdldChvbGRlc3RLZXkpOworCQkJQXNzZXJ0LmlzTm90TnVsbChjb3VudCk7CisJCQkKKwkJCS8qIFJlZHVjZSB0aGUgY291bnQgKi8KKwkJCWNvdW50WzBdIC09IDE7CisJCQorCQkJLyogQ291bnQgc2hvdWxkIG5ldmVyIGJlIG5lZ2F0aXZlICovCisJCQlBc3NlcnQuaXNUcnVlKGNvdW50WzBdID49IDApOworCQkJCisJCQorCQkJLyogVGhpcyB1bmlxdWUga2V5IGlzIG5vIGxvbmdlciBpbiB0aGUgcXVldWUqLworCQkJaWYoY291bnRbMF0gPT0gMCkgeworCQkJCXVuaXF1ZXNNYXAucmVtb3ZlKG9sZGVzdEtleSk7CisJCQl9CisJCQkKKwkJCQorCQkJCisJCX0KKwkJLyogQWRkIHRoZSBuZXdLZXkgdG8gZW5kIG9mIHRoZSBsaXN0Ki8KKwkJcXVldWUuYWRkKGtleSk7CisJCQorCQlyZXR1cm4gTWF0aC5hYnMoIG9yaWdpbmFsU2l6ZSAtIGdldE9wdGltYWxTaXplKCkgKSA+IE5PVElDRUFCTEVfQ0hBTkdFOworCisJfQorCQorCS8qKgorCSAqIFRoZSBvcHRpbWFsIHNpemUgaXMgYW4gaW50ZWdlciBmcm9tIFt7QHZhbHVlICNNSU5JTVVNX09QVElNQUxfU0laRX0sIHtAdmFsdWUgI01FTU9SWV9USFJFU0hIT0xEfV0uIAorCSAqIAorCSAqIEByZXR1cm4gdGhlIG9wdGltYWwgc2l6ZSBmb3IgdGhlIExSVSBDYWNoZS4gIAorCSAqLworCXB1YmxpYyBpbnQgZ2V0T3B0aW1hbFNpemUoKSB7CQkKKwkJcmV0dXJuIHVuaXF1ZXNNYXAuc2l6ZSgpID4gTUlOSU1VTV9PUFRJTUFMX1NJWkUgPyB1bmlxdWVzTWFwLnNpemUoKSA6IE1JTklNVU1fT1BUSU1BTF9TSVpFOworCX0KKworfQkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL0VNRldvcmtiZW5jaENvbnRleHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL0VNRldvcmtiZW5jaENvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmM2YjM1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvRU1GV29ya2JlbmNoQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsNDIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIENyZWF0ZWQgb24gTWFyIDMsIDIwMDQKKyAqCisgKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCisgKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0QmFzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLklTeW5jaHJvbml6ZXJFeHRlbmRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RSZXNvdXJjZVNldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFVSSUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkNvbXBhdGliaWxpdHlYTUlSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZWZlcmVuY2VkWE1JRmFjdG9yeUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkRlZmF1bHRPdmVycmlkYWJsZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQuRWRpdE1vZGVsUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLlByb2plY3RSZXNvdXJjZVNldEVkaXRJbXBsOworCisvKioKKyAqIEBhdXRob3Igc2NoYWNoZXIKKyAqIAorICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCisgKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKKyAqLworcHVibGljIGNsYXNzIEVNRldvcmtiZW5jaENvbnRleHQgZXh0ZW5kcyBFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBpbXBsZW1lbnRzIElTeW5jaHJvbml6ZXJFeHRlbmRlciB7CisKKwlwcml2YXRlIE1hcCByZWFkT25seU1vZGVscyA9IG5ldyBIYXNoTWFwKCk7CisJcHJpdmF0ZSBNYXAgZWRpdGFibGVNb2RlbHMgPSBuZXcgSGFzaE1hcCgpOworCisJcHJvdGVjdGVkIEFkYXB0ZXIgcmVzb3VyY2VTZXRMaXN0ZW5lcjsKKworCXByb3RlY3RlZCBib29sZWFuIGRlZmF1bHRUb01PRjVDb21wYXRpYmlsaXR5ID0gZmFsc2U7CisKKworCS8qKgorCSAqIEBwYXJhbSBhUHJvamVjdAorCSAqLworCXB1YmxpYyBFTUZXb3JrYmVuY2hDb250ZXh0KElQcm9qZWN0IGFQcm9qZWN0KSB7CisJCXN1cGVyKGFQcm9qZWN0KTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHQjaW5pdGlhbGl6ZVJlc291cmNlU2V0KG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLlByb2plY3RSZXNvdXJjZVNldCkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUmVzb3VyY2VTZXQoUHJvamVjdFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCkgeworCQlzdXBlci5pbml0aWFsaXplUmVzb3VyY2VTZXQoYVJlc291cmNlU2V0KTsKKwkJUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeSByZWcgPSBuZXcgRGVmYXVsdE92ZXJyaWRhYmxlUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKTsKKwkJUmVzb3VyY2UuRmFjdG9yeSBmYWN0b3J5ID0gbmV3IFJlZmVyZW5jZWRYTUlGYWN0b3J5SW1wbCgpOworCQlyZWcuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuREVGQVVMVF9FWFRFTlNJT04sIGZhY3RvcnkpOworCQkvLyBhZGQgeG1pIGJlY2F1c2Ugb3RoZXIgcGx1Z2lucyBhcmUgcmVnaXN0ZXJpbmcgaXQgZ2xvYmFsbHkKKwkJcmVnLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgieG1pIiwgZmFjdG9yeSk7IC8vJE5PTi1OTFMtMSQKKwkJYVJlc291cmNlU2V0LnNldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KHJlZyk7CisJCWFSZXNvdXJjZVNldC5nZXRTeW5jaHJvbml6ZXIoKS5hZGRFeHRlbmRlcih0aGlzKTsgLy8gYWRkZWQgc28gd2UgY2FuIGJlIGluZm9ybWVkIG9mIGNsb3NlcworCQkvLyB0byB0aGUgcHJvamVjdC4KKwkJc3RhcnRMaXN0ZW5pbmdUb1Jlc291cmNlU2V0KCk7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2FjaGVJRChTdHJpbmcgZWRpdE1vZGVsSUQsIE1hcCBwYXJhbXMpIHsKKwkJcmV0dXJuIEVkaXRNb2RlbFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q2FjaGVJRChlZGl0TW9kZWxJRCwgcGFyYW1zKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBBUEkgdGhhdCBjbGllbnRzIHNob3VsZCB1c2Ugd2hlbiB0aGV5IGhhdmUgYW4gaW50ZW50IHRvIG1vZGlmeSBhIHBhcnRpY3VsYXIKKwkgKiByZXNvdXJjZS4gWW91IHNob3VsZCBvbmx5IGFjY2VzcyB0aGUgcmVzb3VyY2VzIHRocm91Z2ggdGhlIEoyRUVFZGl0TW9kZWwgdGhhdCBpcyByZXR1cm5lZCBieQorCSAqIHRoaXMgbWV0aG9kIGlmIHlvdSBoYXZlIHRoZSBpbnRlbnQgdG8gbW9kaWZ5LgorCSAqIAorCSAqIEBzZWUgSjJFRUVkaXRNb2RlbAorCSAqLworCXB1YmxpYyBmaW5hbCBFZGl0TW9kZWwgZ2V0RWRpdE1vZGVsRm9yV3JpdGUoU3RyaW5nIGVkaXRNb2RlbElELCBPYmplY3QgYWNjZXNzb3JLZXksIE1hcCBwYXJhbXMpIHsKKwkJRWRpdE1vZGVsIGVkaXRNb2RlbCA9IGdldEV4aXN0aW5nRWRpdE1vZGVsKGVkaXRNb2RlbElELCBwYXJhbXMsIGZhbHNlKTsKKwkJaWYgKG51bGwgPT0gZWRpdE1vZGVsKSB7CisJCQllZGl0TW9kZWwgPSBjcmVhdGVFZGl0TW9kZWxGb3JXcml0ZShlZGl0TW9kZWxJRCwgcGFyYW1zKTsKKwkJCXN5bmNocm9uaXplZCAoZWRpdE1vZGVsKSB7CisJCQkJY2FjaGVFZGl0TW9kZWwoZWRpdE1vZGVsLCBwYXJhbXMpOworCQkJCWVkaXRNb2RlbC5hY2Nlc3MoYWNjZXNzb3JLZXkpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGVkaXRNb2RlbC5pc0Rpc3Bvc2VkKCkgfHwgZWRpdE1vZGVsLmlzRGlzcG9zaW5nKCkpIHsKKwkJCQllZGl0TW9kZWwgPSBjcmVhdGVFZGl0TW9kZWxGb3JXcml0ZShlZGl0TW9kZWxJRCwgcGFyYW1zKTsKKwkJCQljYWNoZUVkaXRNb2RlbChlZGl0TW9kZWwsIHBhcmFtcyk7CisJCQl9CisJCQlzeW5jaHJvbml6ZWQgKGVkaXRNb2RlbCkgeworCQkJCWVkaXRNb2RlbC5hY2Nlc3MoYWNjZXNzb3JLZXkpOworCQkJfQorCQl9CisJCXJldHVybiBlZGl0TW9kZWw7CisJfQorCisJLyoqCisJICogVGhpcyBpcyB0aGUgQVBJIHRoYXQgY2xpZW50cyBzaG91bGQgdXNlIHdoZW4gdGhleSB3YW50IHRvIHJlYWQgYSBncm91cCBvZiByZXNvdXJjZXMgdGhhdCBhcmUKKwkgKiBub3JtYWxseSBtYW5hZ2VkIGJ5IHRoZSBlZGl0IG1vZGVsIHdpdGgKKwkgKiAKKwkgKiBAYUtleS4gWW91IHNob3VsZCBvbmx5IGFjY2VzcyB0aGUgcmVzb3VyY2VzIHRocm91Z2ggdGhlIEoyRUVFZGl0TW9kZWwgdGhhdCBpcyByZXR1cm5lZCBieQorCSAqICAgICAgICB0aGlzIG1ldGhvZC4gWW91IG11c3QgY2FsbCByZWxlYXNlRWRpdE1vZGVsKC4uLikgd2hlbiB5b3UgYXJlIGZpbmlzaGVkIHdpdGggdGhlIGVkaXQKKwkgKiAgICAgICAgbW9kZWwuCisJICogQHNlZSBKMkVFRWRpdE1vZGVsCisJICovCisJcHVibGljIGZpbmFsIEVkaXRNb2RlbCBnZXRFZGl0TW9kZWxGb3JSZWFkKFN0cmluZyBlZGl0TW9kZWxJRCwgT2JqZWN0IGFjY2Vzc29yS2V5LCBNYXAgcGFyYW1zKSB7CisJCXRyeSB7CisJCQlFZGl0TW9kZWwgZWRpdE1vZGVsID0gZ2V0RXhpc3RpbmdFZGl0TW9kZWwoZWRpdE1vZGVsSUQsIHBhcmFtcywgdHJ1ZSk7CisJCQlpZiAobnVsbCA9PSBlZGl0TW9kZWwpIHsKKwkJCQllZGl0TW9kZWwgPSBjcmVhdGVFZGl0TW9kZWxGb3JSZWFkKGVkaXRNb2RlbElELCBwYXJhbXMpOworCQkJCXN5bmNocm9uaXplZCAoZWRpdE1vZGVsKSB7CisJCQkJCWNhY2hlRWRpdE1vZGVsKGVkaXRNb2RlbCwgcGFyYW1zKTsKKwkJCQkJRWRpdE1vZGVsTGVhc3RVc2VkQ2FjaGUuZ2V0SW5zdGFuY2UoKS5hY2Nlc3MoZWRpdE1vZGVsKTsKKwkJCQkJZWRpdE1vZGVsLmFjY2VzcyhhY2Nlc3NvcktleSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoZWRpdE1vZGVsLmlzRGlzcG9zZWQoKSB8fCBlZGl0TW9kZWwuaXNEaXNwb3NpbmcoKSkgeworCQkJCQllZGl0TW9kZWwgPSBjcmVhdGVFZGl0TW9kZWxGb3JSZWFkKGVkaXRNb2RlbElELCBwYXJhbXMpOworCQkJCQljYWNoZUVkaXRNb2RlbChlZGl0TW9kZWwsIHBhcmFtcyk7CisJCQkJfQorCQkJCXN5bmNocm9uaXplZCAoZWRpdE1vZGVsKSB7CisJCQkJCUVkaXRNb2RlbExlYXN0VXNlZENhY2hlLmdldEluc3RhbmNlKCkuYWNjZXNzKGVkaXRNb2RlbCk7CisJCQkJCWVkaXRNb2RlbC5hY2Nlc3MoYWNjZXNzb3JLZXkpOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBlZGl0TW9kZWw7CisJCX0gZmluYWxseSB7CisJCQlFZGl0TW9kZWxMZWFzdFVzZWRDYWNoZS5nZXRJbnN0YW5jZSgpLm9wdGltaXplTFJVU2l6ZUlmTmVjZXNzYXJ5KCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBBUEkgdGhhdCBjbGllbnRzIHNob3VsZCB1c2Ugd2hlbiB0aGV5IGhhdmUgYW4gaW50ZW50IHRvIG1vZGlmeSBhIHBhcnRpY3VsYXIKKwkgKiByZXNvdXJjZS4gWW91IHNob3VsZCBvbmx5IGFjY2VzcyB0aGUgcmVzb3VyY2VzIHRocm91Z2ggdGhlIEoyRUVFZGl0TW9kZWwgdGhhdCBpcyByZXR1cm5lZCBieQorCSAqIHRoaXMgbWV0aG9kIGlmIHlvdSBoYXZlIHRoZSBpbnRlbnQgdG8gbW9kaWZ5LgorCSAqIAorCSAqIEBzZWUgSjJFRUVkaXRNb2RlbAorCSAqLworCXB1YmxpYyBmaW5hbCBFZGl0TW9kZWwgZ2V0RWRpdE1vZGVsRm9yV3JpdGUoU3RyaW5nIGVkaXRNb2RlbElELCBPYmplY3QgYWNjZXNzb3JLZXkpIHsKKwkJcmV0dXJuIGdldEVkaXRNb2RlbEZvcldyaXRlKGVkaXRNb2RlbElELCBhY2Nlc3NvcktleSwgbnVsbCk7CisJfQorCisJLyoqCisJICogVGhpcyBpcyB0aGUgQVBJIHRoYXQgY2xpZW50cyBzaG91bGQgdXNlIHdoZW4gdGhleSB3YW50IHRvIHJlYWQgYSBncm91cCBvZiByZXNvdXJjZXMgdGhhdCBhcmUKKwkgKiBub3JtYWxseSBtYW5hZ2VkIGJ5IHRoZSBlZGl0IG1vZGVsIHdpdGgKKwkgKiAKKwkgKiBAYUtleS4gWW91IHNob3VsZCBvbmx5IGFjY2VzcyB0aGUgcmVzb3VyY2VzIHRocm91Z2ggdGhlIEoyRUVFZGl0TW9kZWwgdGhhdCBpcyByZXR1cm5lZCBieQorCSAqICAgICAgICB0aGlzIG1ldGhvZC4gWW91IG11c3QgY2FsbCByZWxlYXNlRWRpdE1vZGVsKC4uLikgd2hlbiB5b3UgYXJlIGZpbmlzaGVkIHdpdGggdGhlIGVkaXQKKwkgKiAgICAgICAgbW9kZWwuCisJICogQHNlZSBKMkVFRWRpdE1vZGVsCisJICovCisJcHVibGljIGZpbmFsIEVkaXRNb2RlbCBnZXRFZGl0TW9kZWxGb3JSZWFkKFN0cmluZyBlZGl0TW9kZWxJRCwgT2JqZWN0IGFjY2Vzc29yS2V5KSB7CisJCXJldHVybiBnZXRFZGl0TW9kZWxGb3JSZWFkKGVkaXRNb2RlbElELCBhY2Nlc3NvcktleSwgbnVsbCk7CisJfQorCisKKworCXB1YmxpYyBFZGl0TW9kZWwgZ2V0RXhpc3RpbmdFZGl0TW9kZWwoU3RyaW5nIGVkaXRNb2RlbElELCBNYXAgcGFyYW1zLCBib29sZWFuIGlzUmVhZE9ubHkpIHsKKwkJRWRpdE1vZGVsIGVkaXRNb2RlbCA9IG51bGw7CisJCXN5bmNocm9uaXplZCAocmVhZE9ubHlNb2RlbHMpIHsKKwkJCWlmIChpc1JlYWRPbmx5KSB7CisJCQkJZWRpdE1vZGVsID0gKEVkaXRNb2RlbCkgcmVhZE9ubHlNb2RlbHMuZ2V0KGdldENhY2hlSUQoZWRpdE1vZGVsSUQsIHBhcmFtcykpOworCQkJfSBlbHNlIHsKKwkJCQlzeW5jaHJvbml6ZWQgKGVkaXRhYmxlTW9kZWxzKSB7CisJCQkJCWVkaXRNb2RlbCA9IChFZGl0TW9kZWwpIGVkaXRhYmxlTW9kZWxzLmdldChnZXRDYWNoZUlEKGVkaXRNb2RlbElELCBwYXJhbXMpKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIGVkaXRNb2RlbDsKKwl9CisKKwkvKioKKwkgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0byByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIHJlYWQtb25seSBKMkVFRWRpdE1vZGVsLgorCSAqLworCXByb3RlY3RlZCBFZGl0TW9kZWwgY3JlYXRlRWRpdE1vZGVsRm9yUmVhZChTdHJpbmcgZWRpdE1vZGVsSUQsIE1hcCBwYXJhbXMpIHsKKwkJcmV0dXJuIEVkaXRNb2RlbFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuY3JlYXRlRWRpdE1vZGVsRm9yUmVhZChlZGl0TW9kZWxJRCwgdGhpcywgcGFyYW1zKTsKKwl9CisKKwkvKioKKwkgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0byByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIEoyRUVFZGl0TW9kZWwuCisJICovCisJcHJvdGVjdGVkIEVkaXRNb2RlbCBjcmVhdGVFZGl0TW9kZWxGb3JXcml0ZShTdHJpbmcgZWRpdE1vZGVsSUQsIE1hcCBwYXJhbXMpIHsKKwkJcmV0dXJuIEVkaXRNb2RlbFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuY3JlYXRlRWRpdE1vZGVsRm9yV3JpdGUoZWRpdE1vZGVsSUQsIHRoaXMsIHBhcmFtcyk7CisJfQorCisJLyoqCisJICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xNi8yMDAxIDEyOjI1OjM5IFBNKQorCSAqIAorCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKKwkgKi8KKwlwdWJsaWMgdm9pZCBjYWNoZUVkaXRNb2RlbChFZGl0TW9kZWwgZWRpdE1vZGVsLCBNYXAgcGFyYW1zKSB7CisJCWVkaXRNb2RlbC5zZXRQYXJhbXMocGFyYW1zKTsKKwkJc3luY2hyb25pemVkIChyZWFkT25seU1vZGVscykgeworCQkJaWYgKGVkaXRNb2RlbC5pc1JlYWRPbmx5KCkpCisJCQkJcmVhZE9ubHlNb2RlbHMucHV0KGdldENhY2hlSUQoZWRpdE1vZGVsLmdldEVkaXRNb2RlbElEKCksIHBhcmFtcyksIGVkaXRNb2RlbCk7CisJCQllbHNlCisJCQkJc3luY2hyb25pemVkIChlZGl0YWJsZU1vZGVscykgeworCQkJCQllZGl0YWJsZU1vZGVscy5wdXQoZ2V0Q2FjaGVJRChlZGl0TW9kZWwuZ2V0RWRpdE1vZGVsSUQoKSwgcGFyYW1zKSwgZWRpdE1vZGVsKTsKKwkJCQl9CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBkaXNjYXJkQWxsRWRpdE1vZGVscygpIHsKKwkJc3luY2hyb25pemVkIChyZWFkT25seU1vZGVscykgeworCQkJc3luY2hyb25pemVkIChlZGl0YWJsZU1vZGVscykgeworCQkJCUNvbGxlY3Rpb24gcmVhZE9ubHkgPSByZWFkT25seU1vZGVscy52YWx1ZXMoKTsKKwkJCQlFZGl0TW9kZWxMZWFzdFVzZWRDYWNoZS5nZXRJbnN0YW5jZSgpLnJlbW92ZUFsbENhY2hlZChyZWFkT25seSk7CisJCQkJZGlzY2FyZE1vZGVscyhyZWFkT25seSk7CisJCQkJZGlzY2FyZE1vZGVscyhlZGl0YWJsZU1vZGVscy52YWx1ZXMoKSk7CisJCQl9CisJCX0KKworCX0KKworCXByaXZhdGUgdm9pZCBkaXNjYXJkTW9kZWxzKENvbGxlY3Rpb24gZWRpdE1vZGVscykgeworCQlpZiAoZWRpdE1vZGVscyAhPSBudWxsICYmICFlZGl0TW9kZWxzLmlzRW1wdHkoKSkgeworCQkJLy8gTWFrZSBhIGNvcHkgZm9yIHNhZmV0eSBhZ2FpbnN0IGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uCisJCQlJdGVyYXRvciBpdCA9IG5ldyBBcnJheUxpc3QoZWRpdE1vZGVscykuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKwkJCQkoKEVkaXRNb2RlbCkgaXQubmV4dCgpKS5kaXNwb3NlKCk7CisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVFZGl0TW9kZWwoRWRpdE1vZGVsIGVkaXRNb2RlbCwgYm9vbGVhbiByZWFkT25seSkgeworCQkvLyBUaGUgYmVzdCB3YXkgd291bGQgYmUgdG8gcmVjb21wdXRlIHRoZSBjYWNoZSBpZCwgYnV0IHdlIGRvbid0IGNhcmUKKwkJLy8gYmVjYXVzZSB0aGUgZWRpdCBtb2RlbCBzaG91bGQgb25seSBiZSBjYWNoZWQgb25jZSBhbnl3YXkKKwkJc3luY2hyb25pemVkIChyZWFkT25seU1vZGVscykgeworCQkJaWYgKHJlYWRPbmx5KQorCQkJCXJlYWRPbmx5TW9kZWxzLnZhbHVlcygpLnJlbW92ZShlZGl0TW9kZWwpOworCQkJZWxzZQorCQkJCXN5bmNocm9uaXplZCAoZWRpdGFibGVNb2RlbHMpIHsKKwkJCQkJZWRpdGFibGVNb2RlbHMudmFsdWVzKCkucmVtb3ZlKGVkaXRNb2RlbCk7CisJCQkJfQorCQl9CisJfQorCisJLyoqCisJICogTm90aWZ5IGFsbCBlZGl0TW9kZWxzIG9mIHRoZSBjaGFuZ2UuCisJICovCisJcHJvdGVjdGVkIHZvaWQgbm90aWZ5RWRpdE1vZGVscyhFZGl0TW9kZWxFdmVudCBhbkV2ZW50KSB7CisJCWlmIChhbkV2ZW50ID09IG51bGwpCisJCQlyZXR1cm47CisJCUxpc3QgYUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisJCXN5bmNocm9uaXplZCAocmVhZE9ubHlNb2RlbHMpIHsKKwkJCXN5bmNocm9uaXplZCAoZWRpdGFibGVNb2RlbHMpIHsKKwkJCQlhTGlzdC5hZGRBbGwocmVhZE9ubHlNb2RlbHMudmFsdWVzKCkpOworCQkJCWFMaXN0LmFkZEFsbChlZGl0YWJsZU1vZGVscy52YWx1ZXMoKSk7CisJCQl9CisJCX0KKwkJRWRpdE1vZGVsIGVkaXRNb2RlbDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBhTGlzdC5zaXplKCk7IGkrKykgeworCQkJZWRpdE1vZGVsID0gKEVkaXRNb2RlbCkgYUxpc3QuZ2V0KGkpOworCQkJdHJ5IHsKKwkJCQllZGl0TW9kZWwucmVzb3VyY2VDaGFuZ2VkKGFuRXZlbnQpOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CisJCQl9CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGROb3RpZnlFZGl0TW9kZWxzKCkgeworCQlzeW5jaHJvbml6ZWQgKHJlYWRPbmx5TW9kZWxzKSB7CisJCQlzeW5jaHJvbml6ZWQgKGVkaXRhYmxlTW9kZWxzKSB7CisJCQkJcmV0dXJuICF0aGlzLnJlYWRPbmx5TW9kZWxzLmlzRW1wdHkoKSB8fCAhdGhpcy5lZGl0YWJsZU1vZGVscy5pc0VtcHR5KCk7CisJCQl9CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgQWRhcHRlciBnZXRSZXNvdXJjZVNldExpc3RlbmVyKCkgeworCQlpZiAocmVzb3VyY2VTZXRMaXN0ZW5lciA9PSBudWxsKQorCQkJcmVzb3VyY2VTZXRMaXN0ZW5lciA9IG5ldyBSZXNvdXJjZVNldExpc3RlbmVyKCk7CisJCXJldHVybiByZXNvdXJjZVNldExpc3RlbmVyOworCX0KKworCisJcHJvdGVjdGVkIGNsYXNzIFJlc291cmNlU2V0TGlzdGVuZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7CisJCS8qCisJCSAqIEBzZWUgQWRhcHRlciNub3RpZnlDaGFuZ2VkKG5ldyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KU5vdGlmaWVyLAorCQkgKiAgICAgIGludCwoRVN0cnVjdHVyYWxGZWF0dXJlKSBFT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgaW50KSkKKwkJICovCisJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkpIHsKKwkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQgOgorCQkJCQlhZGRlZFJlc291cmNlKChSZXNvdXJjZSkgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkUgOgorCQkJCQlyZW1vdmVkUmVzb3VyY2UoKFJlc291cmNlKSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZIDoKKwkJCQkJcmVtb3ZlZFJlc291cmNlcygoTGlzdCkgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCkpOworCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIE5vdGlmeSBhbGwgZWRpdE1vZGVscyBvZiB0aGUgY2hhbmdlLgorCSAqLworCXB1YmxpYyB2b2lkIGFkZGVkUmVzb3VyY2UoUmVzb3VyY2UgYWRkZWRSZXNvdXJjZSkgeworCQlpZiAoZGVmYXVsdFRvTU9GNUNvbXBhdGliaWxpdHkgJiYgKGFkZGVkUmVzb3VyY2UgIT0gbnVsbCkgJiYgKGFkZGVkUmVzb3VyY2UgaW5zdGFuY2VvZiBDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UpKQorCQkJKChDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UpIGFkZGVkUmVzb3VyY2UpLnNldEZvcm1hdChDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UuRk9STUFUX01PRjUpOworCQlpZiAoc2hvdWxkTm90aWZ5RWRpdE1vZGVscygpKSB7CisJCQlFZGl0TW9kZWxFdmVudCBldmVudCA9IG5ldyBFZGl0TW9kZWxFdmVudChFZGl0TW9kZWxFdmVudC5BRERFRF9SRVNPVVJDRSwgbnVsbCk7CisJCQlldmVudC5hZGRSZXNvdXJjZShhZGRlZFJlc291cmNlKTsKKwkJCW5vdGlmeUVkaXRNb2RlbHMoZXZlbnQpOworCQl9CisJfQorCisJLyoqCisJICogTm90aWZ5IGFsbCBlZGl0TW9kZWxzIG9mIHRoZSBjaGFuZ2UuCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlZFJlc291cmNlKFJlc291cmNlIHJlbW92ZWRSZXNvdXJjZSkgeworCQlpZiAoc2hvdWxkTm90aWZ5RWRpdE1vZGVscygpKSB7CisJCQlFZGl0TW9kZWxFdmVudCBldmVudCA9IG5ldyBFZGl0TW9kZWxFdmVudChFZGl0TW9kZWxFdmVudC5SRU1PVkVEX1JFU09VUkNFLCBudWxsKTsKKwkJCWV2ZW50LmFkZFJlc291cmNlKHJlbW92ZWRSZXNvdXJjZSk7CisJCQlub3RpZnlFZGl0TW9kZWxzKGV2ZW50KTsKKwkJfQorCX0KKworCS8qKgorCSAqIE5vdGlmeSBhbGwgZWRpdE1vZGVscyBvZiB0aGUgY2hhbmdlLgorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZWRSZXNvdXJjZXMoTGlzdCByZW1vdmVkUmVzb3VyY2VzKSB7CisJCWlmIChzaG91bGROb3RpZnlFZGl0TW9kZWxzKCkpIHsKKwkJCUVkaXRNb2RlbEV2ZW50IGV2ZW50ID0gbmV3IEVkaXRNb2RlbEV2ZW50KEVkaXRNb2RlbEV2ZW50LlJFTU9WRURfUkVTT1VSQ0UsIG51bGwpOworCQkJZXZlbnQuYWRkUmVzb3VyY2VzKHJlbW92ZWRSZXNvdXJjZXMpOworCQkJbm90aWZ5RWRpdE1vZGVscyhldmVudCk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzdGFydExpc3RlbmluZ1RvUmVzb3VyY2VTZXQoKSB7CisJCVJlc291cmNlU2V0IHNldCA9IGdldFJlc291cmNlU2V0KCk7CisJCWlmIChzZXQgIT0gbnVsbCkKKwkJCXNldC5lQWRhcHRlcnMoKS5hZGQoZ2V0UmVzb3VyY2VTZXRMaXN0ZW5lcigpKTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLklTeW5jaHJvbml6ZXJFeHRlbmRlciNwcm9qZWN0Q2hhbmdlZChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBwcm9qZWN0Q2hhbmdlZChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgeworCQkvLyBkZWZhdWx0IG5vdGhpbmcKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLklTeW5jaHJvbml6ZXJFeHRlbmRlciNwcm9qZWN0Q2xvc2VkKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBwcm9qZWN0Q2xvc2VkKCkgeworCQlkaXNjYXJkQWxsRWRpdE1vZGVscygpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dEJhc2UjY3JlYXRlVVJJQ29udmVydGVyKG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLlByb2plY3RSZXNvdXJjZVNldCkKKwkgKi8KKwlwcm90ZWN0ZWQgV29ya2JlbmNoVVJJQ29udmVydGVyIGNyZWF0ZVVSSUNvbnZlcnRlcihQcm9qZWN0UmVzb3VyY2VTZXQgYVJlc291cmNlU2V0KSB7CisJCXJldHVybiBuZXcgQ29tcGF0aWJpbGl0eVdvcmtiZW5jaFVSSUNvbnZlcnRlckltcGwoZ2V0UHJvamVjdCgpLCBhUmVzb3VyY2VTZXQuZ2V0U3luY2hyb25pemVyKCkpOworCX0KKworCXByb3RlY3RlZCBQcm9qZWN0UmVzb3VyY2VTZXQgY3JlYXRlUmVzb3VyY2VTZXQoKSB7CisJCWlmIChwcm9qZWN0ID09IG51bGwpCisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJBdHRlbXB0IHRvIGNyZWF0ZSByZXNvdXJjZSBzZXQgd2l0aCBudWxsIHByb2plY3QiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gbmV3IFByb2plY3RSZXNvdXJjZVNldEVkaXRJbXBsKHByb2plY3QpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dEJhc2UjZGVsZXRlRmlsZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UpCisJICovCisJcHVibGljIHZvaWQgZGVsZXRlRmlsZShSZXNvdXJjZSByZXNvdXJjZSkgeworCQl0cnkgeworCQkJV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZGVsZXRlUmVzb3VyY2UocmVzb3VyY2UpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7CisJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOworCQl9CisKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRlZmF1bHRUb01PRjVDb21wYXRpYmlsaXR5LgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFRvTU9GNUNvbXBhdGliaWxpdHkoKSB7CisJCXJldHVybiBkZWZhdWx0VG9NT0Y1Q29tcGF0aWJpbGl0eTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gZGVmYXVsdFRvTU9GNUNvbXBhdGliaWxpdHkKKwkgKiAgICAgICAgICAgIFRoZSBkZWZhdWx0VG9NT0Y1Q29tcGF0aWJpbGl0eSB0byBzZXQuCisJICovCisJcHVibGljIHZvaWQgc2V0RGVmYXVsdFRvTU9GNUNvbXBhdGliaWxpdHkoYm9vbGVhbiBkZWZhdWx0VG9NT0Y1Q29tcGF0aWJpbGl0eSkgeworCQl0aGlzLmRlZmF1bHRUb01PRjVDb21wYXRpYmlsaXR5ID0gZGVmYXVsdFRvTU9GNUNvbXBhdGliaWxpdHk7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9FTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9FTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJkMTA3MwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL0VNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIENyZWF0ZWQgb24gTWF5IDI1LCAyMDA0CisgKgorICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCisgKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CisKKy8qKgorICogQGF1dGhvciB2aWpheWIKKyAqIAorICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0KKyAqIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcworICovCitwdWJsaWMgY2xhc3MgRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlciBleHRlbmRzIE5MUyB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImVtZndvcmtiZW5jaGVkaXQiOy8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlcigpIHsKKwkJLy8gRG8gbm90IGluc3RhbnRpYXRlCisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xpZW50QWNjZXNzUmVnaXN0cnlFeGNlcHRpb25fVUlfMTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbl9VSV8wOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNuYXBzaG90X0VSUk9SXzA7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdE1vZGVsUmVnaXN0cnlfRVJST1JfMjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0TW9kZWxSZWdpc3RyeV9FUlJPUl8xOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRNb2RlbFJlZ2lzdHJ5X0VSUk9SXzA7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yX0VSUk9SXzE7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yX0VSUk9SXzA7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRHluYW1pY0FkYXB0ZXJGYWN0b3J5X0VSUk9SXzA7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xpZW50QWNjZXNzUmVnaXN0cnlfRVJST1JfMTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGllbnRBY2Nlc3NSZWdpc3RyeV9FUlJPUl8wOworCisJc3RhdGljIHsKKwkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlci5jbGFzcyk7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKKwkJcmV0dXJuIE5MUy5iaW5kKGtleSwgYXJncyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvRWRpdE1vZGVsTGVhc3RVc2VkQ2FjaGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL0VkaXRNb2RlbExlYXN0VXNlZENhY2hlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQwMWNiNwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL0VkaXRNb2RlbExlYXN0VXNlZENhY2hlLmphdmEKQEAgLTAsMCArMSwxMjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbDsKKworLyoqCisgKiBUaGlzIGNsYXNzIHdpbGwgYmUgdXNlZCB0byBjYWNoZSB0aGUgcmVjZW50bHkgdXNlZCBlZGl0IG1vZGVscy4gIExvYWRpbmcgYW5kIHVubG9hZGluZyBvZiBlZGl0IG1vZGVscyBjYW4gYmUKKyAqIGNvc3RseSwgZXNwZWNpYWxseSBpZiBvcGVyYXRpb25zIGFuZC9vciBwb3N0IG9wZXJhdGlvbnMgaGF2ZSBhIG5lZWQgdG8gcmVsb2FkIHRoZSBzYW1lIGVkaXQgbW9kZWwgcmVwZWF0ZWRseS4KKyAqIFRoaXMgd2lsbCBhbGxvdyB0aG9zZSByZXBlYXRlZGx5IHVzZWQgZWRpdCBtb2RlbHMgdG8gYmUgY2FjaGVkLCB0aGVyZWJ5IGltcHJvdmluZyBwZXJmb3JtYW5jZS4gIEJ5IGRlc2lnbiwgdGhlCisgKiBlZGl0IG1vZGVscyBsb2FkIHJlc291cmNlcyBhbmQgdGhlc2UgcmVzb3VyY2VzIGFyZSBzdG9yZWQgaW4gbWVtb3J5LCBzbyB3ZSBkb24ndCB3YW50IHRvIGNhY2hlIGV2ZXJ5IGVkaXQKKyAqIG1vZGVsIGFjY2Vzc2VkLCBzbyB0aGlzIGlzIGEgbGVhc3QgdXNlZCBjYWNoZSBtZWNoYW5pc20sIHdoZXJlIHRoZSBtYXggc2l6ZSBpcyAxMC4gIElmIGFuIGVkaXQgbW9kZWwgaXMgdXNlZAorICogaXQgaXMgcHV0IHRvIHRoZSBiYWNrIG9mIHRoZSBzdGFjaywgYW5kIG5ldyBlZGl0IG1vZGVscyBhY2Nlc3NlZCBhcmUgcHV0IHRvIHRoZSBiYWNrIG9mIHRoZSBzdGFjaywgc28gdGhhdCB0aGUKKyAqIHRvcCBvZiB0aGUgc3RhY2sgaXMgdGhlIGZpcnN0IGVkaXQgbW9kZWwgZGlzcG9zZWQgd2hlbiB0aGUgY2FjaGUgaXMgaGlnaGVyIHRoYW4gdGhlIHRocmVzaGhvbGQuCisgKgorICovCitwdWJsaWMgY2xhc3MgRWRpdE1vZGVsTGVhc3RVc2VkQ2FjaGUgeworCQorCS8qKgorCSAqIFByb3ZpZGUgYSBzaW5nbGV0b24gaW5zdGFuY2UuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgRWRpdE1vZGVsTGVhc3RVc2VkQ2FjaGUgSU5TVEFOQ0UgPSBuZXcgRWRpdE1vZGVsTGVhc3RVc2VkQ2FjaGUoKTsJCisJCisJLyoqCisJICogVGhlIHRocmVzaG9sZCwgb3IgbW9zdCBlZGl0IG1vZGVscyB3ZSB3aWxsIGtlZXAgb3BlbiBhdCBhIHRpbWUgaXMgMTAuICBUaGlzIGlzIGxvdyBlbm91Z2ggdG8gbm90CisJICogb3ZlcndoZWxtIHdvcmtiZW5jaCBtZW1vcnkgYW5kIGhpZ2ggZW5vdWdoIHRvIGFpZCBpbiBvcGVyYXRpb25zIHdoaWNoIGNvbnRpbnVhbGx5IHJlbG9hZCAzLTQgCisJICogZWRpdCBtb2RlbHMuCisJICovCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IHRocmVzaGhvbGQgPSAxMDsKKwkKKwkvKioKKwkgKiAgQSBMSFMgaXMgcmVxdWlyZWQgdG8gZW5zdXJlIHRoZSBvcmRlciBvZiB0aGUgaXRlbXMgaXMgbWFpbnRhaW5lZC4gT3RoZXIKKwkgKiBTZXQgaW1wbGVtZW50YXRpb25zIChIYXNoU2V0LCBUcmVlU2V0KSBkbyBub3QgcHJlc2VydmUgdGhlIG9yZGVyLiBUaGlzIAorCSAqIGlzIGNyaXRpY2FsIHRvIHRoZSBpbXBsZW1lbnRhdGlvbi4gRE8gTk9UIENIQU5HRSBUSElTLiAKKwkgKi8KKwlwcml2YXRlIExpbmtlZEhhc2hTZXQgbHJ1ID0gbmV3IExpbmtlZEhhc2hTZXQodGhyZXNoaG9sZCk7CisJCisJLyoqCisJICogQWNjZXNzb3IgZm9yIHRoZSBFZGl0TW9kZWxMZWFzdFVzZWRDYWNoZSBJTlNUQU5DRQorCSAqIAorCSAqIEByZXR1cm4gdGhlIEVkaXRNb2RlbExlYXN0VXNlZENhY2hlIElOU1RBTkNFCisJICovCisJcHVibGljIHN0YXRpYyBFZGl0TW9kZWxMZWFzdFVzZWRDYWNoZSBnZXRJbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwkvKioKKwkgKiBSZW1vdmUgdGhlIGFsbCBlbGVtZW50cyBmcm9tIHRoZSBscnUgdGhhdCBhcmUgY29udGFpbmVkCisJICogaW4gPGNvZGU+YUNvbGxlY3Rpb248L2NvZGU+LiAgVGhpcyBtZXRob2QgYXNzdW1lcyB0aGUKKwkgKiBFZGl0TW9kZWxzIGluIHRoZSBhQ29sbGVjdGlvbiB3aWxsIGJlIGRpc2NhcmRlZCBhbmQgaXQKKwkgKiB3aWxsIG5vdCBhdHRlbXB0IHRvIGRlY3JlbWVtdCBpdHMgcmVmZXJlbmNlIGNvdW50LgorCSAqIEBwYXJhbSBhQ29sbGVjdGlvbiAtIEEge0BsaW5rIENvbGxlY3Rpb259IG9mIHtAbGluayBFZGl0TW9kZWx9LgorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZUFsbENhY2hlZChDb2xsZWN0aW9uIGFDb2xsZWN0aW9uKSB7CisJCWlmIChhQ29sbGVjdGlvbiAhPSBudWxsKSB7IAorCQkJbHJ1LnJlbW92ZUFsbChhQ29sbGVjdGlvbik7CisJCX0KKwl9CisKKwkvKioKKwkgKiBBbiB7QGxpbmsgRWRpdE1vZGVsfSBpcyBiZWluZyBhY2Nlc3NlZCBzbyB3ZSB3aWxsIHdhbnQKKwkgKiB0byB1cGRhdGUgdGhlIGxydSBhbmQgYWNjZXNzIHRoZSBlZGl0TW9kZWwgd2hpY2ggd2lsbCBob2xkCisJICogYSByZWZlcmVuY2UgY291bnQuCisJICogQHBhcmFtIGVkaXRNb2RlbCAtIFRoZSB7QGxpbmsgRWRpdE1vZGVsfSB0aGF0IHdlIHdhbnQgdG8gcGxhY2UKKwkgKiAJaW4gdGhlIGxlYXN0IHVzZWQgY2FjaGUuCisJICovCisJcHVibGljIHZvaWQgYWNjZXNzKEVkaXRNb2RlbCBlZGl0TW9kZWwpIHsKKwkJYm9vbGVhbiBzaG91bGRBY2Nlc3MgPSB0cnVlOworCQlzeW5jaHJvbml6ZWQgKGxydSkgeworCQkJaWYgKGxydS5jb250YWlucyhlZGl0TW9kZWwpKSB7CisJCQkJbW92ZVRvRW5kKGVkaXRNb2RlbCk7CisJCQkJc2hvdWxkQWNjZXNzID0gZmFsc2U7CisJCQl9CisJCX0KKwkJaWYgKHNob3VsZEFjY2VzcykgeworCQkJZWRpdE1vZGVsLmFjY2Vzcyh0aGlzKTsKKwkJCXN5bmNocm9uaXplZCAobHJ1KSB7CisJCQkJbHJ1LmFkZChlZGl0TW9kZWwpOworCQkJfQorCQl9CisJfQorCQorCS8qKgorCSAqIElmIHdlIGhpdCB0aGUgY2FwYWNpdHkgb2YgdGhlIGxydSB0aGVuIHJlbW92ZSB0aGUgZmlyc3Qgb25lCisJICogYW5kIHJlbGVhc2UgYWNjZXNzLgorCSAqLworCXB1YmxpYyB2b2lkIG9wdGltaXplTFJVU2l6ZUlmTmVjZXNzYXJ5KCkgeworCQlFZGl0TW9kZWwgbW9kZWwgPSBudWxsOworCQkKKwkJc3luY2hyb25pemVkIChscnUpIHsKKwkJCWlmIChscnUuc2l6ZSgpID4gdGhyZXNoaG9sZCkgeworCQkJCS8vIHJlbW92ZSBvbGRlc3QgZWxlbWVudCBhbmQgcmVsZWFzZSB0aGUgZWRpdCBtb2RlbC4KKwkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGxydS5pdGVyYXRvcigpOworCQkJCW1vZGVsID0gKEVkaXRNb2RlbCkgaXRlcmF0b3IubmV4dCgpOworCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7CisJCQkJCWxydS5yZW1vdmUobW9kZWwpOwkKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKG1vZGVsICE9IG51bGwpCisJCQltb2RlbC5yZWxlYXNlQWNjZXNzKHRoaXMpOworCX0KKworCS8qKgorCSAqIE1vdmUgdGhlIGVkaXRNb2RlbCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IAorCSAqIEBwYXJhbSBlZGl0TW9kZWwgLS0gRWRpdE1vZGVsIHRvIGJlIG1vdmVkCisJICovCisJcHJpdmF0ZSB2b2lkIG1vdmVUb0VuZChFZGl0TW9kZWwgZWRpdE1vZGVsKSB7CisJCWxydS5yZW1vdmUoZWRpdE1vZGVsKTsKKwkJbHJ1LmFkZChlZGl0TW9kZWwpOworCX0JCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9FbWZQYWNrYWdlUHJvcGVydHlUZXN0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL0VtZlBhY2thZ2VQcm9wZXJ0eVRlc3Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NTk0MDIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9FbWZQYWNrYWdlUHJvcGVydHlUZXN0ZXIuamF2YQpAQCAtMCwwICsxLDI3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2g7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLlByb3BlcnR5VGVzdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworCitwdWJsaWMgY2xhc3MgRW1mUGFja2FnZVByb3BlcnR5VGVzdGVyIGV4dGVuZHMgUHJvcGVydHlUZXN0ZXIgeworCisJcHVibGljIGJvb2xlYW4gdGVzdChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0W10gYXJncywgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHsKKwkJaWYgKHJlY2VpdmVyID09IG51bGwgfHwgIShyZWNlaXZlciBpbnN0YW5jZW9mIEVPYmplY3QpIHx8IGV4cGVjdGVkVmFsdWUgPT0gbnVsbCB8fCAhKGV4cGVjdGVkVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpKQorCQkJcmV0dXJuIGZhbHNlOworCQkKKwkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIHJlY2VpdmVyOworCQlTdHJpbmcgZW1mUGFja2FnZSA9IChTdHJpbmcpZXhwZWN0ZWRWYWx1ZTsKKwkJcmV0dXJuIGVtZlBhY2thZ2UuZXF1YWxzKGVPYmplY3QuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKS5nZXROc1VSSSgpKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL0VtZlZhbGlkYXRpb25IYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9FbWZWYWxpZGF0aW9uSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZjQyYzcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9FbWZWYWxpZGF0aW9uSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuSVZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyOworCisKKy8qKgorICogRW1mIHZhbGlkYXRpb24gZXh0ZW5zaW9uIGZvciB2YWxhZGl0ZW1lbnVhY3Rpb24KKyAqLworcHVibGljIGNsYXNzIEVtZlZhbGlkYXRpb25IYW5kbGVyIGltcGxlbWVudHMgSVZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyIHsKKworCXByaXZhdGUgU3RyaW5nIHZhbGlkYXRpb25UeXBlID0gbnVsbDsKKwkKKwkvKioKKwkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCisJICovCisJcHVibGljIEVtZlZhbGlkYXRpb25IYW5kbGVyKCkgeworCQlzdXBlcigpOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5JVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIjZ2V0QmFzZVZhbGlkYXRpb25UeXBlKGphdmEubGFuZy5PYmplY3QpCisJICovCisJcHVibGljIElSZXNvdXJjZSBnZXRCYXNlVmFsaWRhdGlvblR5cGUoT2JqZWN0IHNlbGVjdGlvbikgeworCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgRU9iamVjdCkgeworCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIHNlbGVjdGlvbjsKKwkJCVJlc291cmNlIHJlc291cmNlID0gZU9iamVjdC5lUmVzb3VyY2UoKTsKKwkJCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocmVzb3VyY2UpOworCQkJcmV0dXJuIHByb2plY3Q7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLklWYWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlciNnZXRWYWxpZGF0aW9uVHlwZVN0cmluZygpCisJICovCisJcHVibGljIFN0cmluZyBnZXRWYWxpZGF0aW9uVHlwZVN0cmluZygpIHsKKwkJcmV0dXJuIHZhbGlkYXRpb25UeXBlOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5JVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIjc2V0VmFsaWRhdGlvblR5cGVTdHJpbmcoamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uVHlwZVN0cmluZyhTdHJpbmcgdmFsaWRhdGlvblR5cGUpIHsKKwkJdGhpcy52YWxpZGF0aW9uVHlwZSA9IHZhbGlkYXRpb25UeXBlOworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL1Bhc3N0aHJ1UmVzb3VyY2VTZXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL1Bhc3N0aHJ1UmVzb3VyY2VTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWIzNmVhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvUGFzc3RocnVSZXNvdXJjZVNldC5qYXZhCkBAIC0wLDAgKzEsMTQ0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaDsKKworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXRJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlOworCisvKioKKyAqIFRoaXMgUmVzb3VyY2VTZXQgaXMgdG8gYmUgdXNlZCBieSBwbHVnaW5zIHRoYXQgYXJlIGN1cnJlbnRseSBsb2FkaW5nIHRvIGEgY2FjaGVkIFJlc291cmNlU2V0IHRoYXQKKyAqIGFsd2F5cyBsb2FkcyByZWxhdGl2ZSB0byB0aGUgV29ya2JlbmNoLiBUaGlzIFJlc291cmNlU2V0IHdpbGwgZGlyZWN0IHRoZSBsb2FkcyB0byB0aGUgYXBwcm9wcmlhdGUKKyAqIFByb2plY3QgUmVzb3VyY2VTZXQuIEl0IHdpbGwgb25seSBsb2FkIGluIHRoaXMgUmVzb3VyY2VTZXQgaWYgaXQgd2FzIHVuYWJsZSB0byBsb2FkIHZpYSB0aGUKKyAqIFdvcmtzcGFjZS4KKyAqIAorICogSWYgeW91IHNldCB3YW50IHRvIHVzZWQgdGhpcyBSZXNvdXJjZVNldCBzbyB0aGF0IHRoZSBsb2FkZWQgcmVzb3VyY2VzIGFyZSBpc29sYXRlZCBmcm9tIGV2ZXJ5b25lCisgKiBlbHNlLCB5b3Ugc2hvdWxkIHVzZSB0aGUKKyAqIAorICogQGxpbmsgUGFzc3RocnVSZXNvdXJjZVNldChJUHJvamVjdCkgY29uc3RydWN0b3IuIFRoaXMgd2lsbCBsb2FkIGFsbCByZXNvdXJjZXMgbG9jYWxseSBhbmQgaXQgd2lsbAorICogICAgICAgbm90IGRlbGVnYXRlIHRvIGFub3RoZXIgUHJvamVjdFJlc291cmNlU2V0LiBUaGlzIHdvdWxkIGJlIGVxdWl2YWxlbnQgdG8gY3JlYXRpbmcgYQorICogICAgICAgUHJvamVjdFJlc291cmNlU2V0IHdpdGhvdXQgc2V0dGluZyBhbnkgaGFuZGxlcnMuCisgKiAgCisgKi8KK3B1YmxpYyBjbGFzcyBQYXNzdGhydVJlc291cmNlU2V0IGV4dGVuZHMgUHJvamVjdFJlc291cmNlU2V0SW1wbCB7CisJcHJvdGVjdGVkIGJvb2xlYW4gaXNJc29sYXRlZCA9IGZhbHNlOworCisJcHVibGljIGNsYXNzIFBhc3N0aHJ1UmVzb3VyY2VzRUxpc3QgZXh0ZW5kcyBSZXNvdXJjZVNldEltcGwuUmVzb3VyY2VzRUxpc3QgeworCQlwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IG9iamVjdCkgeworCQkJaWYgKG9iamVjdCA9PSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKwkJCVJlc291cmNlU2V0IHNldCA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRSZXNvdXJjZVNldCgoKFJlc291cmNlKSBvYmplY3QpLmdldFVSSSgpKTsKKwkJCWlmIChzZXQgIT0gbnVsbCkKKwkJCQlyZXR1cm4gc2V0LmdldFJlc291cmNlcygpLmFkZCgoUmVzb3VyY2Upb2JqZWN0KTsKKworCQkJcmV0dXJuIHN1cGVyLmFkZChvYmplY3QpOworCQl9CisKKworCQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7CisJCQlpZiAoY29sbGVjdGlvbi5pc0VtcHR5KCkpCisJCQkJcmV0dXJuIGZhbHNlOworCQkJSXRlcmF0b3IgaXQgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7CisJCQlSZXNvdXJjZSByZXM7CisJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisJCQkJcmVzID0gKFJlc291cmNlKSBpdC5uZXh0KCk7CisJCQkJaWYgKCFXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuY2FjaGVSZXNvdXJjZShyZXMpKQorCQkJCQlzdXBlci5hZGQocmVzKTsKKwkJCX0KKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCisJcHVibGljIFBhc3N0aHJ1UmVzb3VyY2VTZXQoKSB7CisJCWlzSXNvbGF0ZWQgPSBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIGNvbnN0cnVjdG9yIHNob3VsZCBvbmx5IGJlIHVzZWQgaWYgeW91IHdhbnQgdG8gdXNlIHRoaXMgUmVzb3VyY2VTZXQgaXNvbGF0ZWQgZnJvbSB0aGUKKwkgKiBhY3R1YWwgY2FjaGVkIFByb2plY3RSZXNvdXJjU2V0IGZvciB0aGUgcGFzc2VkIElQcm9qZWN0LgorCSAqLworCXB1YmxpYyBQYXNzdGhydVJlc291cmNlU2V0KElQcm9qZWN0IHByb2plY3QpIHsKKwkJc2V0UHJvamVjdChwcm9qZWN0KTsKKwkJaXNJc29sYXRlZCA9IHRydWU7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNJc29sYXRlZCgpIHsKKwkJcmV0dXJuIGlzSXNvbGF0ZWQ7CisJfQorCisJcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKKwkJUmVzb3VyY2UgcmVzdWx0ID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldEV4aXN0aW5nT3JDcmVhdGVSZXNvdXJjZSh1cmkpOworCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQlyZXR1cm4gc3VwZXIuY3JlYXRlUmVzb3VyY2UodXJpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbCNkZW1hbmRDcmVhdGVSZXNvdXJjZShVUkkpCisJICovCisJcHJvdGVjdGVkIFJlc291cmNlIGRlbWFuZENyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKKwkJUmVzb3VyY2UgcmVzdWx0ID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmNyZWF0ZVJlc291cmNlKHVyaSk7CisJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCXJldHVybiBzdXBlci5jcmVhdGVSZXNvdXJjZSh1cmkpOyAvL1dlIGRvIHdhbnQgdG8gY2FsbCBzdXBlci5jcmVhdGVSZXNvdXJjZSBhbmQgbm90CisJCS8vIGRlbWFuZENyZWF0ZVJlc291cmNlCisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoKKwkgKiBKYXZhZG9jIGNvcGllZCBmcm9tIGludGVyZmFjZS4KKwkgKi8KKwlwdWJsaWMgRUxpc3QgZ2V0UmVzb3VyY2VzKCkgeworCQlpZiAoaXNJc29sYXRlZCkKKwkJCXJldHVybiBzdXBlci5nZXRSZXNvdXJjZXMoKTsKKwkJaWYgKHJlc291cmNlcyA9PSBudWxsKSB7CisJCQlyZXNvdXJjZXMgPSBuZXcgUGFzc3RocnVSZXNvdXJjZXNFTGlzdCgpOworCQl9CisJCXJldHVybiByZXNvdXJjZXM7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RSZXNvdXJjZVNldEltcGwjY3JlYXRlUmVzb3VyY2VGcm9tSGFuZGxlcnMoVVJJKQorCSAqLworCXByb3RlY3RlZCBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZUZyb21IYW5kbGVycyhVUkkgdXJpKSB7CisJCWlmICghaXNJc29sYXRlZCkKKwkJCXJldHVybiBzdXBlci5jcmVhdGVSZXNvdXJjZUZyb21IYW5kbGVycyh1cmkpOworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFJlc291cmNlU2V0SW1wbCNnZXRSZXNvdXJjZUZyb21IYW5kbGVycyhVUkkpCisJICovCisJcHJvdGVjdGVkIFJlc291cmNlIGdldFJlc291cmNlRnJvbUhhbmRsZXJzKFVSSSB1cmkpIHsKKwkJaWYgKCFpc0lzb2xhdGVkKQorCQkJcmV0dXJuIHN1cGVyLmdldFJlc291cmNlRnJvbUhhbmRsZXJzKHVyaSk7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXRJbXBsI2dldEVPYmplY3RGcm9tSGFuZGxlcnMoVVJJLCBib29sZWFuKQorCSAqLworCXByb3RlY3RlZCBFT2JqZWN0IGdldEVPYmplY3RGcm9tSGFuZGxlcnMoVVJJIHVyaSwgYm9vbGVhbiBsb2FkT25EZW1hbmQpIHsKKwkJaWYgKCFpc0lzb2xhdGVkKQorCQkJcmV0dXJuIHN1cGVyLmdldEVPYmplY3RGcm9tSGFuZGxlcnModXJpLCBsb2FkT25EZW1hbmQpOworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL1dvcmtiZW5jaFJlc291cmNlSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOTY5ODQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5qYXZhCkBAIC0wLDAgKzEsNTMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIENyZWF0ZWQgb24gTWFyIDMsIDIwMDQKKyAqCisgKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCisgKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaDsKKworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklMb2NrOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoVVJJQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVmZXJlbmNlZFJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlZmVyZW5jZWRYTUlGYWN0b3J5SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRXh0ZW5kZWRFY29yZVV0aWw7CisKKy8qKgorICogQGF1dGhvciBzY2hhY2hlcgorICogCisgKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KKyAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cworICovCitwdWJsaWMgY2xhc3MgV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIgZXh0ZW5kcyBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UgeworCXByb3RlY3RlZCBzdGF0aWMgQ2xhc3MgUkVGRVJFTkNFRF9SRVNfQ0xBU1MgPSBSZWZlcmVuY2VkUmVzb3VyY2UuY2xhc3M7CisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBmaWxlQWRhcHRlckZhY3RvcnlJbml0aWFsaXplZCA9IGZhbHNlOworCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmlsZUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKKworCQlwdWJsaWMgQWRhcHRlciBhZGFwdE5ldyhOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKSB7CisJCQlGaWxlQWRhcHRlciBhZGFwdGVyID0gbmV3IEZpbGVBZGFwdGVyKCk7CisJCQlhZGFwdGVyLnNldFRhcmdldCh0YXJnZXQpOworCQkJcmV0dXJuIGFkYXB0ZXI7CisJCX0KKworCX0KKworCS8qKgorCSAqIFRoaXMgY2xhc3MgaXMgaW50ZXJuYWwgYW5kIGlzIHVzZWQgdG8gc3RvcmUgc3RhdGUgb24gdGhlIHJlc291cmNlLCBzcGVjaWZpY2FsbHksIGEgY2FjaGVkCisJICogcmVmZXJlbmNlIHRvIHRoZSBJRmlsZQorCSAqLworCXByaXZhdGUgc3RhdGljIGNsYXNzIEZpbGVBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgeworCQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBBREFQVEVSX0tFWSA9IEZpbGVBZGFwdGVyLmNsYXNzLmdldE5hbWUoKTsKKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBkZWxheSA9IDMwOworCQlwcml2YXRlIElGaWxlIGZpbGU7CisJCXByaXZhdGUgbG9uZyBzeW5jaHJvbml6YXRpb25TdGFtcDsKKwkJcHJvdGVjdGVkIFJlc291cmNlU2V0IHByZXZpb3VzUmVzb3VyY2VTZXQ7CisJCXByaXZhdGUgSUxvY2sgc2F2ZUxvY2s7CisJCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVfTk9UX0xPQURFRCA9IDA7CisJCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVfSU5BQ0NFU1NJQkxFID0gLTE7CisKKwkJcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgeworCQkJcmV0dXJuIEFEQVBURVJfS0VZLmVxdWFscyh0eXBlKTsKKwkJfQorCisJCS8qCisJCSAqIFVwZGF0ZSB0aGUgc3luY2hyb25pemF0aW9uIHN0YW1wIHdoZXJlIGFwcHJvcHJpYXRlCisJCSAqLworCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKKwkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChudWxsKSkgeworCQkJCWNhc2UgUmVzb3VyY2UuUkVTT1VSQ0VfX0lTX0xPQURFRCA6CisJCQkJCWlmIChnZXRSZXNvdXJjZSgpLmlzTG9hZGVkKCkpCisJCQkJCQloYW5kbGVMb2FkZWQoKTsKKwkJCQkJZWxzZQorCQkJCQkJaGFuZGxlVW5sb2FkZWQoKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBSZWZlcmVuY2VkUmVzb3VyY2UuUkVTT1VSQ0VfQUJPVVRfVE9fU0FWRToKKwkgICAgICAgICAgICAgICAgaGFuZGxlQWJvdXRUb1NhdmUoKTsKKwkgICAgICAgICAgICAgICAgYnJlYWs7CisJICAgICAgICAgICAgY2FzZSBSZWZlcmVuY2VkUmVzb3VyY2UuUkVTT1VSQ0VfV0FTX1NBVkVEOgorCSAgICAgICAgICAgICAgICBoYW5kbGVTYXZlZCgpOworCSAgICAgICAgICAgICAgICBicmVhazsKKwkgICAgICAgICAgICBjYXNlIFJlZmVyZW5jZWRSZXNvdXJjZS5SRVNPVVJDRV9TQVZFX0ZBSUxFRDoKKwkgICAgICAgICAgICAgICAgaGFuZGxlU2F2ZUZhaWxlZCgpOworCSAgICAgICAgICAgICAgICBicmVhazsKKwkJCQljYXNlIFJlc291cmNlLlJFU09VUkNFX19VUkkgOgorCQkJCQloYW5kbGVVUklDaGFuZ2VkKCk7CisJCQl9CisJCX0KKwkJCisJCXByaXZhdGUgdm9pZCBoYW5kbGVTYXZlRmFpbGVkKCkgeworICAgICAgICAgICAgcmVsZWFzZVNhdmVMb2NrKCk7CisKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVBYm91dFRvU2F2ZSgpIHsKKyAgICAgICAgICAgIGFxdWlyZVNhdmVMb2NrKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgYXF1aXJlU2F2ZUxvY2soKSB7CisvLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZU5hbWU6ICIgKyBnZXRGaWxlKCkuZ2V0TmFtZSgpICsgIiAiICtnZXRGaWxlKCkpOworLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImFxdWlyZWRTYXZlTG9jazogIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKy8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEZXB0aCIgKyBnZXRTYXZlTG9jaygpLmdldERlcHRoKCkpOworLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkluc3RhbmNlOiIrZ2V0U2F2ZUxvY2soKS5oYXNoQ29kZSgpKTsKKy8vICAgICAgICAgICAgbmV3IEV4Y2VwdGlvbigpLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKKyAgICAgICAgICAgIGdldFNhdmVMb2NrKCkuYWNxdWlyZSgpOworCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gYXF1aXJlU2F2ZUxvY2sobG9uZyBkZWxheSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKy8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGaWxlTmFtZTogIiArIGdldEZpbGUoKS5nZXROYW1lKCkgICsgIiAiICtnZXRGaWxlKCkpOworLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImFxdWlyZWRTYXZlTG9jayB3aXRoIGRlbGF5OiAiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOworLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRlcHRoIiArIGdldFNhdmVMb2NrKCkuZ2V0RGVwdGgoKSk7CisvLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSW5zdGFuY2U6IitnZXRTYXZlTG9jaygpLmhhc2hDb2RlKCkpOworLy8gICAgICAgICAgICBuZXcgRXhjZXB0aW9uKCkucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOworICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gZ2V0U2F2ZUxvY2soKS5hY3F1aXJlKGRlbGF5KTsKKworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHJlbGVhc2VTYXZlTG9jaygpIHsKKy8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGaWxlTmFtZTogIiArIGdldEZpbGUoKS5nZXROYW1lKCkgICsgIiAiICtnZXRGaWxlKCkpOworLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJlbGVhc2VkU2F2ZUxvY2s6ICIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7CisvLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGVwdGgiICsgZ2V0U2F2ZUxvY2soKS5nZXREZXB0aCgpKTsKKy8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJbnN0YW5jZToiK2dldFNhdmVMb2NrKCkuaGFzaENvZGUoKSk7CisvLyAgICAgICAgICAgIG5ldyBFeGNlcHRpb24oKS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7CisgICAgICAgICAgICBnZXRTYXZlTG9jaygpLnJlbGVhc2UoKTsKKworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBJTG9jayBnZXRTYXZlTG9jaygpIHsKKyAgICAgICAgICAgIGlmIChzYXZlTG9jayA9PSBudWxsKQorICAgICAgICAgICAgICAgIHNhdmVMb2NrID0gUGxhdGZvcm0uZ2V0Sm9iTWFuYWdlcigpLm5ld0xvY2soKTsKKyAgICAgICAgICAgIHJldHVybiBzYXZlTG9jazsKKyAgICAgICAgfQorCisJCS8qKgorCQkgKiAgCisJCSAqLworCQlwcml2YXRlIHZvaWQgaGFuZGxlVVJJQ2hhbmdlZCgpIHsKKwkJCWZpbGUgPSBudWxsOworCQkJc3luY2hyb25pemF0aW9uU3RhbXAgPSBGSUxFX05PVF9MT0FERUQ7CisJCX0KKworCQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKKwkJCS8vRmlyc3QgdGVzdCB0byBzZWUgaWYgd2Ugc2hvdWxkIHJlc2V0IHRoZSBmaWxlLgorCQkJaWYgKGZpbGUgIT0gbnVsbCAmJiAoIWZpbGUuaXNBY2Nlc3NpYmxlKCkgfHwgcHJldmlvdXNSZXNvdXJjZVNldCAhPSBnZXRSZXNvdXJjZVNldCgpKSkgeworCQkJCWZpbGUgPSBudWxsOworCQkJCXN5bmNocm9uaXphdGlvblN0YW1wID0gRklMRV9OT1RfTE9BREVEOworCQkJfQorCQkJaWYgKGZpbGUgPT0gbnVsbCkgeworCQkJCWlmIChpc1BsYXRmb3JtUmVzb3VyY2VVUkkoZ2V0VVJJKCkpKSB7CisJCQkJCWZpbGUgPSBnZXRQbGF0Zm9ybUZpbGUoZ2V0VVJJKCkpOworCQkJCX0gZWxzZSB7CisJCQkJCS8vd2Ugc2hvdWxkIG5vdCBiZSBoZXJlIGFueW1vcmUuCisJCQkJCWZpbGUgPSBpbnRlcm5hbEdldEZpbGUoZ2V0UmVzb3VyY2UoKSk7CisJCQkJfQorCQkJCWlmKG51bGwhPSBmaWxlICYmICFmaWxlLmlzQWNjZXNzaWJsZSgpKXsKKwkJCQkJc3luY2hyb25pemF0aW9uU3RhbXAgPSBGSUxFX0lOQUNDRVNTSUJMRTsKKwkJCQl9CisJCQkJcHJldmlvdXNSZXNvdXJjZVNldCA9IGdldFJlc291cmNlU2V0KCk7CisJCQl9CisJCQlyZXR1cm4gZmlsZTsKKwkJfQorCisJCS8qKgorCQkgKiBAcmV0dXJuCisJCSAqLworCQlwdWJsaWMgbG9uZyBnZXRTeW5jaHJvbml6YXRpb25TdGFtcCgpIHsKKwkJCXJldHVybiBzeW5jaHJvbml6YXRpb25TdGFtcDsKKwkJfQorCisJCS8qKgorCQkgKiBAcGFyYW0gZmlsZQorCQkgKi8KKwkJcHVibGljIHZvaWQgc2V0RmlsZShJRmlsZSBmaWxlKSB7CisJCQl0aGlzLmZpbGUgPSBmaWxlOworCQl9CisKKwkJLyoqCisJCSAqIEBwYXJhbSBsCisJCSAqLworCQlwdWJsaWMgdm9pZCBzZXRTeW5jaHJvbml6YXRpb25TdGFtcChsb25nIGwpIHsKKwkJCXN5bmNocm9uaXphdGlvblN0YW1wID0gbDsKKwkJfQorCisJCS8qKgorCQkgKiBAc2VlIFJlZmVyZW5jZWRSZXNvdXJjZSNpc0NvbnNpc3RlbnQoKQorCQkgKi8KKwkJcHVibGljIGJvb2xlYW4gaXNDb25zaXN0ZW50KCkgeworCQkJLy9UaGlzIGNoZWNrcyBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIHJlc291cmNlIGhhc24ndCBmaW5pc2hlZCBzYXZpbmcgZm8gdGhlIGZpcnN0IHRpbWUKKwkJCWlmKCFnZXRSZXNvdXJjZSgpLmlzTG9hZGVkKCkpCisJCQkJcmV0dXJuIHRydWU7CisgICAgICAgICAgICBib29sZWFuIGhhc0xvY2tlZCA9IGZhbHNlOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBoYXNMb2NrZWQgPSBhcXVpcmVTYXZlTG9jayhkZWxheSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigpLndyaXRlKGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKKyAgICAgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgICAgICBpZiAoZ2V0RmlsZSgpID09IG51bGwgfHwgIWdldEZpbGUoKS5pc0FjY2Vzc2libGUoKSkKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFnZXRGaWxlKCkuaXNTeW5jaHJvbml6ZWQoSUZpbGUuREVQVEhfWkVSTykpCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBzeW5jaHJvbml6YXRpb25TdGFtcCA9PSBjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoZ2V0RmlsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigpLndyaXRlKGUpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAoaGFzTG9ja2VkKQorICAgICAgICAgICAgICAgICAgICByZWxlYXNlU2F2ZUxvY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworCQlwdWJsaWMgdm9pZCBjYWNoZVN5bmNocm9uaXphdGlvblN0YW1wKCkgeworCQkJc2V0U3luY2hyb25pemF0aW9uU3RhbXAoY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGdldEZpbGUoKSkpOworCQl9CisKKwkJcHVibGljIFJlZmVyZW5jZWRSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKKwkJCXJldHVybiAoUmVmZXJlbmNlZFJlc291cmNlKSB0YXJnZXQ7CisJCX0KKworCQlwdWJsaWMgVVJJIGdldFVSSSgpIHsKKwkJCXJldHVybiB0YXJnZXQgPT0gbnVsbCA/IG51bGwgOiBnZXRSZXNvdXJjZSgpLmdldFVSSSgpOworCQl9CisKKwkJcHVibGljIFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KCkgeworCQkJcmV0dXJuIHRhcmdldCA9PSBudWxsID8gbnVsbCA6IGdldFJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIGhhbmRsZVVubG9hZGVkKCkgeworCQkJZmlsZSA9IG51bGw7CisJCQlzeW5jaHJvbml6YXRpb25TdGFtcCA9IEZJTEVfTk9UX0xPQURFRDsKKwkJfQorCisJCXB1YmxpYyB2b2lkIGhhbmRsZUxvYWRlZCgpIHsKKwkJCWNhY2hlU3luY2hyb25pemF0aW9uU3RhbXAoKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIGhhbmRsZVNhdmVkKCkgeworCQkJY2FjaGVTeW5jaHJvbml6YXRpb25TdGFtcCgpOworCQkJcmVsZWFzZVNhdmVMb2NrKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIGlzIGFuIGludGVybmFsIG1ldGhvZCB0byBiZSB1c2VkIGJ5IHRoZSBwbHVnaW4gb25seQorCSAqLworCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgaW5pdGlhbGl6ZUZpbGVBZGFwdGVyRmFjdG9yeSgpIHsKKwkJaWYgKCFmaWxlQWRhcHRlckZhY3RvcnlJbml0aWFsaXplZCkgeworCQkJUmVmZXJlbmNlZFhNSUZhY3RvcnlJbXBsLmFkZEdsb2JhbEFkYXB0ZXJGYWN0b3J5KG5ldyBGaWxlQWRhcHRlckZhY3RvcnkoKSk7CisJCQlmaWxlQWRhcHRlckZhY3RvcnlJbml0aWFsaXplZCA9IHRydWU7CisJCX0KKwl9CisKKworCXByaXZhdGUgc3RhdGljIEZpbGVBZGFwdGVyIGdldEZpbGVBZGFwdGVyKFJlZmVyZW5jZWRSZXNvdXJjZSByZXMpIHsKKwkJRmlsZUFkYXB0ZXIgYWRhcHRlciA9IChGaWxlQWRhcHRlcikgRWNvcmVVdGlsLmdldEV4aXN0aW5nQWRhcHRlcihyZXMsIEZpbGVBZGFwdGVyLkFEQVBURVJfS0VZKTsKKwkJcmV0dXJuIGFkYXB0ZXIgPT0gbnVsbCA/IGNyZWF0ZUZpbGVBZGFwdGVyKHJlcykgOiBhZGFwdGVyOworCX0KKworCXByaXZhdGUgc3RhdGljIEZpbGVBZGFwdGVyIGNyZWF0ZUZpbGVBZGFwdGVyKFJlZmVyZW5jZWRSZXNvdXJjZSByZXMpIHsKKwkJRmlsZUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBGaWxlQWRhcHRlcigpOworCQlhZGFwdGVyLnNldFRhcmdldChyZXMpOworCQlyZXMuZUFkYXB0ZXJzKCkuYWRkKGFkYXB0ZXIpOworCQlyZXR1cm4gYWRhcHRlcjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHVuZGVybHlpbmcgSUZpbGUgZm9yIHRoZSByZXNvdXJjZSBpZiBvbmUgZXhpc3RzLiBUaGlzIG1heSByZXR1cm4gbnVsbCBpZiB0aGUKKwkgKiByZXNvdXJjZSBkb2VzIG5vdCBiZWxvbmcgdG8gYSBQcm9qZWN0UmVzb3VyY2VTZXQuCisJICovCisJcHVibGljIHN0YXRpYyBJRmlsZSBnZXRGaWxlKFJlZmVyZW5jZWRSZXNvdXJjZSByZXMpIHsKKwkJRmlsZUFkYXB0ZXIgYWRhcHRlciA9IGdldEZpbGVBZGFwdGVyKHJlcyk7CisJCXJldHVybiBhZGFwdGVyID09IG51bGwgPyBudWxsIDogYWRhcHRlci5nZXRGaWxlKCk7CisJfQorCisJcHVibGljIHN0YXRpYyBsb25nIGdldFN5bmNocm9uaXphdGlvblN0YW1wKFJlZmVyZW5jZWRSZXNvdXJjZSByZXMpIHsKKwkJRmlsZUFkYXB0ZXIgYWRhcHRlciA9IGdldEZpbGVBZGFwdGVyKHJlcyk7CisJCXJldHVybiBhZGFwdGVyID09IG51bGwgPyBGaWxlQWRhcHRlci5GSUxFX05PVF9MT0FERUQgOiBhZGFwdGVyLmdldFN5bmNocm9uaXphdGlvblN0YW1wKCk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHNldFN5bmhyb25pemF0aW9uU3RhbXAoUmVmZXJlbmNlZFJlc291cmNlIHJlcywgbG9uZyBzdGFtcCkgeworCQlGaWxlQWRhcHRlciBhZGFwdGVyID0gZ2V0RmlsZUFkYXB0ZXIocmVzKTsKKwkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKKwkJCWFkYXB0ZXIuc2V0U3luY2hyb25pemF0aW9uU3RhbXAoc3RhbXApOworCX0KKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnNpc3RlbnQoUmVmZXJlbmNlZFJlc291cmNlIHJlcykgeworCQlGaWxlQWRhcHRlciBhZGFwdGVyID0gZ2V0RmlsZUFkYXB0ZXIocmVzKTsKKwkJcmV0dXJuIGFkYXB0ZXIgIT0gbnVsbCAmJiBhZGFwdGVyLmlzQ29uc2lzdGVudCgpOworCX0KKworCS8qKgorCSAqIE1ldGhvZCBjYWNoZVN5bmNocm9uaXphdGlvblN0YW1wLgorCSAqIAorCSAqIEBwYXJhbSByCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGNhY2hlU3luY2hyb25pemF0aW9uU3RhbXAoUmVmZXJlbmNlZFJlc291cmNlIHJlZlJlc291cmNlKSB7CisJCWlmIChyZWZSZXNvdXJjZSAhPSBudWxsKSB7CisJCQlGaWxlQWRhcHRlciBhZGFwdGVyID0gZ2V0RmlsZUFkYXB0ZXIocmVmUmVzb3VyY2UpOworCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCAmJiBhZGFwdGVyLmdldFN5bmNocm9uaXphdGlvblN0YW1wKCkgPD0gRmlsZUFkYXB0ZXIuRklMRV9OT1RfTE9BREVEKQorCQkJCWFkYXB0ZXIuc2V0U3luY2hyb25pemF0aW9uU3RhbXAoY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKHJlZlJlc291cmNlKSk7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWZlcmVuY2VkUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKSB7CisJCXJldHVybiBSRUZFUkVOQ0VEX1JFU19DTEFTUy5pc0luc3RhbmNlKGFSZXNvdXJjZSk7CisJfQorCisJcHVibGljIHN0YXRpYyBsb25nIGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChSZWZlcmVuY2VkUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkJRmlsZUFkYXB0ZXIgYWRhcHRlciA9IGdldEZpbGVBZGFwdGVyKHJlc291cmNlKTsKKwkJcmV0dXJuIGFkYXB0ZXIgPT0gbnVsbCA/IEZpbGVBZGFwdGVyLkZJTEVfTk9UX0xPQURFRCA6IGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChhZGFwdGVyLmdldEZpbGUoKSk7CisJfQorCisJcHVibGljIHN0YXRpYyBsb25nIGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChJRmlsZSBmaWxlKSB7CisJCWlmIChmaWxlID09IG51bGwpCisJCQlyZXR1cm4gRmlsZUFkYXB0ZXIuRklMRV9OT1RfTE9BREVEOworCQlpZighZmlsZS5pc0FjY2Vzc2libGUoKSl7CisJCQlyZXR1cm4gRmlsZUFkYXB0ZXIuRklMRV9JTkFDQ0VTU0lCTEU7CisJCX0KKwkJbG9uZyBjdXJyZW50U3RhbXAgPSBmaWxlLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7CisJCUlQYXRoIHBhdGggPSBmaWxlLmdldExvY2F0aW9uKCk7CisJCWlmIChwYXRoICE9IG51bGwpCisJCQlyZXR1cm4gcGF0aC50b0ZpbGUoKS5sYXN0TW9kaWZpZWQoKTsKKwkJcmV0dXJuIGN1cnJlbnRTdGFtcDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIElGaWxlIHRoYXQgY3VycmVudGx5IGNvcnJlc3BvbmRzIHRvIDxjb2RlPmFSZXNvdXJjZTwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyBJRmlsZSBnZXRGaWxlKFJlc291cmNlIGFSZXNvdXJjZSkgeworCQlpZiAoYVJlc291cmNlICE9IG51bGwpIHsKKwkJCWlmIChpc1JlZmVyZW5jZWRSZXNvdXJjZShhUmVzb3VyY2UpKQorCQkJCXJldHVybiBnZXRGaWxlKChSZWZlcmVuY2VkUmVzb3VyY2UpIGFSZXNvdXJjZSk7CisJCQlyZXR1cm4gaW50ZXJuYWxHZXRGaWxlKGFSZXNvdXJjZSk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIHN0YXRpYyBJRmlsZSBnZXRGaWxlKEVPYmplY3Qgb2JqKSB7CisJCWlmIChvYmogPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCisJCVJlc291cmNlIG1vZlJlc291cmNlID0gb2JqLmVSZXNvdXJjZSgpOworCQlpZiAobW9mUmVzb3VyY2UgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQlyZXR1cm4gZ2V0RmlsZShtb2ZSZXNvdXJjZSk7CisJfQorCisJLyoqCisJICogR2V0IG9yIGxvYWQgYSBjYWNoZWQgUmVzb3VyY2Ugb3IgY3JlYXRlIG9uZSBpZiBpdCBpcyBub3QgZm91bmQuIEEgV3JhcHBlZEV4Y2VwdGlvbiB3aWxsIG9ubHkKKwkgKiBiZSB0aHJvd24gaWYgdGhlIGNvcnJlc3BvbmRpbmcgZmlsZSBleGlzdHMgYnV0IGl0IGZhaWxlZCB0byBsb2FkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UgZ2V0T3JDcmVhdGVSZXNvdXJjZShVUkkgdXJpLCBSZXNvdXJjZVNldCBzZXQpIHRocm93cyBXcmFwcGVkRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBzZXQuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsgLy90aGlzIHdpbGwgY3JlYXRlIHRoZSByZXNvdXJjZSBubyBtYXR0ZXIgd2hhdAorCQl9IGNhdGNoIChXcmFwcGVkRXhjZXB0aW9uIGUpIHsKKwkJCWlmIChFeHRlbmRlZEVjb3JlVXRpbC5nZXRGaWxlTm90Rm91bmREZXRlY3RvcigpLmlzRmlsZU5vdEZvdW5kKGUpKQorCQkJCXJldHVybiBzZXQuZ2V0UmVzb3VyY2UodXJpLCBmYWxzZSk7CisJCQl0aHJvdyBlOworCQl9CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzU2FtZVByb2plY3QoUmVzb3VyY2UgcmVzb3VyY2VBLCBSZXNvdXJjZSByZXNvdXJjZUIpIHsKKwkJSVByb2plY3QgcEEsIHBCOworCQlwQSA9IGdldFByb2plY3QocmVzb3VyY2VBKTsKKwkJcEIgPSBnZXRQcm9qZWN0KHJlc291cmNlQik7CisJCWlmIChwQSAhPSBudWxsICYmIHBCICE9IG51bGwpCisJCQlyZXR1cm4gcEEuZXF1YWxzKHBCKTsKKwkJLy9vdGhlcndpc2Ugd2UgZG8gbm90IGhhdmUgZW5vdWdoIGluZm8gdG8gZGV0ZXJtaW5lIGZhbHNlIHNvIHdlIG11c3QgcmV0dXJuIHRydWUKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0KFJlc291cmNlIHJlcykgeworCQlJUHJvamVjdCBwcm9qID0gZ2V0UHJvamVjdChyZXMuZ2V0UmVzb3VyY2VTZXQoKSk7CisJCWlmIChwcm9qID09IG51bGwpIHsKKwkJCUlGaWxlIGZpbGUgPSBnZXRGaWxlKHJlcyk7CisJCQlpZiAoZmlsZSAhPSBudWxsKQorCQkJCXByb2ogPSBmaWxlLmdldFByb2plY3QoKTsKKwkJfQorCQlyZXR1cm4gcHJvajsKKwl9CisKKwkvKgorCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGJ5IGNsaWVudHMuIEl0IGlzIHVzZWQgaW50ZXJuYWxseSBieSBjbGllbnRzIHRoYXQgYWxzbyBjYWxsCisJICogZ2V0RmlsZSguLi4pLiBUaGlzIGlzIHRvIGF2b2lkIGVuZGxlc3MgbG9vcHMuCisJICogCisJICogQHNlZSBnZXRGaWxlKFJlc291cmNlKQorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgSUZpbGUgaW50ZXJuYWxHZXRGaWxlKFJlc291cmNlIGFSZXNvdXJjZSkgeworCQlpZiAoYVJlc291cmNlICE9IG51bGwpCisJCQlyZXR1cm4gZ2V0RmlsZShhUmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSwgYVJlc291cmNlLmdldFVSSSgpKTsKKworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIElGaWxlIGdldEZpbGUoUmVzb3VyY2VTZXQgc2V0LCBVUkkgdXJpKSB7CisJCUlGaWxlIGZpbGUgPSBnZXRQbGF0Zm9ybUZpbGUodXJpKTsKKwkJaWYgKGZpbGUgPT0gbnVsbCkgeworCQkJaWYgKHNldCAhPSBudWxsKSB7CisJCQkJVVJJQ29udmVydGVyIGNvbnZlcnRlciA9IHNldC5nZXRVUklDb252ZXJ0ZXIoKTsKKwkJCQlVUkkgY29udmVydGVkVXJpID0gY29udmVydGVyLm5vcm1hbGl6ZSh1cmkpOworCQkJCWlmICghdXJpLmVxdWFscyhjb252ZXJ0ZWRVcmkpKQorCQkJCQlyZXR1cm4gZ2V0UGxhdGZvcm1GaWxlKGNvbnZlcnRlZFVyaSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZpbGU7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBJRmlsZSBmb3IgdGhlIDxjb2RlPnVyaTwvY29kZT4gd2l0aGluIHRoZSBXb3Jrc3BhY2UuIFRoaXMgVVJJIGlzIGFzc3VtZWQgdG8gYmUKKwkgKiBhYnNvbHV0ZSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDogcGxhdGZvcm06L3Jlc291cmNlLy4uLi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIElGaWxlIGdldFBsYXRmb3JtRmlsZShVUkkgdXJpKSB7CisJCWlmIChpc1BsYXRmb3JtUmVzb3VyY2VVUkkodXJpKSkgeworCQkJU3RyaW5nIGZpbGVTdHJpbmcgPSBVUkkuZGVjb2RlKHVyaS5wYXRoKCkpOworCQkJZmlsZVN0cmluZyA9IGZpbGVTdHJpbmcuc3Vic3RyaW5nKEpFTVV0aWxQbHVnaW4uUExBVEZPUk1fUkVTT1VSQ0UubGVuZ3RoKCkgKyAxKTsKKwkJCXJldHVybiBnZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShuZXcgUGF0aChmaWxlU3RyaW5nKSk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisKKworCXB1YmxpYyBzdGF0aWMgSUZpbGUgZ2V0RmlsZShJUHJvamVjdCBwcm9qZWN0LCBVUkkgdXJpKSB7CisJCVJlc291cmNlU2V0IHNldCA9IGdldFJlc291cmNlU2V0KHByb2plY3QpOworCQlyZXR1cm4gZ2V0RmlsZShzZXQsIHVyaSk7CisJfQorCisJLyoqCisJICogVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGlmIHlvdSB3YW50IHRvIHNhdmUgPGNvZGU+YVJlc291cmNlPC9jb2RlPiB3aXRoaW4gdGhlIElQcm9qZWN0CisJICogdGhhdCBpdCBpcyBjdXJyZW50bHkgcmVzaWRpbmcgYnV0IHlvdSBkbyBub3Qgd2FudCB0byBzYXZlIGl0IGluIHRoZSBkZWZhdWx0IG91dHB1dCBsb2NhdGlvbi4KKwkgKiBZb3Ugc2hvdWxkIG5vdCB1c2UgdGhpcyBhcGkgdG8gc2F2ZSBhIFJlc291cmNlIHRvIGFuIGV4aXN0aW5nIGZpbGUuCisJICogCisJICogQGRlcHJlY2F0ZWQgVGhpcyBhcGkgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkLiBZb3Ugc2hvdWxkIGNyZWF0ZSBhIHJlc291cmNlIHdpdGggdGhlIGFic29sdXRlCisJICogICAgICAgICAgICAgcGF0aCAocGxhdGZvcm06L3Jlc291cmNlLy4uLikuIFVwb24gc2F2ZSwgdGhlIGZpbGUgd2lsbCBiZSBzYXZlZCB0byB0aGlzCisJICogICAgICAgICAgICAgbG9jYXRpb24uCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIHNhdmVSZXNvdXJjZVRvRmlsZShSZXNvdXJjZSBhUmVzb3VyY2UsIElGaWxlIGFGaWxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHNhdmVSZXNvdXJjZVRvRmlsZShhUmVzb3VyY2UsIGFGaWxlLCBudWxsKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgaWYgeW91IHdhbnQgdG8gc2F2ZSA8Y29kZT5hUmVzb3VyY2U8L2NvZGU+IHdpdGhpbiB0aGUgSVByb2plY3QKKwkgKiB0aGF0IGl0IGlzIGN1cnJlbnRseSByZXNpZGluZyBidXQgeW91IGRvIG5vdCB3YW50IHRvIHNhdmUgaXQgaW4gdGhlIGRlZmF1bHQgb3V0cHV0IGxvY2F0aW9uLgorCSAqIFlvdSBzaG91bGQgbm90IHVzZSB0aGlzIGFwaSB0byBzYXZlIGEgUmVzb3VyY2UgdG8gYW4gZXhpc3RpbmcgZmlsZS4KKwkgKiAKKwkgKiBAZGVwcmVjYXRlZCBUaGlzIGFwaSBpcyBubyBsb25nZXIgcmVxdWlyZWQuIFlvdSBzaG91bGQgY3JlYXRlIGEgcmVzb3VyY2Ugd2l0aCB0aGUgYWJzb2x1dGUKKwkgKiAgICAgICAgICAgICBwYXRoIChwbGF0Zm9ybTovcmVzb3VyY2UvLi4uKS4gVXBvbiBzYXZlLCB0aGUgZmlsZSB3aWxsIGJlIHNhdmVkIHRvIHRoaXMKKwkgKiAgICAgICAgICAgICBsb2NhdGlvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2F2ZVJlc291cmNlVG9GaWxlKFJlc291cmNlIGFSZXNvdXJjZSwgSUZpbGUgYUZpbGUsIE1hcCBzYXZlT3B0aW9ucykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWlmIChhUmVzb3VyY2UgIT0gbnVsbCAmJiBhRmlsZSAhPSBudWxsICYmICFhRmlsZS5leGlzdHMoKSkgeworCQkJUmVzb3VyY2VTZXQgc2V0ID0gYVJlc291cmNlLmdldFJlc291cmNlU2V0KCk7CisJCQlpZiAoc2V0ICE9IG51bGwpIHsKKwkJCQlVUklDb252ZXJ0ZXIgY29udiA9IHNldC5nZXRVUklDb252ZXJ0ZXIoKTsKKwkJCQlpZiAoY29udiAhPSBudWxsICYmIGNvbnYgaW5zdGFuY2VvZiBXb3JrYmVuY2hVUklDb252ZXJ0ZXIpIHsKKwkJCQkJV29ya2JlbmNoVVJJQ29udmVydGVyIHdiQ29udiA9IChXb3JrYmVuY2hVUklDb252ZXJ0ZXIpIGNvbnY7CisJCQkJCVN0cmluZyB1cmkgPSBhUmVzb3VyY2UuZ2V0VVJJKCkudG9TdHJpbmcoKTsKKwkJCQkJSVBhdGggcmVzUGF0aCwgZmlsZVBhdGg7CisJCQkJCXJlc1BhdGggPSBuZXcgUGF0aCh1cmkpOworCQkJCQlmaWxlUGF0aCA9IGFGaWxlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKKwkJCQkJaW50IHJlc0NvdW50LCBmaWxlQ291bnQ7CisJCQkJCXJlc0NvdW50ID0gcmVzUGF0aC5zZWdtZW50Q291bnQoKTsKKwkJCQkJZmlsZUNvdW50ID0gZmlsZVBhdGguc2VnbWVudENvdW50KCk7CisJCQkJCWlmIChyZXNDb3VudCA8PSBmaWxlQ291bnQpIHsKKwkJCQkJCWZpbGVQYXRoID0gZmlsZVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhmaWxlQ291bnQgLSByZXNDb3VudCk7CisJCQkJCQlpZiAocmVzUGF0aC5lcXVhbHMoZmlsZVBhdGgpKSB7CisJCQkJCQkJT3V0cHV0U3RyZWFtIG9zID0gd2JDb252LmNyZWF0ZU91dHB1dFN0cmVhbShVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShhRmlsZS50b1N0cmluZygpKSk7CisJCQkJCQkJaWYgKG9zICE9IG51bGwpIHsKKwkJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJCWFSZXNvdXJjZS5zYXZlKG9zLCBzYXZlT3B0aW9ucyk7CisJCQkJCQkJCX0gZmluYWxseSB7CisJCQkJCQkJCQlvcy5jbG9zZSgpOworCQkJCQkJCQl9CisJCQkJCQkJCXJldHVybiB0cnVlOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGRlbGV0ZUZpbGUoSUZpbGUgYUZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJaWYgKGFGaWxlICE9IG51bGwgJiYgYUZpbGUuZXhpc3RzKCkpCisJCQlhRmlsZS5kZWxldGUodHJ1ZSwgbnVsbCk7CisJfQorCisJLyoqCisJICogRGVsZXRlCisJICogCisJICogQGFSZXNvdXJjZSBpbiB0aGUgV29ya2JlbmNoLgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJaWYgKGFSZXNvdXJjZSAhPSBudWxsKQorCQkJZGVsZXRlRmlsZShnZXRGaWxlKGFSZXNvdXJjZSkpOworCX0KKworCisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0FkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MjE1M2QKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0FkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvci5qYXZhCkBAIC0wLDAgKzEsMTYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBDcmVhdGVkIG9uIEZlYiAyNiwgMjAwNAorICogCisgKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUKKyAqIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbi5KRU1VdGlsUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5BYnN0cmFjdFJlZ2lzdHJ5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuQXNzZXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXI7CisKKworcHVibGljIGNsYXNzIEFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvciBleHRlbmRzIEFic3RyYWN0UmVnaXN0cnlEZXNjcmlwdG9yIGltcGxlbWVudHMgQ29tcGFyYWJsZSB7CisKKwlwcml2YXRlIFN0cmluZyBwYWNrYWdlVVJJID0gbnVsbDsKKwlwcml2YXRlIFN0cmluZyBpZCA9IG51bGw7CisJcHJpdmF0ZSBTZXQgdmlld0lEcyA9IG51bGw7CisJcHJpdmF0ZSBmaW5hbCBpbnQgbG9hZE9yZGVyOworCXByaXZhdGUgc3RhdGljIGludCBsb2FkT3JkZXJDb3VudGVyID0gMDsKKworCXB1YmxpYyBBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKKwkJc3VwZXIoZWxlbWVudCk7CisKKwkJcGFja2FnZVVSSSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkuUEFDS0FHRV9VUkkpOworCQlpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkuSUQpOworCQlBc3NlcnQuaXNOb3ROdWxsKHBhY2thZ2VVUkksIEVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yX0VSUk9SXzApOworCQlBc3NlcnQuaXNOb3ROdWxsKGlkLCBFTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhFTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLkFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvcl9FUlJPUl8xLCBuZXcgT2JqZWN0W117ZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKX0pKTsKKworCQlyZWFkVmlld0lEcygpOworCQl0aGlzLmxvYWRPcmRlciA9IGxvYWRPcmRlckNvdW50ZXIrKzsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJc2IuYXBwZW5kKCJBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IiKTsgLy8kTk9OLU5MUy0xJAorCQlzYi5hcHBlbmQoJ1snKTsKKwkJc2IuYXBwZW5kKHBhY2thZ2VVUkkpOworCQlzYi5hcHBlbmQoIixwIik7IC8vJE5PTi1OTFMtMSQKKwkJc2IuYXBwZW5kKGdldFByaW9yaXR5KCkpOworCQlpZiAodmlld0lEcyAhPSBudWxsICYmICF2aWV3SURzLmlzRW1wdHkoKSkgeworCQkJc2IuYXBwZW5kKCc6Jyk7CisJCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKwkJCUl0ZXJhdG9yIGl0ZXIgPSB2aWV3SURzLml0ZXJhdG9yKCk7CisJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKwkJCQlpZiAoIWZpcnN0KQorCQkJCQlzYi5hcHBlbmQoJywnKTsKKwkJCQlmaXJzdCA9IGZhbHNlOworCQkJCXNiLmFwcGVuZChpdGVyLm5leHQoKSk7CisJCQl9CisJCX0KKwkJc2IuYXBwZW5kKCddJyk7CisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0KKworCXByaXZhdGUgdm9pZCByZWFkVmlld0lEcygpIHsKKwkJdmlld0lEcyA9IG5ldyBIYXNoU2V0KDMpOworCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZHJlbiA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oQWRhcHRlckZhY3RvcnlSZWdpc3RyeS5WSUVXKTsKKwkJaWYgKGNoaWxkcmVuID09IG51bGwgfHwgY2hpbGRyZW4ubGVuZ3RoID09IDApCisJCQlyZXR1cm47CisKKwkJU3RyaW5nIHZpZXdJRCA9IG51bGw7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkJCXZpZXdJRCA9IGNoaWxkcmVuW2ldLmdldEF0dHJpYnV0ZShBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5LklEKTsKKwkJCWlmICh2aWV3SUQgIT0gbnVsbCkKKwkJCQl2aWV3SURzLmFkZCh2aWV3SUQpOworCQl9CisJfQorCisJcHVibGljIEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZUluc3RhbmNlKCkgeworCQlpZiAoZWxlbWVudCA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisKKwkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7CisJCXRyeSB7CisJCQlmYWN0b3J5ID0gKEFkYXB0ZXJGYWN0b3J5KSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQWRhcHRlckZhY3RvcnlSZWdpc3RyeS5DTEFTU19OQU1FKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlKRU1VdGlsUGx1Z2luLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOworCQkJZmFjdG9yeSA9IG51bGw7CisJCX0KKwkJcmV0dXJuIGZhY3Rvcnk7CisJfQorCisKKwlwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VVUkkoKSB7CisJCXJldHVybiBwYWNrYWdlVVJJOworCX0KKworCXB1YmxpYyBTZXQgZ2V0Vmlld0lEcygpIHsKKwkJcmV0dXJuIHZpZXdJRHM7CisJfQorCisJcHVibGljIGJvb2xlYW4gYXBwbGllc1RvKFN0cmluZyB2aWV3SUQpIHsKKwkJcmV0dXJuIHZpZXdJRHMuaXNFbXB0eSgpIHx8IHZpZXdJRHMuY29udGFpbnModmlld0lEKTsKKwl9CisKKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgamF2YS5sYW5nLkNvbXBhcmFibGUjY29tcGFyZVRvKGphdmEubGFuZy5PYmplY3QpCisJICovCisJcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pIHsKKwkJaWYgKHRoaXMgPT0gbykKKwkJCXJldHVybiAwOworCQlpZiAoIShvIGluc3RhbmNlb2YgQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yKSkKKwkJCXJldHVybiAxOworCQlBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IgZGVzYyA9IChBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IpIG87CisKKwkJaW50IHBDb21wYXJlID0gZ2V0UHJpb3JpdHkoKSAtIGRlc2MuZ2V0UHJpb3JpdHkoKTsKKwkJaWYgKHBDb21wYXJlICE9IDApCisJCQkvL1dlIGhhdmUgcmV2ZXJzZSB0aGUgc29ydGluZyBvZiB0aGUgcHJpb3JpdHkgZm9yIHRoZSBhZGFwdGVyIGZhY3RvcmllcworCQkJcmV0dXJuIC1wQ29tcGFyZTsKKworCQkvL1RoZSBncm91cCBpcyB0aGUgc2FtZSAtIGluIHRoaXMgY2FzZSB0aGUgb25lIGZvciBhIHNwZWNpZmljIHZpZXcgaGFzIHByZWNlZGVuY2Ugb3ZlcgorCQkvL2EgZ2VuZXJpYyBvbmUKKwkJZWxzZSBpZiAodmlld0lEcyAhPSBudWxsICYmICF2aWV3SURzLmlzRW1wdHkoKSkKKwkJCXJldHVybiAtMTsKKwkJZWxzZQorCQkJcmV0dXJuIDE7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuQWJzdHJhY3RSZWdpc3RyeURlc2NyaXB0b3IjZ2V0SUQoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7CisJCXJldHVybiBpZDsKKwl9CisKKworCS8qKgorCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbG9hZE9yZGVyLgorCSAqLworCXB1YmxpYyBpbnQgZ2V0TG9hZE9yZGVyKCkgeworCQlyZXR1cm4gbG9hZE9yZGVyOworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvQWRhcHRlckZhY3RvcnlSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk4Njk2MgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvQWRhcHRlckZhY3RvcnlSZWdpc3RyeS5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0OworCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuUmVnaXN0cnlSZWFkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FTUZXb3JrYmVuY2hFZGl0UGx1Z2luOworCisvKioKKyAqIEBhdXRob3IgbWRlbGRlcgorICovCitwdWJsaWMgY2xhc3MgQWRhcHRlckZhY3RvcnlSZWdpc3RyeSBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfRkFDVE9SWSA9ICJhZGFwdGVyRmFjdG9yeSI7IC8vJE5PTi1OTFMtMSQKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfVVJJID0gInBhY2thZ2VVUkkiOyAvLyROT04tTkxTLTEkCisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19OQU1FID0gImNsYXNzTmFtZSI7IC8vJE5PTi1OTFMtMSQKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVcgPSAidmlldyI7IC8vJE5PTi1OTFMtMSQKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImlkIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBNYXAgZGVzY3JpcHRvck1hcCA9IG51bGw7CisKKwlwcml2YXRlIHN0YXRpYyBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5IGluc3RhbmNlOworCisJcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5KCkgeworCQlzdXBlcihFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLklELCBFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLkFEQVBURVJfRkFDVE9SWV9SRUdJU1RSWV9FWFRFTlNJT05fUE9JTlQpOworCX0KKworCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0b3JzKEVQYWNrYWdlIHBrZywgU3RyaW5nIHZpZXdJRCkgeworCQlDb2xsZWN0aW9uIGFsbCA9IGdldERlc2NyaXB0b3JzKHBrZyk7CisJCWlmIChhbGwgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCisJCUl0ZXJhdG9yIGl0ZXIgPSBhbGwuaXRlcmF0b3IoKTsKKwkJQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yIGRlc2MgPSBudWxsOworCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoYWxsLnNpemUoKSk7CisJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgeworCQkJZGVzYyA9IChBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOworCQkJaWYgKGRlc2MuYXBwbGllc1RvKHZpZXdJRCkpCisJCQkJcmVzdWx0LmFkZChkZXNjKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXB1YmxpYyBDb2xsZWN0aW9uIGdldERlc2NyaXB0b3JzKEVQYWNrYWdlIHJlZ2lzdGVyZWRQYWNrYWdlKSB7CisJCXJldHVybiAoQ29sbGVjdGlvbikgZ2V0RGVzY3JpcHRvck1hcCgpLmdldChyZWdpc3RlcmVkUGFja2FnZS5nZXROc1VSSSgpKTsKKwl9CisKKwlwcml2YXRlIE1hcCBnZXREZXNjcmlwdG9yTWFwKCkgeworCQlpZiAoZGVzY3JpcHRvck1hcCA9PSBudWxsKQorCQkJZGVzY3JpcHRvck1hcCA9IG5ldyBIYXNoTWFwKCk7CisJCXJldHVybiBkZXNjcmlwdG9yTWFwOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLlJlZ2lzdHJ5UmVhZGVyI3JlYWRFbGVtZW50KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQpCisJICovCisJcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKKwkJdHJ5IHsKKwkJCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoQURBUFRFUl9GQUNUT1JZKSkgeworCQkJCUFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IEFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvcihlbGVtZW50KTsKKwkJCQltYXBEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IocmUpOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcml2YXRlIHZvaWQgbWFwRGVzY3JpcHRvcihBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworCQlTdHJpbmcgdXJpID0gZGVzY3JpcHRvci5nZXRQYWNrYWdlVVJJKCk7CisJCUNvbGxlY3Rpb24gZGVzY3JpcHRvcnMgPSAoQ29sbGVjdGlvbikgZ2V0RGVzY3JpcHRvck1hcCgpLmdldCh1cmkpOworCQlpZiAoZGVzY3JpcHRvcnMgPT0gbnVsbCkgeworCQkJZGVzY3JpcHRvcnMgPSBuZXcgVHJlZVNldCgpOworCQkJZ2V0RGVzY3JpcHRvck1hcCgpLnB1dCh1cmksIGRlc2NyaXB0b3JzKTsKKwkJfQorCQlkZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7CisJfQorCisJLyoqCisJICogQHJldHVybiBSZXR1cm5zIHRoZSBpbnN0YW5jZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkgaW5zdGFuY2UoKSB7CisJCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7CisJCQlpbnN0YW5jZSA9IG5ldyBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5KCk7CisJCQlpbnN0YW5jZS5yZWFkUmVnaXN0cnkoKTsKKwkJfQorCQlyZXR1cm4gaW5zdGFuY2U7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0NoaWxkQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9DaGlsZENvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGVjNDBlCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9DaGlsZENvbW1hbmQuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdDsKKworCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5BYnN0cmFjdEVkaXRNb2RlbENvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbENvbW1hbmQ7CisKKy8qKgorICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA1LzIyLzAxIDg6NTc6NTYgQU0pCisgKiAKKyAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKKyAqLworcHVibGljIGNsYXNzIENoaWxkQ29tbWFuZCBleHRlbmRzIEVkaXRNb2RlbENvbW1hbmQgeworCXByaXZhdGUgUGFyZW50Q29tbWFuZCBwYXJlbnQ7CisJcHJpdmF0ZSBFZGl0TW9kZWxSZXRyaWV2ZXIgbW9kZWxSZXRyaWV2ZXI7CisKKwlwdWJsaWMgQ2hpbGRDb21tYW5kKFBhcmVudENvbW1hbmQgcGFyZW50Q21kLCBDb21tYW5kIHRhcmdldENtZCwgRWRpdE1vZGVsUmV0cmlldmVyIHJldHJpZXZlcikgeworCQlzdXBlcih0YXJnZXRDbWQpOworCQlwYXJlbnQgPSBwYXJlbnRDbWQ7CisJCW1vZGVsUmV0cmlldmVyID0gcmV0cmlldmVyOworCX0KKworCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7CisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIERvZXMgbm90aGluZworCSAqLworCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CisJCS8vZG9lcyBub3RoaW5nCisJfQorCisJcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZUluTW9kZWwoQWJzdHJhY3RFZGl0TW9kZWxDb21tYW5kIGNtZCkgeworCQlFZGl0TW9kZWwgbW9kZWwgPSBtb2RlbFJldHJpZXZlci5nZXRFZGl0TW9kZWxGb3JXcml0ZSh0aGlzKTsKKwkJdHJ5IHsKKwkJCW1vZGVsLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY21kKTsKKwkJCW1vZGVsLnNhdmVJZk5lY2Vzc2FyeSh0aGlzKTsKKwkJfSBmaW5hbGx5IHsKKwkJCW1vZGVsLnJlbGVhc2VBY2Nlc3ModGhpcyk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNS8yMi8wMSA5OjM1OjM2IEFNKQorCSAqIAorCSAqIEByZXR1cm4gamF2YS5sYW5nLk9iamVjdAorCSAqLworCXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldEVkaXRNb2RlbEtleSgpIHsKKwkJcmV0dXJuIG1vZGVsUmV0cmlldmVyLmdldEVkaXRNb2RlbElEKCk7CisJfQorCisJLyoqCisJICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMDUvMjIvMDEgOTozNTozNiBBTSkKKwkgKiAKKwkgKiBAcmV0dXJuIGNvbS5pYm0uZXRvb2xzLmoyZWUud29ya2JlbmNoLlBhcmVudENvbW1hbmQKKwkgKi8KKwlwdWJsaWMgUGFyZW50Q29tbWFuZCBnZXRQYXJlbnQoKSB7CisJCXJldHVybiBwYXJlbnQ7CisJfQorCisJcHVibGljIHZvaWQgcmVkbygpIHsKKwkJcmVkb0luTW9kZWwoKTsKKwkJZ2V0UGFyZW50KCkucmVkb0Zyb20odGhpcyk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcmVkb0luTW9kZWwoKSB7CisJCUVkaXRNb2RlbCBtb2RlbCA9IG1vZGVsUmV0cmlldmVyLmdldEVkaXRNb2RlbEZvcldyaXRlKHRoaXMpOworCQl0cnkgeworCQkJZ2V0VGFyZ2V0KCkucmVkbygpOworCQkJbW9kZWwuc2F2ZUlmTmVjZXNzYXJ5KHRoaXMpOworCQl9IGZpbmFsbHkgeworCQkJbW9kZWwucmVsZWFzZUFjY2Vzcyh0aGlzKTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHVuZG8oKSB7CisJCXVuZG9Jbk1vZGVsKCk7CisJCWdldFBhcmVudCgpLnVuZG9Gcm9tKHRoaXMpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHVuZG9Jbk1vZGVsKCkgeworCQlFZGl0TW9kZWwgbW9kZWwgPSBtb2RlbFJldHJpZXZlci5nZXRFZGl0TW9kZWxGb3JXcml0ZSh0aGlzKTsKKwkJdHJ5IHsKKwkJCWdldFRhcmdldCgpLnVuZG8oKTsKKwkJCW1vZGVsLnNhdmVJZk5lY2Vzc2FyeSh0aGlzKTsKKwkJfSBmaW5hbGx5IHsKKwkJCW1vZGVsLnJlbGVhc2VBY2Nlc3ModGhpcyk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0NsaWVudEFjY2Vzc1JlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0NsaWVudEFjY2Vzc1JlZ2lzdHJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYwZjgyZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvQ2xpZW50QWNjZXNzUmVnaXN0cnkuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBDcmVhdGVkIG9uIE9jdCA2LCAyMDAzCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5ubHMuRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXI7CisKKy8qKgorICogQGF1dGhvciBtZGVsZGVyCisgKi8KK3B1YmxpYyBjbGFzcyBDbGllbnRBY2Nlc3NSZWdpc3RyeSB7CisKKwlwcm90ZWN0ZWQgZmluYWwgV2Vha0hhc2hNYXAgcmVnaXN0cnkgPSBuZXcgV2Vha0hhc2hNYXAoKTsKKwlwcm90ZWN0ZWQgZmluYWwgU2V0IGJhc2VTZXQgPSBuZXcgSGFzaFNldCgpOworCisJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFjY2VzcyhPYmplY3QgYWNjZXNzb3JLZXkpIHsKKwkJaWYgKGlzU3RhYmxlKCkpIHsKKwkJCWlmICghcmVnaXN0cnkuY29udGFpbnNLZXkoYWNjZXNzb3JLZXkpKSB7CisJCQkJU25hcHNob3Qgc25hcHNob3QgPSBuZXcgU25hcHNob3QoKTsKKwkJCQl0aGlzLnJlZ2lzdHJ5LnB1dChhY2Nlc3NvcktleSwgc25hcHNob3QpOworCQkJCXRoaXMuYmFzZVNldC5hZGQoc25hcHNob3QpOworCisJCQl9IGVsc2UKKwkJCQl0aHJvdyBuZXcgQ2xpZW50QWNjZXNzUmVnaXN0cnlFeGNlcHRpb24oRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlci5DbGllbnRBY2Nlc3NSZWdpc3RyeV9FUlJPUl8wLCBhY2Nlc3NvcktleSk7CisKKwkJfSBlbHNlCisJCQljb21wbGFpbigpOworCX0KKworCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWxlYXNlKE9iamVjdCBhY2Nlc3NvcktleSkgeworCisJCS8qCisJCSAqIEVycm9yIGNvbmRpdGlvbjogU29tZSBvbmUgaGFzIGJlZW4gbmF1Z2h0eSBhbmQgbm90IHJlbGVhc2VkIHRoZSByZXNvdXJjZQorCQkgKi8KKwkJaWYgKHRoaXMucmVnaXN0cnkuY29udGFpbnNLZXkoYWNjZXNzb3JLZXkpICYmIGlzU3RhYmxlKCkpIHsKKwkJCVNuYXBzaG90IHNuYXBzaG90ID0gKFNuYXBzaG90KSB0aGlzLnJlZ2lzdHJ5LnJlbW92ZShhY2Nlc3NvcktleSk7CisJCQl0aGlzLmJhc2VTZXQucmVtb3ZlKHNuYXBzaG90KTsKKwkJfSBlbHNlCisJCQljb21wbGFpbihhY2Nlc3NvcktleSk7CisJfQorCisJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFzc2VydEFjY2VzcyhPYmplY3QgYWNjZXNzb3JLZXkpIHsKKwkJaWYgKCFpc0NsaWVudEFjY2Vzc2luZyhhY2Nlc3NvcktleSkpCisJCQl0aHJvdyBuZXcgQ2xpZW50QWNjZXNzUmVnaXN0cnlFeGNlcHRpb24oRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ2xpZW50QWNjZXNzUmVnaXN0cnlfRVJST1JfMSIpLCBhY2Nlc3NvcktleSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNDbGllbnRBY2Nlc3NpbmcoT2JqZWN0IGNsaWVudCkgeworCQlib29sZWFuIHJlc3VsdCA9IHRoaXMucmVnaXN0cnkuY29udGFpbnNLZXkoY2xpZW50KTsKKwkJaWYgKCFpc1N0YWJsZSgpKQorCQkJY29tcGxhaW4oKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNBbnlDbGllbnRBY2Nlc3NpbmcoKSB7CisJCWJvb2xlYW4gcmVzdWx0ID0gdGhpcy5yZWdpc3RyeS5zaXplKCkgPiAwOworCQlpZiAoIWlzU3RhYmxlKCkpCisJCQljb21wbGFpbigpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc1N0YWJsZSgpIHsKKwkJcmV0dXJuIHRoaXMuYmFzZVNldC5zaXplKCkgPT0gdGhpcy5yZWdpc3RyeS5zaXplKCk7CisJfQorCisJcHVibGljIHZvaWQgY29tcGxhaW4oKSB7CisJCWNvbXBsYWluKG51bGwpOworCX0KKworCXB1YmxpYyB2b2lkIGNvbXBsYWluKE9iamVjdCBhY2Nlc3NvcktleSkgeworCQlpZiAoIWlzU3RhYmxlKCkpCisJCQl0aHJvdyBuZXcgQ2xpZW50QWNjZXNzUmVnaXN0cnlFeGNlcHRpb24odGhpcy5yZWdpc3RyeSwgdGhpcy5iYXNlU2V0KTsKKwkJdGhyb3cgbmV3IENsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uKEVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNsaWVudEFjY2Vzc1JlZ2lzdHJ5X0VSUk9SXzEiKSwgYWNjZXNzb3JLZXkpOyAvLyROT04tTkxTLTEkCisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoIkNsaWVudEFjY2Vzc1JlZ2lzdHJ5OiBbIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZCgoaXNTdGFibGUoKSkgPyAiU1RBQkxFIiA6ICJPVVQgT0YgU1lOQyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJcmVzdWx0LmFwcGVuZCgiXTogUmVmZXJlbmNlIENvdW50ID0gIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZCh0aGlzLnNpemUoKSk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKKwlwdWJsaWMgc3luY2hyb25pemVkIGludCBzaXplKCkgeworCQlyZXR1cm4gdGhpcy5yZWdpc3RyeS5zaXplKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0NsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0NsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVhYTFjYgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvQ2xpZW50QWNjZXNzUmVnaXN0cnlFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDE1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBDcmVhdGVkIG9uIE9jdCAyLCAyMDAzCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdDsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuV2Vha0hhc2hNYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyOworCisKKy8qKgorICogVGhlIENsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uIGFjY2VwdHMgYSBXZWFrSGFzaFNldCByZWdpc3RyeSBhbmQgYSBTZXQgb2YgYWxsIFNuYXBzaG90cyB0aGF0CisgKiBzaG91bGQgYmUgY29udGFpbmVkIGluIHRoZSByZWdpc3RyeS4gSXQgd2lsbCBwZXJmb3JtIHRoZSBuZWNlc3Nhcnkgc2V0IGRpZmZlcmVuY2UgaW4gb3JkZXIgdG8KKyAqIGRldGVybWluZSB3aGljaCBTbmFwc2hvdHMgZXhpc3QgaW4gdGhlIGJhc2VTZXQgYnV0IG5vdCBpbiB0aGUgcmVnaXN0cnkuCisgKiAKKyAqIEBhdXRob3IgbWRlbGRlcgorICovCitwdWJsaWMgY2xhc3MgQ2xpZW50QWNjZXNzUmVnaXN0cnlFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOS05PV04gPSAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERBTkdMSU5HX1JFRkVSRU5DRSA9IDE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9BQ0NFU1NfS0VZID0gMjsKKwlwcml2YXRlIFdlYWtIYXNoTWFwIHJlZ2lzdHJ5ID0gbnVsbDsKKwlwcml2YXRlIFNldCBiYXNlU2V0ID0gbnVsbDsKKwlwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc2VkID0gZmFsc2U7CisJcHJpdmF0ZSBpbnQgdHlwZSA9IFVOS05PV047CisKKwlwdWJsaWMgQ2xpZW50QWNjZXNzUmVnaXN0cnlFeGNlcHRpb24oV2Vha0hhc2hNYXAgcmVnaXN0cnksIFNldCBiYXNlU2V0KSB7CisJCXRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTsKKwkJdGhpcy5iYXNlU2V0ID0gbmV3IEhhc2hTZXQoKTsKKwkJdGhpcy5iYXNlU2V0LmFkZEFsbChiYXNlU2V0KTsKKwkJdGhpcy50eXBlID0gREFOR0xJTkdfUkVGRVJFTkNFOworCX0KKworCXB1YmxpYyBDbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbihTdHJpbmcgbXNnLCBPYmplY3Qga2V5KSB7CisJCXN1cGVyKG1zZyArICIgOiAiICsga2V5KTsgLy8kTk9OLU5MUy0xJAorCQl0aGlzLnR5cGUgPSBJTlZBTElEX0FDQ0VTU19LRVk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBqYXZhLmxhbmcuVGhyb3dhYmxlI3ByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50U3RyZWFtKQorCSAqLworCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShQcmludFN0cmVhbSBzKSB7CisKKwkJcy5wcmludGxuKHRvU3RyaW5nKCkpOworCQlzdXBlci5wcmludFN0YWNrVHJhY2Uocyk7CisKKwkJaWYgKHRoaXMucmVnaXN0cnkgIT0gbnVsbCkgeworCQkJU25hcHNob3Qgc25hcHNob3QgPSBudWxsOworCQkJaWYgKCFwcm9jZXNzZWQpIHsKKwkJCQlPYmplY3Qga2V5ID0gbnVsbDsKKwkJCQlJdGVyYXRvciBrZXlJdGVyYXRvciA9IHRoaXMucmVnaXN0cnkua2V5U2V0KCkuaXRlcmF0b3IoKTsKKwkJCQl3aGlsZSAoa2V5SXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQkJCWtleSA9IGtleUl0ZXJhdG9yLm5leHQoKTsKKwkJCQkJc25hcHNob3QgPSAoU25hcHNob3QpIHRoaXMucmVnaXN0cnkuZ2V0KGtleSk7CisJCQkJCXRoaXMuYmFzZVNldC5yZW1vdmUoc25hcHNob3QpOworCQkJCX0KKwkJCQlwcm9jZXNzZWQgPSB0cnVlOworCQkJfQorCQkJcy5wcmludGxuKEVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKEVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuQ2xpZW50QWNjZXNzUmVnaXN0cnlFeGNlcHRpb25fVUlfMCwgbmV3IE9iamVjdFtde25ldyBJbnRlZ2VyKGJhc2VTZXQuc2l6ZSgpKS50b1N0cmluZygpfSkpOworCisJCQlmb3IgKEl0ZXJhdG9yIHBvc3NpYmxlQ3VscHJpdHNJdHIgPSBiYXNlU2V0Lml0ZXJhdG9yKCk7IHBvc3NpYmxlQ3VscHJpdHNJdHIuaGFzTmV4dCgpOykgeworCQkJCXNuYXBzaG90ID0gKFNuYXBzaG90KSBwb3NzaWJsZUN1bHByaXRzSXRyLm5leHQoKTsKKwkJCQlzbmFwc2hvdC5wcmludFN0YWNrVHJhY2Uocyk7CisJCQl9CisKKwkJfQorCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgamF2YS5sYW5nLlRocm93YWJsZSNwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFdyaXRlcikKKwkgKi8KKwlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoUHJpbnRXcml0ZXIgcykgeworCisJCXMucHJpbnRsbih0b1N0cmluZygpKTsKKwkJc3VwZXIucHJpbnRTdGFja1RyYWNlKHMpOworCQlpZiAodGhpcy5yZWdpc3RyeSAhPSBudWxsKSB7CisJCQlTbmFwc2hvdCBzbmFwc2hvdCA9IG51bGw7CisJCQlpZiAoIXByb2Nlc3NlZCkgeworCQkJCU9iamVjdCBrZXkgPSBudWxsOworCQkJCUl0ZXJhdG9yIGtleUl0ZXJhdG9yID0gdGhpcy5yZWdpc3RyeS5rZXlTZXQoKS5pdGVyYXRvcigpOworCQkJCXdoaWxlIChrZXlJdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQkJa2V5ID0ga2V5SXRlcmF0b3IubmV4dCgpOworCQkJCQlzbmFwc2hvdCA9IChTbmFwc2hvdCkgdGhpcy5yZWdpc3RyeS5nZXQoa2V5KTsKKwkJCQkJdGhpcy5iYXNlU2V0LnJlbW92ZShzbmFwc2hvdCk7CisJCQkJfQorCQkJCXByb2Nlc3NlZCA9IHRydWU7CisJCQl9CisJCQlzLnByaW50bG4oRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIiIsIG5ldyBPYmplY3RbXXtuZXcgSW50ZWdlcihiYXNlU2V0LnNpemUoKSkudG9TdHJpbmcoKX0pKTsgLy8kTk9OLU5MUy0xJAorCisJCQlmb3IgKEl0ZXJhdG9yIHBvc3NpYmxlQ3VscHJpdHNJdHIgPSBiYXNlU2V0Lml0ZXJhdG9yKCk7IHBvc3NpYmxlQ3VscHJpdHNJdHIuaGFzTmV4dCgpOykgeworCQkJCXNuYXBzaG90ID0gKFNuYXBzaG90KSBwb3NzaWJsZUN1bHByaXRzSXRyLm5leHQoKTsKKwkJCQlzbmFwc2hvdC5wcmludFN0YWNrVHJhY2Uocyk7CisJCQl9CisKKwkJfQorCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKwkJc3dpdGNoICh0eXBlKSB7CisJCQljYXNlIERBTkdMSU5HX1JFRkVSRU5DRSA6CisJCQkJcmV0dXJuICJEQU5HTElOR19SRUZFUkVOQ0UiOyAvLyROT04tTkxTLTEkCisJCQljYXNlIElOVkFMSURfQUNDRVNTX0tFWSA6CisJCQkJcmV0dXJuICJJTlZBTElEX0FDQ0VTU19LRVkiOyAvLyROT04tTkxTLTEkCisJCQlkZWZhdWx0IDoKKwkJCQlyZXR1cm4gIlVOS05PV04iOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKS5hcHBlbmQoIlxyXG4iKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKEVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKEVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuQ2xpZW50QWNjZXNzUmVnaXN0cnlFeGNlcHRpb25fVUlfMSwgbmV3IE9iamVjdFtde2dldFR5cGUoKX0pKTsKKwkJLy8JCWlmICh0aGlzLmJhZFJlZmVyZW5jZUxvY2F0aW9uICE9IG51bGwpIHsKKwkJLy8JCQlyZXN1bHQuYXBwZW5kKCJUaGUgaW52YWxpZCBhY2Nlc3Mgb2NjdXJyZWQgc29tZXdoZXJlIGluIHRoZSBmb2xsb3dpbmcgc3RhY2sKKwkJLy8gdHJhY2UuIikuYXBwZW5kKCJcbiIpOworCQkvLwkJCXJlc3VsdC5hcHBlbmQodGhpcy5iYWRSZWZlcmVuY2VMb2NhdGlvbi5nZXRTdGFja1RyYWNlU3RyaW5nKCkpOworCQkvLwkJfQorCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlTeXN0ZW0ub3V0LnByaW50bG4obmV3IENsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uKCJ0ZXN0IG1lc3NhZ2UiLCAiLXNvbWVrZXlvYmotIikudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxJTkVCUkVBSyIpOyAvLyROT04tTkxTLTEkCisJCVN5c3RlbS5vdXQucHJpbnRsbihuZXcgQ2xpZW50QWNjZXNzUmVnaXN0cnlFeGNlcHRpb24obmV3IFdlYWtIYXNoTWFwKCksIG5ldyBIYXNoU2V0KCkpLnRvU3RyaW5nKCkpOworCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxJTkVCUkVBSyIpOyAvLyROT04tTkxTLTEkCisJCW5ldyBDbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbigidGVzdCBtZXNzYWdlIiwgIi1zb21la2V5b2JqLSIpLnByaW50U3RhY2tUcmFjZSgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJU3lzdGVtLm91dC5wcmludGxuKCJMSU5FQlJFQUsiKTsgLy8kTk9OLU5MUy0xJAorCQluZXcgQ2xpZW50QWNjZXNzUmVnaXN0cnlFeGNlcHRpb24obmV3IFdlYWtIYXNoTWFwKCksIG5ldyBIYXNoU2V0KCkpLnByaW50U3RhY2tUcmFjZSgpOworCisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0VNRldvcmtiZW5jaEVkaXRDb250ZXh0RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9FTUZXb3JrYmVuY2hFZGl0Q29udGV4dEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYThkMmY4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9FTUZXb3JrYmVuY2hFZGl0Q29udGV4dEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBDcmVhdGVkIG9uIE1hciAzLCAyMDA0CisgKgorICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bworICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuam9icy5Mb2NrTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JTG9jazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHRCYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guSUVNRkNvbnRleHRDb250cmlidXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyOworCisvKioKKyAqIEBhdXRob3Igc2NoYWNoZXIKKyAqIAorICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCisgKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKKyAqLworcHVibGljIGNsYXNzIEVNRldvcmtiZW5jaEVkaXRDb250ZXh0RmFjdG9yeSBleHRlbmRzIEVNRldvcmtiZW5jaENvbnRleHRGYWN0b3J5IHsKKwkKKwkKKwkvKioKKwkgKiAgCisJICovCisJcHVibGljIEVNRldvcmtiZW5jaEVkaXRDb250ZXh0RmFjdG9yeSgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwcm90ZWN0ZWQgRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgcHJpbUNyZWF0ZUVNRkNvbnRleHQoSVByb2plY3QgYVByb2plY3QpIHsKKwkJcmV0dXJuIG5ldyBFTUZXb3JrYmVuY2hDb250ZXh0KGFQcm9qZWN0KTsKKwl9CisKKwlwdWJsaWMgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgY3JlYXRlU3luY2hyb25pemVyKFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCwgSVByb2plY3QgYVByb2plY3QpIHsKKwkJcmV0dXJuIG5ldyBSZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIoYVJlc291cmNlU2V0LCBhUHJvamVjdCk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgTG9ja01hbmFnZXIgbG9ja01hbmFnZXIgPSBuZXcgTG9ja01hbmFnZXIoKTsKKwlwcm90ZWN0ZWQgc3RhdGljIE1hcCBwcm9qZWN0TG9ja3MgPSBuZXcgSGFzaHRhYmxlKCk7CisKKwlwdWJsaWMgc3RhdGljIElMb2NrIGdldFByb2plY3RMb2NrT2JqZWN0KElQcm9qZWN0IGFQcm9qZWN0KXsKKwkJaWYobnVsbCA9PSBhUHJvamVjdCl7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlJbnRlZ2VyIGhhc2hDb2RlID0gbmV3IEludGVnZXIoYVByb2plY3QuaGFzaENvZGUoKSk7CisJCXN5bmNocm9uaXplZCAocHJvamVjdExvY2tzKSB7CisJCQlJTG9jayBsb2NrID0gKElMb2NrKXByb2plY3RMb2Nrcy5nZXQoaGFzaENvZGUpOworCQkJaWYobG9jayA9PSBudWxsKXsKKwkJCQlsb2NrID0gbG9ja01hbmFnZXIubmV3TG9jaygpOworCQkJCXByb2plY3RMb2Nrcy5wdXQoaGFzaENvZGUsIGxvY2spOworCQkJfQorCQkJcmV0dXJuIGxvY2s7CisJCX0KKwl9CisJCisJcHVibGljIEVNRldvcmtiZW5jaENvbnRleHRCYXNlIGNyZWF0ZUVNRkNvbnRleHQoSVByb2plY3QgYVByb2plY3QsIElFTUZDb250ZXh0Q29udHJpYnV0b3IgY29udHJpYnV0b3IpIHsKKwkJSUxvY2sgbG9jayA9IGdldFByb2plY3RMb2NrT2JqZWN0KGFQcm9qZWN0KTsKKwkJdHJ5eworCQkJaWYobnVsbCAhPSBsb2NrKXsKKwkJCQlsb2NrLmFjcXVpcmUoKTsKKwkJCX0KKwkJCXJldHVybiBzdXBlci5jcmVhdGVFTUZDb250ZXh0KGFQcm9qZWN0LCBjb250cmlidXRvcik7CisJCX0gZmluYWxseXsKKwkJCWlmKG51bGwgIT0gbG9jayl7CisJCQkJbG9jay5yZWxlYXNlKCk7CisJCQl9CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIEVNRldvcmtiZW5jaENvbnRleHRCYXNlIGdldENhY2hlZEVNRkNvbnRleHQoSVByb2plY3QgYVByb2plY3QpIHsKKwkJSUxvY2sgbG9jayA9IGdldFByb2plY3RMb2NrT2JqZWN0KGFQcm9qZWN0KTsKKwkJdHJ5eworCQkJaWYobnVsbCAhPSBsb2NrKXsKKwkJCQlsb2NrLmFjcXVpcmUoKTsKKwkJCX0KKwkJCXJldHVybiBzdXBlci5nZXRDYWNoZWRFTUZDb250ZXh0KGFQcm9qZWN0KTsKKwkJfSBmaW5hbGx5eworCQkJaWYobnVsbCAhPSBsb2NrKXsKKwkJCQlsb2NrLnJlbGVhc2UoKTsKKwkJCX0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRWRpdE1vZGVsRXh0ZW5zaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0VkaXRNb2RlbEV4dGVuc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNDFkZWYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0VkaXRNb2RlbEV4dGVuc2lvbi5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIENyZWF0ZWQgb24gRmViIDE4LCAyMDA0CisgKiAKKyAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZQorICogR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cworICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5Db25maWd1cmF0aW9uRWxlbWVudFdyYXBwZXI7CisKKworcHVibGljIGNsYXNzIEVkaXRNb2RlbEV4dGVuc2lvbiBleHRlbmRzIENvbmZpZ3VyYXRpb25FbGVtZW50V3JhcHBlciB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfQVRUUiA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgU3RyaW5nIGVkaXRNb2RlbElEID0gbnVsbDsKKwlwcml2YXRlIENvbGxlY3Rpb24gcmVzb3VyY2VzID0gbnVsbDsKKwlwcml2YXRlIFN0cmluZyBpZCA9IG51bGw7CisKKworCXB1YmxpYyBFZGl0TW9kZWxFeHRlbnNpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKKwkJc3VwZXIoZWxlbWVudCk7CisJCWluaXQoKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgaW5pdCgpIHsKKwkJaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShJRF9BVFRSKTsKKwkJaWYgKGlkID09IG51bGwpIHsKKwkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcigiSW5jb3JyZWN0IHVzYWdlIG9mIGVkaXRNb2RlbEV4dGVuc2lvbiBleHRlbnNpb24gcG9pbnQuICBFbGVtZW50IG11c3QgY29udGFpbiBpZCBhdHRyaWJ1dGUuICBQbHVnaW46ICIgKyBnZXRQbHVnaW5JZCgpKTsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuOworCQl9CisKKwkJZWRpdE1vZGVsSUQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShFZGl0TW9kZWxFeHRlbnNpb25SZWdpc3RyeS5FRElUX01PREVMX0lEX0FUVFIpOworCQlyZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVkaXRNb2RlbFJlc291cmNlcyA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oRWRpdE1vZGVsUmVzb3VyY2UuRURJVF9NT0RFTF9SRVNPVVJDRV9FTEVNRU5UKTsKKwkJZm9yIChpbnQgaiA9IDA7IGogPCBlZGl0TW9kZWxSZXNvdXJjZXMubGVuZ3RoOyBqKyspCisJCQlyZXNvdXJjZXMuYWRkKG5ldyBFZGl0TW9kZWxSZXNvdXJjZShlZGl0TW9kZWxSZXNvdXJjZXNbal0sIGlkKSk7CisJfQorCisJLyoqCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdE1vZGVsSUQoKSB7CisJCXJldHVybiBlZGl0TW9kZWxJRDsKKwl9CisKKworCS8qKgorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXNvdXJjZXMoKSB7CisJCXJldHVybiByZXNvdXJjZXM7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0VkaXRNb2RlbEV4dGVuc2lvblJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0VkaXRNb2RlbEV4dGVuc2lvblJlZ2lzdHJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdiYzUxYgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRWRpdE1vZGVsRXh0ZW5zaW9uUmVnaXN0cnkuamF2YQpAQCAtMCwwICsxLDk4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlJlZ2lzdHJ5UmVhZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVNRldvcmtiZW5jaEVkaXRQbHVnaW47CisKKworLyoqCisgKiBAYXV0aG9yIG1kZWxkZXIKKyAqLworY2xhc3MgRWRpdE1vZGVsRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7CisKKwlwcml2YXRlIHN0YXRpYyBFZGl0TW9kZWxFeHRlbnNpb25SZWdpc3RyeSBJTlNUQU5DRSA9IG51bGw7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX01PREVMX0VYVF9FTEVNRU5UID0gImVkaXRNb2RlbEV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX01PREVMX0lEX0FUVFIgPSAiZWRpdE1vZGVsSUQiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfSURfQVRUUiA9ICJmdW5jdGlvbkdyb3VwSUQiOyAvLyROT04tTkxTLTEkCisKKworCXByaXZhdGUgTWFwIGV4dGVuc2lvbnMgPSBudWxsOworCisJcHJvdGVjdGVkIEVkaXRNb2RlbEV4dGVuc2lvblJlZ2lzdHJ5KCkgeworCQlzdXBlcihFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLklELCBFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLkVESVRfTU9ERUxfRVhURU5TSU9OX1JFR0lTVFJZX0VYVEVOU0lPTl9QT0lOVCk7CisJfQorCisJcHVibGljIHN0YXRpYyBFZGl0TW9kZWxFeHRlbnNpb25SZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKKwkJaWYgKElOU1RBTkNFID09IG51bGwpIHsKKwkJCUlOU1RBTkNFID0gbmV3IEVkaXRNb2RlbEV4dGVuc2lvblJlZ2lzdHJ5KCk7CisJCQlJTlNUQU5DRS5yZWFkUmVnaXN0cnkoKTsKKwkJfQorCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuUmVnaXN0cnlSZWFkZXIjcmVhZEVsZW1lbnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgeworCisJCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CisJCUNvbGxlY3Rpb24gZXh0ZW5zaW9uc0J5SUQgPSBudWxsOworCQlFZGl0TW9kZWxFeHRlbnNpb24gZWRpdE1vZGVsRXh0ZW5zaW9uID0gbnVsbDsKKwkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhFRElUX01PREVMX0VYVF9FTEVNRU5UKSkgeworCQkJZWRpdE1vZGVsRXh0ZW5zaW9uID0gbmV3IEVkaXRNb2RlbEV4dGVuc2lvbihlbGVtZW50KTsKKwkJCWV4dGVuc2lvbnNCeUlEID0gKENvbGxlY3Rpb24pIGdldEV4dGVuc2lvbnMoKS5nZXQoZWRpdE1vZGVsRXh0ZW5zaW9uLmdldEVkaXRNb2RlbElEKCkpOworCQkJaWYgKGV4dGVuc2lvbnNCeUlEID09IG51bGwpIHsKKwkJCQlleHRlbnNpb25zQnlJRCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCQlnZXRFeHRlbnNpb25zKCkucHV0KGVkaXRNb2RlbEV4dGVuc2lvbi5nZXRFZGl0TW9kZWxJRCgpLCBleHRlbnNpb25zQnlJRCk7CisJCQl9CisJCQlleHRlbnNpb25zQnlJRC5hZGQoZWRpdE1vZGVsRXh0ZW5zaW9uKTsKKwkJCXJlc3VsdCA9IHRydWU7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcm90ZWN0ZWQgTWFwIGdldEV4dGVuc2lvbnMoKSB7CisJCWlmIChleHRlbnNpb25zID09IG51bGwpCisJCQlleHRlbnNpb25zID0gbmV3IEhhc2hNYXAoKTsKKwkJcmV0dXJuIGV4dGVuc2lvbnM7CisJfQorCisJLyoqCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVkaXRNb2RlbFJlc291cmNlcyhPYmplY3QgZWRpdE1vZGVsSUQpIHsKKwkJLy9UT0RPIC0gQ2FjaGUgdGhlIHJlc291cmNlcworCQlDb2xsZWN0aW9uIGVkaXRNb2RlbFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJQ29sbGVjdGlvbiBlZGl0TW9kZWxFeHRlbnNpb25zID0gKENvbGxlY3Rpb24pIGdldEV4dGVuc2lvbnMoKS5nZXQoZWRpdE1vZGVsSUQpOworCisJCWlmIChlZGl0TW9kZWxFeHRlbnNpb25zID09IG51bGwgfHwgZWRpdE1vZGVsRXh0ZW5zaW9ucy5zaXplKCkgPT0gMCkKKwkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOworCQlJdGVyYXRvciBpdHIgPSBlZGl0TW9kZWxFeHRlbnNpb25zLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7CisJCQlFZGl0TW9kZWxFeHRlbnNpb24gZXh0ID0gKEVkaXRNb2RlbEV4dGVuc2lvbikgaXRyLm5leHQoKTsKKwkJCWVkaXRNb2RlbFJlc291cmNlcy5hZGRBbGwoZXh0LmdldFJlc291cmNlcygpKTsKKwkJfQorCQlyZXR1cm4gKCFlZGl0TW9kZWxFeHRlbnNpb25zLmlzRW1wdHkoKSkgPyBlZGl0TW9kZWxSZXNvdXJjZXMgOiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9FZGl0TW9kZWxSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9FZGl0TW9kZWxSZWdpc3RyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhY2Q5Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0VkaXRNb2RlbFJlZ2lzdHJ5LmphdmEKQEAgLTAsMCArMSwzNzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQ7CisKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5SZWdpc3RyeVJlYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FTUZXb3JrYmVuY2hFZGl0UGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5JRWRpdE1vZGVsRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKKworLyoqCisgKiBAYXV0aG9yIG1kZWxkZXIKKyAqLworcHVibGljIGNsYXNzIEVkaXRNb2RlbFJlZ2lzdHJ5IGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgeworCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgRWRpdE1vZGVsUmVnaXN0cnkgSU5TVEFOQ0UgPSAgbmV3IEVkaXRNb2RlbFJlZ2lzdHJ5KCk7CisKKwlwcml2YXRlIGZpbmFsIE1hcCBmYWN0b3J5Q29uZmlndXJhdGlvbnMgPSBuZXcgSGFzaE1hcCgpOworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKwkKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRfTU9ERUxfRUxFTUVOVCA9ICJlZGl0TW9kZWwiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9NT0RFTF9SRVNPVVJDRV9FWFRFTlNJT04gPSAicmVzb3VyY2VFeHRlbnNpb24iOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9NT0RFTF9SRVNPVVJDRV9FWFRFTlNJT05fTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRfTU9ERUxfSURfQVRUUiA9ICJlZGl0TW9kZWxJRCI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUNUT1JZX0NMQVNTX0FUVFIgPSAiZmFjdG9yeUNsYXNzIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVF9NT0RFTF9BVFRSID0gInBhcmVudE1vZGVsSUQiOyAvLyROT04tTkxTLTEkCisKKworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9BRF9VTktOT1dOX1JFU09VUkNFU19BVFRSID0gImxvYWRVbmtub3duUmVzb3VyY2VzQXNSZWFkT25seSI7IC8vJE5PTi1OTFMtMSQKKworCXByb3RlY3RlZCBFZGl0TW9kZWxSZWdpc3RyeSgpIHsKKwkJc3VwZXIoRU1GV29ya2JlbmNoRWRpdFBsdWdpbi5JRCwgRU1GV29ya2JlbmNoRWRpdFBsdWdpbi5FRElUX01PREVMX0ZBQ1RPUklFU19FWFRFTlNJT05fUE9JTlQpOworCX0KKworCXB1YmxpYyBzdGF0aWMgRWRpdE1vZGVsUmVnaXN0cnkgZ2V0SW5zdGFuY2UoKSB7CisJCWlmKGlzSW5pdGlhbGl6ZWQoKSkgCisJCQlyZXR1cm4gSU5TVEFOQ0U7CisJCXN5bmNocm9uaXplZChJTlNUQU5DRSkgeworCQkJaWYoIWlzSW5pdGlhbGl6ZWQoKSkgeworCQkJCUlOU1RBTkNFLnJlYWRSZWdpc3RyeSgpOworCQkJCWluaXRpYWxpemVkID0gdHJ1ZTsKKwkJCX0KKwkJfSAKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLlJlZ2lzdHJ5UmVhZGVyI3JlYWRFbGVtZW50KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQpCisJICovCisJcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKKwkJLyoKKwkJICogVGhlIEVkaXRNb2RlbCBFeHRlbnNpb24gUG9pbnQgZGVmaW5lcyBDb25maWd1cmF0aW9uIGVsZW1lbnRzIG5hbWVkICJlZGl0TW9kZWwiIHdpdGgKKwkJICogYXR0cmlidXRlcyAiZWRpdE1vZGVsSUQiIGFuZCAiZmFjdG9yeUNsYXNzIgorCQkgKi8KKwkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKKwkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhFRElUX01PREVMX0VMRU1FTlQpKSB7CisJCQlTdHJpbmcgZWRpdE1vZGVsSUQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShFRElUX01PREVMX0lEX0FUVFIpOworCQkJaWYgKGVkaXRNb2RlbElEICE9IG51bGwpIHsKKwkJCQl0aGlzLmZhY3RvcnlDb25maWd1cmF0aW9ucy5wdXQoZWRpdE1vZGVsSUQsIG5ldyBFZGl0TW9kZWxJbmZvKGVkaXRNb2RlbElELCBlbGVtZW50KSk7CisJCQkJcmVzdWx0ID0gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Q2FjaGVJRChTdHJpbmcgZWRpdE1vZGVsSUQsIE1hcCBwYXJhbXMpIHsKKwkJSUVkaXRNb2RlbEZhY3RvcnkgZmFjdG9yeSA9IGdldEVkaXRNb2RlbEZhY3RvcnlCeUtleShlZGl0TW9kZWxJRCk7CisJCXJldHVybiBmYWN0b3J5LmdldENhY2hlSUQoZWRpdE1vZGVsSUQsIHBhcmFtcyk7CisJfQorCisJcHVibGljIEVkaXRNb2RlbCBjcmVhdGVFZGl0TW9kZWxGb3JSZWFkKFN0cmluZyBlZGl0TW9kZWxJRCwgRU1GV29ya2JlbmNoQ29udGV4dCBjb250ZXh0LCBNYXAgcGFyYW1zKSB7CisJCXJldHVybiBnZXRFZGl0TW9kZWxGYWN0b3J5QnlLZXkoZWRpdE1vZGVsSUQpLmNyZWF0ZUVkaXRNb2RlbEZvclJlYWQoZWRpdE1vZGVsSUQsIGNvbnRleHQsIHBhcmFtcyk7CisJfQorCisJcHVibGljIEVkaXRNb2RlbCBjcmVhdGVFZGl0TW9kZWxGb3JXcml0ZShTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCwgTWFwIHBhcmFtcykgeworCQlyZXR1cm4gZ2V0RWRpdE1vZGVsRmFjdG9yeUJ5S2V5KGVkaXRNb2RlbElEKS5jcmVhdGVFZGl0TW9kZWxGb3JXcml0ZShlZGl0TW9kZWxJRCwgY29udGV4dCwgcGFyYW1zKTsKKwl9CisKKwlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFZGl0TW9kZWxSZXNvdXJjZXMoU3RyaW5nIGVkaXRNb2RlbElEKSB7CisJCUNvbGxlY3Rpb24gcmVzb3VyY2VzID0gbmV3IFRyZWVTZXQoKTsKKworCQlFZGl0TW9kZWxJbmZvIG5leHRFZGl0TW9kZWxJbmZvID0gZ2V0RWRpdE1vZGVsSW5mb0J5SWQoZWRpdE1vZGVsSUQpOworCisJCVN0cmluZyBwYXJlbnRNb2RlbElEID0gbnVsbDsKKwkJTWFwIHZpc2l0ZWRFZGl0TW9kZWxzID0gbmV3IEhhc2hNYXAoKTsKKwkJLyogY29sbGVjdCB0aGUgcmVzb3VyY2VzIGZyb20gdGhlIHBhcmVudHMgKi8KKwkJd2hpbGUgKG5leHRFZGl0TW9kZWxJbmZvICE9IG51bGwgJiYgKHBhcmVudE1vZGVsSUQgPSBuZXh0RWRpdE1vZGVsSW5mby5nZXRQYXJlbnRNb2RlbElEKCkpICE9IG51bGwpIHsKKwkJCWlmICh2aXNpdGVkRWRpdE1vZGVscy5jb250YWluc0tleShwYXJlbnRNb2RlbElEKSkKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKEVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKEVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuRWRpdE1vZGVsUmVnaXN0cnlfRVJST1JfMCwgbmV3IE9iamVjdFtde2VkaXRNb2RlbElEfSkpOworCQkJdmlzaXRlZEVkaXRNb2RlbHMucHV0KHBhcmVudE1vZGVsSUQsIG51bGwpOworCQkJcmVzb3VyY2VzLmFkZEFsbChnZXRBbGxFZGl0TW9kZWxSZXNvdXJjZXMocGFyZW50TW9kZWxJRCkpOworCQkJbmV4dEVkaXRNb2RlbEluZm8gPSBnZXRFZGl0TW9kZWxJbmZvQnlJZChwYXJlbnRNb2RlbElEKTsKKwkJfQorCisJCS8qIEdldCB0aGUgcmVzb3VyY2VzIGZvciB0aGUgYWN0dWFsIGVkaXQgbW9kZWwgaWQgKi8KKwkJcmVzb3VyY2VzLmFkZEFsbChnZXRBbGxFZGl0TW9kZWxSZXNvdXJjZXMoZWRpdE1vZGVsSUQpKTsKKworCQlyZXR1cm4gcmVzb3VyY2VzOworCX0KKwkKKwlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFZGl0TW9kZWxFeHRlbnNpb25zKFN0cmluZyBlZGl0TW9kZWxJRCkgeyAKKwkJQ29sbGVjdGlvbiBleHRlbnNpb25zID0gbmV3IFRyZWVTZXQoKTsKKwkJCisJCUVkaXRNb2RlbEluZm8gbmV4dEVkaXRNb2RlbEluZm8gPSBnZXRFZGl0TW9kZWxJbmZvQnlJZChlZGl0TW9kZWxJRCk7CisKKwkJU3RyaW5nIHBhcmVudE1vZGVsSUQgPSBudWxsOworCQlNYXAgdmlzaXRlZEVkaXRNb2RlbHMgPSBuZXcgSGFzaE1hcCgpOworCQkvKiBjb2xsZWN0IHRoZSByZXNvdXJjZXMgZnJvbSB0aGUgcGFyZW50cyAqLworCQl3aGlsZShuZXh0RWRpdE1vZGVsSW5mbyAhPSBudWxsICYmIChwYXJlbnRNb2RlbElEID0gbmV4dEVkaXRNb2RlbEluZm8uZ2V0UGFyZW50TW9kZWxJRCgpKSAhPSBudWxsKSB7CisJCQlpZih2aXNpdGVkRWRpdE1vZGVscy5jb250YWluc0tleShwYXJlbnRNb2RlbElEKSkgCisJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihFTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhFTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLkVkaXRNb2RlbFJlZ2lzdHJ5X0VSUk9SXzAsbmV3IE9iamVjdCBbXSB7ZWRpdE1vZGVsSUR9KSk7IAorCQkJZWxzZSAKKwkJCQl2aXNpdGVkRWRpdE1vZGVscy5wdXQocGFyZW50TW9kZWxJRCwgbnVsbCk7CisJCQkKKwkJCWV4dGVuc2lvbnMuYWRkQWxsKGdldEFsbEVkaXRNb2RlbEV4dGVuc2lvbnMocGFyZW50TW9kZWxJRCkpOworCQkJbmV4dEVkaXRNb2RlbEluZm8gPSBnZXRFZGl0TW9kZWxJbmZvQnlJZChwYXJlbnRNb2RlbElEKTsKKwkJfQorCQkKKwkJLyogR2V0IHRoZSByZXNvdXJjZXMgZm9yIHRoZSBhY3R1YWwgZWRpdCBtb2RlbCBpZCAqLworCQlleHRlbnNpb25zLmFkZEFsbChnZXRBbGxFZGl0TW9kZWxFeHRlbnNpb25zKGVkaXRNb2RlbElEKSk7CisJCQorCQlyZXR1cm4gZXh0ZW5zaW9uczsKKwl9CisJCisJcHVibGljIElFZGl0TW9kZWxGYWN0b3J5IGZpbmRFZGl0TW9kZWxGYWN0b3J5QnlLZXkoT2JqZWN0IGVkaXRNb2RlbElEKSB7CisJCUlFZGl0TW9kZWxGYWN0b3J5IGZhY3RvcnkgPSBudWxsOworCQlFZGl0TW9kZWxJbmZvIGVkaXRNZGxJbmZvID0gKEVkaXRNb2RlbEluZm8pIGZhY3RvcnlDb25maWd1cmF0aW9ucy5nZXQoZWRpdE1vZGVsSUQpOworCQlpZiAoZWRpdE1kbEluZm8gIT0gbnVsbCkKKwkJCWZhY3RvcnkgPSBlZGl0TWRsSW5mby5nZXRFZGl0TW9kZWxGYWN0b3J5KCk7CisJCXJldHVybiBmYWN0b3J5OyAKKwl9CisJCisJcHVibGljIElFZGl0TW9kZWxGYWN0b3J5IGZpbmRFZGl0TW9kZWxGYWN0b3J5QnlQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKKwkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJaWYgKGZhY2V0ZWRQcm9qZWN0ID09IG51bGwpIHJldHVybiBudWxsOworCQlJdGVyYXRvciBrZXlzID0gZmFjdG9yeUNvbmZpZ3VyYXRpb25zLmtleVNldCgpLml0ZXJhdG9yKCk7CisJCXdoaWxlIChrZXlzLmhhc05leHQoKSkgeworCQkJT2JqZWN0IGtleSA9IGtleXMubmV4dCgpOworCQkJaWYgKGtleSBpbnN0YW5jZW9mIFN0cmluZykgeworCQkJCXRyeSB7CisJCQkJCUlQcm9qZWN0RmFjZXQgcHJvamVjdEZhY2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KChTdHJpbmcpa2V5KTsKKwkJCQkJaWYgKHByb2plY3RGYWNldCAhPSBudWxsICYmIGZhY2V0ZWRQcm9qZWN0Lmhhc1Byb2plY3RGYWNldChwcm9qZWN0RmFjZXQpKQorCQkJCQkJcmV0dXJuIGZpbmRFZGl0TW9kZWxGYWN0b3J5QnlLZXkoa2V5KTsKKwkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJCisJCQl9CisJCX0KKwkJCisJCXJldHVybiBudWxsOworCX0KKworCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldEFsbEVkaXRNb2RlbFJlc291cmNlcyhTdHJpbmcgZWRpdE1vZGVsSUQpIHsKKwkJQ29sbGVjdGlvbiByZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCXJlc291cmNlcy5hZGRBbGwoZ2V0TG9jYWxFZGl0TW9kZWxSZXNvdXJjZXMoZWRpdE1vZGVsSUQpKTsKKwkJcmVzb3VyY2VzLmFkZEFsbChnZXRFeHRlbmRlZEVkaXRNb2RlbFJlc291cmNlcyhlZGl0TW9kZWxJRCkpOworCQlyZXR1cm4gcmVzb3VyY2VzOworCX0KKwkKKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRBbGxFZGl0TW9kZWxFeHRlbnNpb25zKFN0cmluZyBlZGl0TW9kZWxJRCkgeworCQlDb2xsZWN0aW9uIHJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJcmVzb3VyY2VzLmFkZEFsbChnZXRMb2NhbEVkaXRNb2RlbEV4dGVuc2lvbnMoZWRpdE1vZGVsSUQpKTsKKwkJcmV0dXJuIHJlc291cmNlczsKKwl9CisKKwlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRMb2NhbEVkaXRNb2RlbFJlc291cmNlcyhTdHJpbmcgZWRpdE1vZGVsSUQpIHsgCisJCUVkaXRNb2RlbEluZm8gZWRpdE1kbEluZm8gPSBnZXRFZGl0TW9kZWxJbmZvQnlJZChlZGl0TW9kZWxJRCk7CisgIAkJcmV0dXJuIChlZGl0TWRsSW5mbyAhPSBudWxsKSA/IGVkaXRNZGxJbmZvLmdldEVkaXRNb2RlbFJlc291cmNlcygpIDogQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsgCisJfQorCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldExvY2FsRWRpdE1vZGVsRXh0ZW5zaW9ucyhTdHJpbmcgZWRpdE1vZGVsSUQpIHsgCisJCUVkaXRNb2RlbEluZm8gZWRpdE1kbEluZm8gPSBnZXRFZGl0TW9kZWxJbmZvQnlJZChlZGl0TW9kZWxJRCk7CisgIAkJcmV0dXJuIChlZGl0TWRsSW5mbyAhPSBudWxsKSA/IGVkaXRNZGxJbmZvLmdldEVkaXRNb2RlbEV4dGVuc2lvbnMoKSA6IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7IAorCX0KKworCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldEV4dGVuZGVkRWRpdE1vZGVsUmVzb3VyY2VzKFN0cmluZyBlZGl0TW9kZWxJRCkgeworCQlyZXR1cm4gRWRpdE1vZGVsRXh0ZW5zaW9uUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRFZGl0TW9kZWxSZXNvdXJjZXMoZWRpdE1vZGVsSUQpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBlZGl0TW9kZWxLZXkKKwkgKiAgICAgICAgICAgIHRoZSBlZGl0TW9kZWxJRCBvZiBhIGdpdmVuIEVkaXRNb2RlbEZhY3RvcnkgZGVmaW5lZCBpbiB0aGUgRXh0ZW5zaW9uIFBvaW50CisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiBhIElFZGl0TW9kZWxGYWN0b3J5IGNhbm5vdCBiZSBmb3VuZCBmb3IgdGhlIGdpdmVuIElELgorCSAqIEByZXR1cm4gdGhlIEVkaXRNb2RlbEZhY3RvcnkgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gRWRpdE1vZGVsSUQKKwkgKi8KKwlwcm90ZWN0ZWQgSUVkaXRNb2RlbEZhY3RvcnkgZ2V0RWRpdE1vZGVsRmFjdG9yeUJ5S2V5KE9iamVjdCBlZGl0TW9kZWxJRCkgeworCQlJRWRpdE1vZGVsRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKKwkJRWRpdE1vZGVsSW5mbyBlZGl0TWRsSW5mbyA9IGdldEVkaXRNb2RlbEluZm9CeUlkKGVkaXRNb2RlbElEKTsKKwkJaWYgKGVkaXRNZGxJbmZvICE9IG51bGwpCisJCQlmYWN0b3J5ID0gZWRpdE1kbEluZm8uZ2V0RWRpdE1vZGVsRmFjdG9yeSgpOworCQllbHNlCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKEVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKEVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuRWRpdE1vZGVsUmVnaXN0cnlfRVJST1JfMiwgbmV3IE9iamVjdFtde2VkaXRNb2RlbElEfSkpOworCisJCXJldHVybiBmYWN0b3J5OworCX0KKwkKKwkvKioKKyAgICAgKiBAcGFyYW0gZWRpdE1vZGVsSUQKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHJvdGVjdGVkIEVkaXRNb2RlbEluZm8gZ2V0RWRpdE1vZGVsSW5mb0J5SWQoT2JqZWN0IGVkaXRNb2RlbElEKSB7CisgICAgICAgIHdhaXRGb3JJbml0aWFsaXphdGlvbklmTmVjZXNzYXJ5KCk7CisgICAgICAgIHJldHVybiAoRWRpdE1vZGVsSW5mbykgZmFjdG9yeUNvbmZpZ3VyYXRpb25zLmdldChlZGl0TW9kZWxJRCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIElmIHdlIGFyZSBub3QgaW5pdGlhbGl6ZWQsIGJsb2NrIHVudGlsIHRoZSBJTlNUQU5DRSBpcyByZWxlYXNlZCAoIGZyb20gZ2V0SW5zdGFuY2UoKSkKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgd2FpdEZvckluaXRpYWxpemF0aW9uSWZOZWNlc3NhcnkoKSB7CisgICAgICAgIC8qIFdlIG9ubHkgbmVlZCB0byBhY3F1aXJlIHRoZSBzZW1hcGhvcmUgKElOU1RBTkNFKSwgd2UgZG8gbm90IG5lZWQgCisgICAgICAgICAqIHRvIGV4ZWN1dGUgYW55dGhpbmcgaW4gdGhpcyBibG9jay4gSWYgdGhlIFJlZ2lzdHJ5IGlzIG5vdCBpbml0YWlsaXplZCwKKyAgICAgICAgICogdGhlbiBpdCB3aWxsIGJsb2NrIHVudGlsIHRoZSBzZW1hcGhvcmUgaXMgcmVsZWFzZWQgKGZyb20gZ2V0SW5zdGFuY2UoKSksCisgICAgICAgICAqIGFuZCB0aGVuIHJlbGVhc2UgaXQgYW5kIHJldHVybiBpbW1lZGlhdGVseS4gCisgICAgICAgICAqLworCQlpZighaXNJbml0aWFsaXplZCgpKSAKKwkJICAgIHN5bmNocm9uaXplZChJTlNUQU5DRSkgeyB9CisgICAgfQorCisJcHVibGljIGNsYXNzIEVkaXRNb2RlbEluZm8geworCisJCXByaXZhdGUgU3RyaW5nIGVkaXRNb2RlbElEID0gbnVsbDsKKwkJcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlndXJhdGlvbkVsZW1lbnQgPSBudWxsOworCisJCXByaXZhdGUgSUVkaXRNb2RlbEZhY3RvcnkgZmFjdG9yeSA9IG51bGw7CisJCXByaXZhdGUgTGlzdCBlZGl0TW9kZWxSZXNvdXJjZXMgPSBudWxsOworCQlwcml2YXRlIExpc3QgZWRpdE1vZGVsRXh0ZW5zaW9ucyA9IG51bGw7CisKKwkJcHJpdmF0ZSBTdHJpbmcgcGFyZW50TW9kZWxJRCA9IG51bGw7CisKKwkJcHJpdmF0ZSBTdHJpbmcgdG9zdHJpbmdDYWNoZSA9IG51bGw7CisKKwkJcHVibGljIEVkaXRNb2RlbEluZm8oU3RyaW5nIGVkaXRNb2RlbElELCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlndXJhdGlvbkVsZW1lbnQpIHsKKworCQkJdGhpcy5jb25maWd1cmF0aW9uRWxlbWVudCA9IGNvbmZpZ3VyYXRpb25FbGVtZW50OworCQkJdGhpcy5lZGl0TW9kZWxJRCA9IGVkaXRNb2RlbElEOworCQkJdGhpcy5wYXJlbnRNb2RlbElEID0gdGhpcy5jb25maWd1cmF0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoUEFSRU5UX01PREVMX0FUVFIpOworCQl9CisKKworCQlwdWJsaWMgTGlzdCBnZXRFZGl0TW9kZWxSZXNvdXJjZXMoKSB7CisJCQkvKiB0aGlzIG1ldGhvZCBpcyBndWFyZGVkICovCisJCQlpbml0aWFsaXplUmVzb3VyY2VzKCk7CisJCQlyZXR1cm4gZWRpdE1vZGVsUmVzb3VyY2VzOworCQl9CisKKwkJcHVibGljIElFZGl0TW9kZWxGYWN0b3J5IGdldEVkaXRNb2RlbEZhY3RvcnkoKSB7CisvLwkJCSBEbyBub3QgYmxvY2sgaWYgdGhlIGZhY3RvcnkgaXMgbm90IG51bGwKKwkJCWlmICh0aGlzLmZhY3RvcnkgPT0gbnVsbCkgeworCQkJICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKwkJCSAgICAgIC8vIGFub3RoZXIgdGhyZWFkIGNvdWxkIGhhdmUgYWxyZWFkeSBpbml0aWFsaXplZCB0aGUgZmFjdG9yeQorCQkJICAgICAgLy8gd2hpbGUgdGhpcyB0aHJlYWQgd2FzIHdhaXRpbmcgdG8gZW50ZXIgdGhlIHN5bmMgYmxvY2sKKwkJCSAgICAgIGlmKHRoaXMuZmFjdG9yeSA9PSBudWxsKSB7CisJCQkJCWlmICh0aGlzLmNvbmZpZ3VyYXRpb25FbGVtZW50ICE9IG51bGwpIHsKKwkJCQkJCXRyeSB7CisJCQkJCQkJdGhpcy5mYWN0b3J5ID0gKElFZGl0TW9kZWxGYWN0b3J5KSB0aGlzLmNvbmZpZ3VyYXRpb25FbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oRkFDVE9SWV9DTEFTU19BVFRSKTsKKwkJCQkJCQlCb29sZWFuIHZhbHVlID0gQm9vbGVhbi52YWx1ZU9mKHRoaXMuY29uZmlndXJhdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKExPQURfVU5LTk9XTl9SRVNPVVJDRVNfQVRUUikpOworCQkJCQkJCXRoaXMuZmFjdG9yeS5zZXRMb2FkS25vd25SZXNvdXJjZXNBc1JlYWRPbmx5KHZhbHVlLmJvb2xlYW5WYWx1ZSgpKTsKKwkJCQkJCQlkaXNjYXJkQ29uZmlndXJhdGlvbkVsZW1lbnRJZk5lY2Vzc2FyeSgpOworCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJTG9nZ2VyLmdldExvZ2dlcihFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLklEKS5sb2dFcnJvcihlKTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihFTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLkVkaXRNb2RlbFJlZ2lzdHJ5X0VSUk9SXzEpOworCQkJCQl9CisJCQkgICAgICB9CisJCQkgICAgfQorCQkJfQorCQkJcmV0dXJuIHRoaXMuZmFjdG9yeTsKKwkJfQorCisJCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgaW5pdGlhbGl6ZVJlc291cmNlcygpIHsKKworCQkJaWYgKGVkaXRNb2RlbFJlc291cmNlcyA9PSBudWxsKSB7CisJCQkJaWYgKGNvbmZpZ3VyYXRpb25FbGVtZW50ICE9IG51bGwpIHsKKworCQkJCQllZGl0TW9kZWxSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKwkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gcmVzb3VyY2VzID0gY29uZmlndXJhdGlvbkVsZW1lbnQuZ2V0Q2hpbGRyZW4oRWRpdE1vZGVsUmVzb3VyY2UuRURJVF9NT0RFTF9SRVNPVVJDRV9FTEVNRU5UKTsKKwkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gcmVzRXh0ZW5zaW9ucyA9IGNvbmZpZ3VyYXRpb25FbGVtZW50LmdldENoaWxkcmVuKEVESVRfTU9ERUxfUkVTT1VSQ0VfRVhURU5TSU9OKTsKKwkJCQkJLy8gc2V0IHRoZSBjb25maWd1cmF0aW9uRWxlbWVudCB0byBudWxsLSBrZWVwcyBjb2RlIGZyb20gcmVlbnRlcmluZworCQkJCQlkaXNjYXJkQ29uZmlndXJhdGlvbkVsZW1lbnRJZk5lY2Vzc2FyeSgpOworCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHJlc291cmNlcy5sZW5ndGg7IGorKykgeworCQkJCQkJZWRpdE1vZGVsUmVzb3VyY2VzLmFkZChuZXcgRWRpdE1vZGVsUmVzb3VyY2UocmVzb3VyY2VzW2pdKSk7CisJCQkJCX0KKwkJCQkJaWYgKHJlc0V4dGVuc2lvbnMgPT0gbnVsbCB8fCByZXNFeHRlbnNpb25zLmxlbmd0aCA9PSAwKSB7CisJCQkJCQllZGl0TW9kZWxFeHRlbnNpb25zID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWVkaXRNb2RlbEV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc0V4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKKwkJCQkJCQlTdHJpbmcgZXh0ZW5zaW9uID0gcmVzRXh0ZW5zaW9uc1tpXS5nZXRBdHRyaWJ1dGUoRURJVF9NT0RFTF9SRVNPVVJDRV9FWFRFTlNJT05fTkFNRSk7CisJCQkJCQkJZWRpdE1vZGVsRXh0ZW5zaW9ucy5hZGQoZXh0ZW5zaW9uKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWVkaXRNb2RlbFJlc291cmNlcyA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CisJCQkJCWVkaXRNb2RlbEV4dGVuc2lvbnMgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXByaXZhdGUgdm9pZCBkaXNjYXJkQ29uZmlndXJhdGlvbkVsZW1lbnRJZk5lY2Vzc2FyeSgpIHsKKwkJCWlmICh0aGlzLmVkaXRNb2RlbFJlc291cmNlcyAhPSBudWxsICYmIHRoaXMuZmFjdG9yeSAhPSBudWxsKQorCQkJCXRoaXMuY29uZmlndXJhdGlvbkVsZW1lbnQgPSBudWxsOworCQl9CisKKwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCWlmICh0b3N0cmluZ0NhY2hlID09IG51bGwpCisJCQkJdG9zdHJpbmdDYWNoZSA9ICJFZGl0TW9kZWxJRDogeyIgKyB0aGlzLmVkaXRNb2RlbElEICsgIn0sIFBhcmVudCBNb2RlbCBJRCB7IiArIHRoaXMucGFyZW50TW9kZWxJRCArICJ9LCBDb25maWd1cmF0aW9uIEVsZW1lbnQ6IFsiICsgdGhpcy5jb25maWd1cmF0aW9uRWxlbWVudCArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTQkCisJCQlyZXR1cm4gdG9zdHJpbmdDYWNoZTsKKwkJfQorCisJCS8qKgorCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhcmVudE1vZGVsSUQuCisJCSAqLworCQlwdWJsaWMgU3RyaW5nIGdldFBhcmVudE1vZGVsSUQoKSB7CisJCQlyZXR1cm4gcGFyZW50TW9kZWxJRDsKKwkJfQorCQkKKwkJcHVibGljIExpc3QgZ2V0RWRpdE1vZGVsRXh0ZW5zaW9ucygpIHsKKwkJCS8qIHRoaXMgbWV0aG9kIGlzIGd1YXJkZWQgKi8KKwkJCWluaXRpYWxpemVSZXNvdXJjZXMoKTsKKwkJCXJldHVybiBlZGl0TW9kZWxFeHRlbnNpb25zOworCQl9CisKKwl9CisJLyoqCisJICogQHJldHVybiBSZXR1cm5zIHRoZSBpbml0aWFsaXplZC4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKKwkJcmV0dXJuIGluaXRpYWxpemVkOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nW10gZ2V0UmVnaXN0ZXJlZEVkaXRNb2RlbElEcygpIHsKKwkJcmV0dXJuIChTdHJpbmdbXSkgZmFjdG9yeUNvbmZpZ3VyYXRpb25zLmtleVNldCgpLnRvQXJyYXkobmV3IFN0cmluZ1tmYWN0b3J5Q29uZmlndXJhdGlvbnMua2V5U2V0KCkuc2l6ZSgpXSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9FZGl0TW9kZWxSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9FZGl0TW9kZWxSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NTQzYWMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0VkaXRNb2RlbFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKKyAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBDcmVhdGVkIG9uIEZlYiA1LCAyMDA0CisgKiAKKyAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZQorICogR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cworICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQ7CisKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuQWJzdHJhY3RSZWdpc3RyeURlc2NyaXB0b3I7CisKKworCitwdWJsaWMgY2xhc3MgRWRpdE1vZGVsUmVzb3VyY2UgZXh0ZW5kcyBBYnN0cmFjdFJlZ2lzdHJ5RGVzY3JpcHRvciBpbXBsZW1lbnRzIENvbXBhcmFibGUgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRfTU9ERUxfVVJJX0FUVFIgPSAiVVJJIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVE9fTE9BRF9BVFRSID0gImF1dG9sb2FkIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRfTU9ERUxfUkVTT1VSQ0VfRUxFTUVOVCA9ICJlZGl0TW9kZWxSZXNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgc3RhdGljIGludCBsb2FkT3JkZXJDb3VudGVyID0gMTsKKwlwcml2YXRlIFVSSSB1cmk7CisJcHJpdmF0ZSBib29sZWFuIGF1dG9sb2FkID0gZmFsc2U7CisJLy9JbmRpY2F0ZXMgaWYgdGhpcyB3YXMgZGVmaW5lZCBhcyBwYXJ0IG9mIHRoZSBlZGl0IG1vZGVsLAorCS8vYXMgb3Bwb3NlZCB0byBhbiBleHRlbnNpb24KKwlwcml2YXRlIGJvb2xlYW4gaXNDb3JlID0gdHJ1ZTsKKworCXByaXZhdGUgU3RyaW5nIGV4dGVuc2lvbklEOworCisJcHJpdmF0ZSBpbnQgbG9hZE9yZGVyOworCisJcHVibGljIEVkaXRNb2RlbFJlc291cmNlKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7CisJCXN1cGVyKGVsZW1lbnQpOworCQlTdHJpbmcgc3RyVXJpID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoRURJVF9NT0RFTF9VUklfQVRUUik7CisJCWlmIChzdHJVcmkgIT0gbnVsbCkKKwkJCUVkaXRNb2RlbFJlc291cmNlLnRoaXMudXJpID0gVVJJLmNyZWF0ZVVSSShzdHJVcmkpOworCisJCVN0cmluZyBzdHJMb2FkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVVUT19MT0FEX0FUVFIpOworCQlpZiAoc3RyTG9hZCAhPSBudWxsKQorCQkJYXV0b2xvYWQgPSBCb29sZWFuLnZhbHVlT2Yoc3RyTG9hZCkuYm9vbGVhblZhbHVlKCk7CisJCWxvYWRPcmRlciA9IGxvYWRPcmRlckNvdW50ZXIrKzsKKwl9CisKKwlwdWJsaWMgRWRpdE1vZGVsUmVzb3VyY2UoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFN0cmluZyBleHRlbnNpb25JRCkgeworCQl0aGlzKGVsZW1lbnQpOworCQl0aGlzLmV4dGVuc2lvbklEID0gZXh0ZW5zaW9uSUQ7CisJCWlzQ29yZSA9IGZhbHNlOworCX0KKworCXB1YmxpYyBVUkkgZ2V0VVJJKCkgeworCQlyZXR1cm4gdXJpOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzQXV0b0xvYWQoKSB7CisJCXJldHVybiBhdXRvbG9hZDsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5BYnN0cmFjdFJlZ2lzdHJ5RGVzY3JpcHRvciNnZXRJRCgpCisJICovCisJcHVibGljIFN0cmluZyBnZXRJRCgpIHsKKwkJcmV0dXJuIGV4dGVuc2lvbklEOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkFic3RyYWN0UmVnaXN0cnlEZXNjcmlwdG9yI2dldFByaW9yaXR5KCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldFByaW9yaXR5KCkgeworCQlpZiAoaXNDb3JlKQorCQkJcmV0dXJuIDA7CisJCXJldHVybiBzdXBlci5nZXRQcmlvcml0eSgpOworCX0KKworCS8qKgorCSAqIHJldHVybiB3aGV0aGVyIHRoaXMgcmVzb3VyY2UgaXMgZGVmaW5lZCBhcyBwYXJ0IG9mIHRoZSBlZGl0IG1vZGVsIGRlZmluaXRpb24gYXMgb3Bwb3NlZCB0byBhbgorCSAqIGV4dGVuc2lvbgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQ29yZSgpIHsKKwkJcmV0dXJuIGlzQ29yZTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIGphdmEubGFuZy5Db21wYXJhYmxlI2NvbXBhcmVUbyhqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCXB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvKSB7CisJCWlmICghKG8gaW5zdGFuY2VvZiBFZGl0TW9kZWxSZXNvdXJjZSkpCisJCQlyZXR1cm4gMTsKKwkJRWRpdE1vZGVsUmVzb3VyY2UgcmVzID0gKEVkaXRNb2RlbFJlc291cmNlKSBvOworCQlpbnQgdmFsdWUgPSBnZXRQcmlvcml0eSgpIC0gcmVzLmdldFByaW9yaXR5KCk7CisJCWlmICh2YWx1ZSA9PSAwKQorCQkJcmV0dXJuIGxvYWRPcmRlciAtIHJlcy5sb2FkT3JkZXI7CisJCXJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxvYWRPcmRlci4KKwkgKi8KKwlwdWJsaWMgaW50IGdldExvYWRPcmRlcigpIHsKKwkJcmV0dXJuIGxvYWRPcmRlcjsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9FZGl0TW9kZWxSZXRyaWV2ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRWRpdE1vZGVsUmV0cmlldmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVmYjhjMQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvRWRpdE1vZGVsUmV0cmlldmVyLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQorICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0OworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsOworCisKKworcHVibGljIGNsYXNzIEVkaXRNb2RlbFJldHJpZXZlciB7CisJcHJpdmF0ZSBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQ7CisJcHJpdmF0ZSBTdHJpbmcgZWRpdE1vZGVsSUQ7CisJcHJpdmF0ZSBNYXAgZWRpdE1vZGVsUGFybXM7CisKKwkvKioKKwkgKiBFZGl0TW9kZWxSZXRyaWV2ZXIgY29uc3RydWN0b3IgY29tbWVudC4KKwkgKi8KKwlwdWJsaWMgRWRpdE1vZGVsUmV0cmlldmVyKEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCwgU3RyaW5nIGVkaXRNb2RlbEtleSwgTWFwIHBhcm1zKSB7CisJCXN1cGVyKCk7CisJCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisJCWVkaXRNb2RlbElEID0gZWRpdE1vZGVsS2V5OworCQllZGl0TW9kZWxQYXJtcyA9IHBhcm1zOworCX0KKworCXB1YmxpYyBFZGl0TW9kZWwgZ2V0RWRpdE1vZGVsRm9yUmVhZChPYmplY3QgYWNjZXNzb3JLZXkpIHsKKwkJcmV0dXJuIGNvbnRleHQuZ2V0RWRpdE1vZGVsRm9yUmVhZChnZXRFZGl0TW9kZWxJRCgpLCBhY2Nlc3NvcktleSwgZWRpdE1vZGVsUGFybXMpOworCX0KKworCXB1YmxpYyBFZGl0TW9kZWwgZ2V0RWRpdE1vZGVsRm9yV3JpdGUoT2JqZWN0IGFjY2Vzc29yS2V5KSB7CisJCXJldHVybiBjb250ZXh0LmdldEVkaXRNb2RlbEZvcldyaXRlKGdldEVkaXRNb2RlbElEKCksIGFjY2Vzc29yS2V5LCBlZGl0TW9kZWxQYXJtcyk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRFZGl0TW9kZWxJRCgpIHsKKwkJcmV0dXJuIGVkaXRNb2RlbElEOworCX0KKworCXB1YmxpYyBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQoKSB7CisJCXJldHVybiBjb250ZXh0OworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0V4dGVuZGVkQ29tcG9zZWRBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9FeHRlbmRlZENvbXBvc2VkQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjI2Y2YzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9FeHRlbmRlZENvbXBvc2VkQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBDcmVhdGVkIG9uIERlYyAzLCAyMDAzCisgKiAKKyAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KKyAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cworICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7CisKKy8qKgorICogQGF1dGhvciBzY2hhY2hlcgorICogCisgKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KKyAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cworICovCitwdWJsaWMgY2xhc3MgRXh0ZW5kZWRDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSB7CisKKwkvKioKKwkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKKwkgKi8KKwlwdWJsaWMgRXh0ZW5kZWRDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcmllcworCSAqLworCXB1YmxpYyBFeHRlbmRlZENvbXBvc2VkQWRhcHRlckZhY3RvcnkoQWRhcHRlckZhY3RvcnlbXSBhZGFwdGVyRmFjdG9yaWVzKSB7CisJCXN1cGVyKGFkYXB0ZXJGYWN0b3JpZXMpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yaWVzCisJICovCisJcHVibGljIEV4dGVuZGVkQ29tcG9zZWRBZGFwdGVyRmFjdG9yeShDb2xsZWN0aW9uIGFkYXB0ZXJGYWN0b3JpZXMpIHsKKwkJc3VwZXIoYWRhcHRlckZhY3Rvcmllcyk7CisJfQorCisJLyoKKwkgKiBvdmVycm9kZSBmcm9tIHRoZSBzdXBlciBjbGFzcywgY2hhbmdlZCBub3QgdG8gY2hlY2sgc3VwZXJ0eXBlcyBvZiB0aGUgRU9iamVjdCwgYmVjYXVzZSB0aGF0CisJICogd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSBEeW5hbWljQWRhcHRlckZhY3RvcnkKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5I2FkYXB0KG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyLAorCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKSB7CisJCUFkYXB0ZXIgcmVzdWx0ID0gbnVsbDsKKworCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgRU9iamVjdCkgeworCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIHRhcmdldDsKKwkJCUVDbGFzcyBlQ2xhc3MgPSBlT2JqZWN0LmVDbGFzcygpOworCQkJaWYgKGVDbGFzcyAhPSBudWxsKSB7CisJCQkJRVBhY2thZ2UgZVBhY2thZ2UgPSBlQ2xhc3MuZ2V0RVBhY2thZ2UoKTsKKwkJCQlDb2xsZWN0aW9uIHR5cGVzID0gbmV3IEFycmF5TGlzdCgpOworCQkJCXR5cGVzLmFkZChlUGFja2FnZSk7CisJCQkJaWYgKHR5cGUgIT0gbnVsbCkgeworCQkJCQl0eXBlcy5hZGQodHlwZSk7CisJCQkJfQorCQkJCS8qIHdoZW4gYW4gZXJyb3Igb2NjdXJzLCByZW1vdmUgdGhlIGRlbGVnYXRlIGFuZCB0cnkgYWdhaW4gKi8KKwkJCQlib29sZWFuIGF0dGVtcHRBZGFwdEFnYWluID0gdHJ1ZTsKKwkJCQl3aGlsZSAocmVzdWx0ID09IG51bGwgJiYgYXR0ZW1wdEFkYXB0QWdhaW4pIHsKKwkJCQkJYXR0ZW1wdEFkYXB0QWdhaW4gPSBmYWxzZTsKKwkJCQkJQWRhcHRlckZhY3RvcnkgZGVsZWdhdGVBZGFwdGVyRmFjdG9yeSA9IGdldEZhY3RvcnlGb3JUeXBlcyh0eXBlcyk7CisJCQkJCWlmIChkZWxlZ2F0ZUFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKKwkJCQkJCXRyeSB7CisJCQkJCQkJcmVzdWx0ID0gZGVsZWdhdGVBZGFwdGVyRmFjdG9yeS5hZGFwdCh0YXJnZXQsIHR5cGUpOworCQkJCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworCQkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihyZSk7CisJCQkJCQkJYWRhcHRlckZhY3Rvcmllcy5yZW1vdmUoZGVsZWdhdGVBZGFwdGVyRmFjdG9yeSk7CisJCQkJCQkJYXR0ZW1wdEFkYXB0QWdhaW4gPSB0cnVlOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJcmVzdWx0ID0gYWRhcHQodGFyZ2V0LCB0eXBlLCBuZXcgSGFzaFNldCgpLCB0YXJnZXQuZ2V0Q2xhc3MoKSk7CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvSW52ZXJ0ZWRDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0ludmVydGVkQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYmNiMTEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L0ludmVydGVkQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQ7CisKKworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uQWJzdHJhY3RFZGl0TW9kZWxDb21tYW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbENvbW1hbmQ7CisKKy8qKgorICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA1LzIyLzAxIDg6NTg6MjQgQU0pCisgKiAKKyAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKKyAqLworcHVibGljIGNsYXNzIEludmVydGVkQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RWRpdE1vZGVsQ29tbWFuZCB7CisJcHVibGljIEludmVydGVkQ29tbWFuZChDb21tYW5kIHRhcmdldENvbW1hbmQpIHsKKwkJc3VwZXIodGFyZ2V0Q29tbWFuZCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKKwkJcmV0dXJuIGdldFRhcmdldCgpLmNhblVuZG8oKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgeworCQlyZXR1cm4gZ2V0VGFyZ2V0KCkuY2FuRXhlY3V0ZSgpOworCX0KKworCS8qKgorCSAqIERvZXMgbm90aGluZworCSAqLworCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CisJCS8vZG9lcyBub3RoaW5nCisJfQorCisJLyoqCisJICogZ2V0RWRpdE1vZGVsQ29tbWFuZCBtZXRob2QgY29tbWVudC4KKwkgKi8KKwlwdWJsaWMgRWRpdE1vZGVsQ29tbWFuZCBnZXRFZGl0TW9kZWxDb21tYW5kKCkgeworCQlyZXR1cm4gKChBYnN0cmFjdEVkaXRNb2RlbENvbW1hbmQpIGdldFRhcmdldCgpKS5nZXRFZGl0TW9kZWxDb21tYW5kKCk7CisJfQorCisJcHJvdGVjdGVkIGludCBpbnZlcnNpb25EZXB0aCgpIHsKKwkJaWYgKGdldEVkaXRNb2RlbENvbW1hbmQoKSA9PSBnZXRUYXJnZXQoKSkKKwkJCXJldHVybiAxOworCQlyZXR1cm4gKChJbnZlcnRlZENvbW1hbmQpIGdldFRhcmdldCgpKS5pbnZlcnNpb25EZXB0aCgpICsgMTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nIGxhYmVsUHJlZml4KCkgeworCQlyZXR1cm4gaW52ZXJzaW9uRGVwdGgoKSAlIDIgPT0gMSA/ICJVbmRvICIgOiAiUmVkbyAiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCisJfQorCisJcHVibGljIHZvaWQgcmVkbygpIHsKKwkJZ2V0VGFyZ2V0KCkudW5kbygpOworCX0KKworCXB1YmxpYyB2b2lkIHVuZG8oKSB7CisJCWdldFRhcmdldCgpLnJlZG8oKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L1BhcmVudENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvUGFyZW50Q29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljN2RjOTAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L1BhcmVudENvbW1hbmQuamF2YQpAQCAtMCwwICsxLDE1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQ7CisKKworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5BYnN0cmFjdEVkaXRNb2RlbENvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uQ29tcG9zZWRFZGl0TW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbENvbW1hbmQ7CisKKy8qKgorICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA1LzIyLzAxIDg6NTc6MzggQU0pCisgKiAKKyAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKKyAqLworcHVibGljIGNsYXNzIFBhcmVudENvbW1hbmQgZXh0ZW5kcyBFZGl0TW9kZWxDb21tYW5kIHsKKwlwcml2YXRlIExpc3QgY2hpbGRyZW47CisJcHJpdmF0ZSBDb21wb3NlZEVkaXRNb2RlbCBlZGl0TW9kZWw7CisJcHJpdmF0ZSBMaXN0IGFmZmVjdGVkTW9kZWxzOworCisJcHVibGljIFBhcmVudENvbW1hbmQoQ29tbWFuZCB0YXJnZXRDb21tYW5kLCBDb21wb3NlZEVkaXRNb2RlbCBhbkVkaXRNb2RlbCkgeworCQlzdXBlcih0YXJnZXRDb21tYW5kKTsKKwkJZWRpdE1vZGVsID0gYW5FZGl0TW9kZWw7CisJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgxKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgeworCQlyZXR1cm4gZ2V0VGFyZ2V0KCkuY2FuRXhlY3V0ZSgpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGNvbXB1dGVBZmZlY3RlZE1vZGVscygpIHsKKwkJUmVzb3VyY2VTZXQgc2V0ID0gbnVsbDsKKwkJTGlzdCBlZGl0TW9kZWxzID0gZ2V0RWRpdE1vZGVsKCkuZ2V0Q2hpbGRyZW4oKTsKKwkJSXRlcmF0b3IgaXQgPSBjb21wdXRlQWZmZWN0ZWRSZXNvdXJjZVNldHMoKS5pdGVyYXRvcigpOworCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisJCQlzZXQgPSAoUmVzb3VyY2VTZXQpIGl0Lm5leHQoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdE1vZGVscy5zaXplKCk7IGkrKykgeworCQkJCUVkaXRNb2RlbCBtb2RlbCA9IChFZGl0TW9kZWwpIGVkaXRNb2RlbHMuZ2V0KGkpOworCQkJCWlmIChtb2RlbC5nZXRSZXNvdXJjZVNldCgpID09IHNldCkgeworCQkJCQlnZXRBZmZlY3RlZE1vZGVscygpLmFkZChuZXcgRWRpdE1vZGVsUmV0cmlldmVyKG1vZGVsLmdldEVtZkNvbnRleHQoKSwgbW9kZWwuZ2V0RWRpdE1vZGVsSUQoKSwgbW9kZWwuZ2V0UGFyYW1zKCkpKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHJvdGVjdGVkIFNldCBjb21wdXRlQWZmZWN0ZWRSZXNvdXJjZVNldHMoKSB7CisJCUl0ZXJhdG9yIG9iamVjdHMgPSBnZXRUYXJnZXQoKS5nZXRBZmZlY3RlZE9iamVjdHMoKS5pdGVyYXRvcigpOworCQlTZXQgcmVzb3VyY2VTZXRzID0gbmV3IEhhc2hTZXQoKTsKKwkJT2JqZWN0IG8gPSBudWxsOworCQlFT2JqZWN0IHJlZiA9IG51bGw7CisJCVJlc291cmNlU2V0IHNldCA9IG51bGw7CisJCXdoaWxlIChvYmplY3RzLmhhc05leHQoKSkgeworCQkJbyA9IG9iamVjdHMubmV4dCgpOworCQkJaWYgKCEobyBpbnN0YW5jZW9mIEVPYmplY3QpKQorCQkJCWNvbnRpbnVlOworCQkJcmVmID0gKEVPYmplY3QpIG87CisJCQlpZiAocmVmLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKKwkJCQlzZXQgPSByZWYuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKKwkJCQlpZiAoc2V0ICE9IG51bGwpCisJCQkJCXJlc291cmNlU2V0cy5hZGQoc2V0KTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzb3VyY2VTZXRzOworCX0KKworCXByb3RlY3RlZCBDaGlsZENvbW1hbmQgY3JlYXRlQ2hpbGRDb21tYW5kKEVkaXRNb2RlbFJldHJpZXZlciByZXRyaWV2ZXIpIHsKKwkJcmV0dXJuIG5ldyBDaGlsZENvbW1hbmQodGhpcywgZ2V0VGFyZ2V0KCksIHJldHJpZXZlcik7CisJfQorCisJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKKwkJZ2V0VGFyZ2V0KCkuZXhlY3V0ZSgpOworCQljb21wdXRlQWZmZWN0ZWRNb2RlbHMoKTsKKwkJcHVzaENoaWxkcmVuRm9yRXhlY3V0ZSgpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGVJbk1vZGVsKEFic3RyYWN0RWRpdE1vZGVsQ29tbWFuZCBjbWQpIHsKKwkJZ2V0RWRpdE1vZGVsKCkuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjbWQpOworCX0KKworCXByb3RlY3RlZCBMaXN0IGdldEFmZmVjdGVkTW9kZWxzKCkgeworCQlpZiAoYWZmZWN0ZWRNb2RlbHMgPT0gbnVsbCkKKwkJCWFmZmVjdGVkTW9kZWxzID0gbmV3IEFycmF5TGlzdCgxKTsKKwkJcmV0dXJuIGFmZmVjdGVkTW9kZWxzOworCX0KKworCXByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuKCkgeworCQlyZXR1cm4gY2hpbGRyZW47CisJfQorCisJcHJvdGVjdGVkIENvbXBvc2VkRWRpdE1vZGVsIGdldEVkaXRNb2RlbCgpIHsKKwkJcmV0dXJuIGVkaXRNb2RlbDsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBpbnZlcnRDaGlsZHJlbigpIHsKKwkJaW52ZXJ0Q2hpbGRyZW5FeGNlcHQoKENoaWxkQ29tbWFuZCkgbnVsbCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgaW52ZXJ0Q2hpbGRyZW5FeGNlcHQoQ2hpbGRDb21tYW5kIGNhbGxlcikgeworCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7CisJCQlDaGlsZENvbW1hbmQgY2hpbGRDbWQgPSAoQ2hpbGRDb21tYW5kKSBjaGlsZHJlbi5nZXQoaSk7CisJCQlpZiAoY2FsbGVyID09IG51bGwgfHwgY2hpbGRDbWQgIT0gY2FsbGVyKQorCQkJCWNoaWxkQ21kLmludmVydEFuZFB1c2goKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIGludmVydEZyb20oQ2hpbGRDb21tYW5kIGNhbGxlcikgeworCQlpbnZlcnRBbmRQdXNoKCk7CisJCWludmVydENoaWxkcmVuRXhjZXB0KGNhbGxlcik7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcHVzaENoaWxkcmVuRm9yRXhlY3V0ZSgpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRBZmZlY3RlZE1vZGVscygpLnNpemUoKTsgaSsrKSB7CisJCQlFZGl0TW9kZWxSZXRyaWV2ZXIgcmV0cmlldmVyID0gKEVkaXRNb2RlbFJldHJpZXZlcikgZ2V0QWZmZWN0ZWRNb2RlbHMoKS5nZXQoaSk7CisJCQlDaGlsZENvbW1hbmQgY29tbWFuZCA9IGNyZWF0ZUNoaWxkQ29tbWFuZChyZXRyaWV2ZXIpOworCQkJZ2V0Q2hpbGRyZW4oKS5hZGQoY29tbWFuZCk7CisJCQljb21tYW5kLmV4ZWN1dGVJbk1vZGVsKGNvbW1hbmQpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgcmVkbygpIHsKKwkJZ2V0VGFyZ2V0KCkucmVkbygpOworCQlpbnZlcnRDaGlsZHJlbigpOworCX0KKworCXB1YmxpYyB2b2lkIHJlZG9Gcm9tKENoaWxkQ29tbWFuZCBjaGlsZCkgeworCQlpbnZlcnRGcm9tKGNoaWxkKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB1bmRvKCkgeworCQlnZXRUYXJnZXQoKS51bmRvKCk7CisJCWludmVydENoaWxkcmVuKCk7CisJfQorCisJcHVibGljIHZvaWQgdW5kb0Zyb20oQ2hpbGRDb21tYW5kIGNoaWxkKSB7CisJCWludmVydEZyb20oY2hpbGQpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L1JlYWRPbmx5Q2xpZW50QWNjZXNzUmVnaXN0cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2VkaXQvUmVhZE9ubHlDbGllbnRBY2Nlc3NSZWdpc3RyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NDU0MjgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L1JlYWRPbmx5Q2xpZW50QWNjZXNzUmVnaXN0cnkuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi53b3JrYmVuY2gubmxzLkVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyOworCisvKioKKyAqIFRoaXMgaXMgYSByZWFkb25seSB2ZXJzaW9uIG9mIHRoZSBlZGl0bW9kZWwgYWNjZXNzIHJlZ2lzdHJ5LCBvbmx5IHVzZXMgYSB3ZWFrIGhhc2ggZGljdGlvbmFyeSwKKyAqIGFuZCBiZWNhdXNlIHRoZSBhY2Nlc3MgaXMgcmVhZCBvbmx5LCBpcyBsZXNzIGNvbmNlcm5lZCB3aXRoIHRpbWluZyBvZiBhY2Nlc3MvcmVsZWFzZSwgYW5kIHdpbGwgYmUKKyAqIGNsZWFuZWQgdXAgb24gZ2FyYmFnZSBjb2xsZWN0aW9uIGlmIG5lZWRlZC4KKyAqIAorICovCitwdWJsaWMgY2xhc3MgUmVhZE9ubHlDbGllbnRBY2Nlc3NSZWdpc3RyeSBleHRlbmRzIENsaWVudEFjY2Vzc1JlZ2lzdHJ5IHsKKworCXB1YmxpYyBSZWFkT25seUNsaWVudEFjY2Vzc1JlZ2lzdHJ5KCkgeworCQlzdXBlcigpOworCX0KKworCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhY2Nlc3MoT2JqZWN0IGFjY2Vzc29yS2V5KSB7CisJCWlmICghcmVnaXN0cnkuY29udGFpbnNLZXkoYWNjZXNzb3JLZXkpKSB7CisJCQl0aGlzLnJlZ2lzdHJ5LnB1dChhY2Nlc3NvcktleSwgbnVsbCk7CisJCX0gZWxzZQorCQkJdGhyb3cgbmV3IENsaWVudEFjY2Vzc1JlZ2lzdHJ5RXhjZXB0aW9uKEVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuQ2xpZW50QWNjZXNzUmVnaXN0cnlfRVJST1JfMCwgYWNjZXNzb3JLZXkpOworCX0KKworCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWxlYXNlKE9iamVjdCBhY2Nlc3NvcktleSkgeworCisJCS8qCisJCSAqIEVycm9yIGNvbmRpdGlvbjogU29tZSBvbmUgaGFzIGJlZW4gbmF1Z2h0eSBhbmQgbm90IHJlbGVhc2VkIHRoZSByZXNvdXJjZQorCQkgKi8KKwkJaWYgKHRoaXMucmVnaXN0cnkuY29udGFpbnNLZXkoYWNjZXNzb3JLZXkpKSB7CisJCQl0aGlzLnJlZ2lzdHJ5LnJlbW92ZShhY2Nlc3NvcktleSk7CisJCX0gZWxzZQorCQkJY29tcGxhaW4oYWNjZXNzb3JLZXkpOworCX0KKworCXB1YmxpYyB2b2lkIGNvbXBsYWluKE9iamVjdCBhY2Nlc3NvcktleSkgeworCisJCXRocm93IG5ldyBDbGllbnRBY2Nlc3NSZWdpc3RyeUV4Y2VwdGlvbihFTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDbGllbnRBY2Nlc3NSZWdpc3RyeV9FUlJPUl8xIiksIGFjY2Vzc29yS2V5KTsgLy8kTk9OLU5MUy0xJAorCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9TbmFwc2hvdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9TbmFwc2hvdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYjY0YjQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L1NuYXBzaG90LmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBDcmVhdGVkIG9uIE9jdCAzLCAyMDAzCisgKgorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQ7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoRWRpdFJlc291cmNlSGFuZGxlcjsKKworCisvKioKKyAqIFRoZSBTbmFwc2hvdCBpcyB1c2VkIHRvIHJlbWVtYmVyIHRoZSBjYWxsIHN0YWNrIHRyYWNlIG9mIGFueSBtZXRob2QgdGhhdCBhY2Nlc3NlcyBhIFJlc291cmNlLgorICogCisgKiBAYXV0aG9yIG1kZWxkZXIKKyAqLworcHVibGljIGNsYXNzIFNuYXBzaG90IGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisKKwlwdWJsaWMgU25hcHNob3QoKSB7CisJCXN1cGVyKEVNRldvcmtiZW5jaEVkaXRSZXNvdXJjZUhhbmRsZXIuU25hcHNob3RfRVJST1JfMCk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBqYXZhLmxhbmcuVGhyb3dhYmxlI3ByaW50U3RhY2tUcmFjZSgpCisJICovCisJcHVibGljIFN0cmluZyBnZXRTdGFja1RyYWNlU3RyaW5nKCkgeworCQlTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworCQlQcmludFdyaXRlciBwcmludFdyaXRlciA9IG5ldyBQcmludFdyaXRlcih3cml0ZXIpOworCQlzdXBlci5wcmludFN0YWNrVHJhY2UocHJpbnRXcml0ZXIpOworCQlyZXR1cm4gd3JpdGVyLnRvU3RyaW5nKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9XcmFwcGluZ0NvbW1hbmRTdGFjay5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvZWRpdC9XcmFwcGluZ0NvbW1hbmRTdGFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMTUzNzEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9lZGl0L1dyYXBwaW5nQ29tbWFuZFN0YWNrLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQ7CisKKworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkNvbXBvc2VkRWRpdE1vZGVsOworCisvKioKKyAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNS8yMS8wMSA5OjMxOjAyIFBNKQorICogCisgKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCisgKi8KK3B1YmxpYyBjbGFzcyBXcmFwcGluZ0NvbW1hbmRTdGFjayBleHRlbmRzIEJhc2ljQ29tbWFuZFN0YWNrIHsKKwlwcml2YXRlIENvbXBvc2VkRWRpdE1vZGVsIGVkaXRNb2RlbDsKKworCS8qKgorCSAqIFdyYXBwaW5nQ29tbWFuZFN0YWNrIGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICovCisJcHVibGljIFdyYXBwaW5nQ29tbWFuZFN0YWNrKENvbXBvc2VkRWRpdE1vZGVsIGFuRWRpdE1vZGVsKSB7CisJCXN1cGVyKCk7CisJCWVkaXRNb2RlbCA9IGFuRWRpdE1vZGVsOworCX0KKworCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7CisJCVBhcmVudENvbW1hbmQgcGFyZW50ID0gbmV3IFBhcmVudENvbW1hbmQoY29tbWFuZCwgZWRpdE1vZGVsKTsKKwkJc3VwZXIuZXhlY3V0ZShwYXJlbnQpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9BYnN0cmFjdEVkaXRNb2RlbENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0Fic3RyYWN0RWRpdE1vZGVsQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNjFlN2QKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9BYnN0cmFjdEVkaXRNb2RlbENvbW1hbmQuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCisgKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uOworCisKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdC5JbnZlcnRlZENvbW1hbmQ7CisKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RWRpdE1vZGVsQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7CisJcHJpdmF0ZSBDb21tYW5kIHRhcmdldDsKKwlwcml2YXRlIEFic3RyYWN0RWRpdE1vZGVsQ29tbWFuZCBvd25lcjsKKworCXByb3RlY3RlZCBBYnN0cmFjdEVkaXRNb2RlbENvbW1hbmQoKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIEFic3RyYWN0RWRpdE1vZGVsQ29tbWFuZChDb21tYW5kIHRhcmdldENvbW1hbmQpIHsKKwkJc3VwZXIoKTsKKwkJdGFyZ2V0ID0gdGFyZ2V0Q29tbWFuZDsKKwl9CisKKwlwdWJsaWMgYWJzdHJhY3QgRWRpdE1vZGVsQ29tbWFuZCBnZXRFZGl0TW9kZWxDb21tYW5kKCk7CisKKwlwcm90ZWN0ZWQgQWJzdHJhY3RFZGl0TW9kZWxDb21tYW5kIGdldE91dGVybW9zdENvbW1hbmQoKSB7CisJCXJldHVybiBvd25lciA9PSBudWxsID8gdGhpcyA6IG93bmVyLmdldE91dGVybW9zdENvbW1hbmQoKTsKKwl9CisKKwlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRPd25lcigpIHsKKwkJcmV0dXJuIG93bmVyOworCX0KKworCXB1YmxpYyBDb21tYW5kIGdldFRhcmdldCgpIHsKKwkJcmV0dXJuIHRhcmdldDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGludmVydGVkIGNvbW1hbmQgb24gdGhlIG91dGVybW9zdCBjb21tYW5kCisJICovCisJcHVibGljIEludmVydGVkQ29tbWFuZCBpbnZlcnRlZCgpIHsKKwkJQWJzdHJhY3RFZGl0TW9kZWxDb21tYW5kIG91dGVyID0gZ2V0T3V0ZXJtb3N0Q29tbWFuZCgpOworCQlJbnZlcnRlZENvbW1hbmQgY21kID0gbmV3IEludmVydGVkQ29tbWFuZChvdXRlcik7CisJCW91dGVyLnNldE93bmVyKGNtZCk7CisJCXJldHVybiBjbWQ7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0T3duZXIoQWJzdHJhY3RFZGl0TW9kZWxDb21tYW5kIG93bmVyQ29tbWFuZCkgeworCQlvd25lciA9IG93bmVyQ29tbWFuZDsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vQ29tcG9zZWRBY2Nlc3NvcktleS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vQ29tcG9zZWRBY2Nlc3NvcktleS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwY2FjMWUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Db21wb3NlZEFjY2Vzc29yS2V5LmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uOworCisKKworLyoqCisgKiBAYXV0aG9yIEFkbWluaXN0cmF0b3IKKyAqIAorICogIAorICovCitwdWJsaWMgY2xhc3MgQ29tcG9zZWRBY2Nlc3NvcktleSB7CisKKwlwcml2YXRlIE9iamVjdCBhY2Nlc3NvcktleSA9IG51bGw7CisJcHJpdmF0ZSBPYmplY3QgYWRkb25LZXkgPSBudWxsOworCisKKwlwdWJsaWMgc3RhdGljIENvbXBvc2VkQWNjZXNzb3JLZXkgZ2V0Q29tcG9zZWRBY2Nlc3NvcktleShPYmplY3QgYWNjZXNzb3JLZXksIENvbXBvc2VkRWRpdE1vZGVsIGVkaXRNb2RlbCkgeworCQlDb21wb3NlZEFjY2Vzc29yS2V5IG5ld0tleSA9IG5ldyBDb21wb3NlZEFjY2Vzc29yS2V5KGFjY2Vzc29yS2V5LCBlZGl0TW9kZWwpOworCQllZGl0TW9kZWwuY2FjaGVBY2Nlc3NvcktleShuZXdLZXkpOworCQlyZXR1cm4gbmV3S2V5OworCX0KKworCisJcHJpdmF0ZSBDb21wb3NlZEFjY2Vzc29yS2V5KE9iamVjdCBhY2Nlc3NvcktleSwgT2JqZWN0IGFkZG9uS2V5KSB7CisJCXRoaXMuYWNjZXNzb3JLZXkgPSBhY2Nlc3NvcktleTsKKwkJdGhpcy5hZGRvbktleSA9IGFkZG9uS2V5OworCX0KKworCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKwkJaWYgKG90aGVyID09IG51bGwgfHwgIShvdGhlciBpbnN0YW5jZW9mIENvbXBvc2VkQWNjZXNzb3JLZXkpKQorCQkJcmV0dXJuIGZhbHNlOworCQlDb21wb3NlZEFjY2Vzc29yS2V5IG90aGVyS2V5ID0gKENvbXBvc2VkQWNjZXNzb3JLZXkpIG90aGVyOworCisJCXJldHVybiBhY2Nlc3NvcktleS5lcXVhbHMob3RoZXJLZXkuYWNjZXNzb3JLZXkpICYmIGFkZG9uS2V5LmVxdWFscyhvdGhlcktleS5hZGRvbktleSk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKKwkgKi8KKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlyZXR1cm4gYWNjZXNzb3JLZXkuaGFzaENvZGUoKSBeIGFkZG9uS2V5Lmhhc2hDb2RlKCk7CisJfQorCisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Db21wb3NlZEVkaXRNb2RlbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vQ29tcG9zZWRFZGl0TW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDZmYTlhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vQ29tcG9zZWRFZGl0TW9kZWwuamF2YQpAQCAtMCwwICsxLDI3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247CisKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnMuSU9wZXJhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0LldyYXBwaW5nQ29tbWFuZFN0YWNrOworCisvKioKKyAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNS8yMS8wMSA4OjI2OjMyIFBNKQorICogCisgKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCisgKi8KK3B1YmxpYyBjbGFzcyBDb21wb3NlZEVkaXRNb2RlbCBleHRlbmRzIEVkaXRNb2RlbCBpbXBsZW1lbnRzIEVkaXRNb2RlbExpc3RlbmVyIHsKKworCXByaXZhdGUgTGlzdCBjaGlsZHJlbiA9IG51bGw7CisJcHJpdmF0ZSBNYXAgY2hpbGRyZW5NYXAgPSBudWxsOworCXByaXZhdGUgTGlzdCBjYWNoZWRLZXlzID0gbmV3IEFycmF5TGlzdCgpOworCisJLyoqCisJICogQ29tcG9zZWRFZGl0TW9kZWwgY29uc3RydWN0b3IgY29tbWVudC4KKwkgKi8KKwlwdWJsaWMgQ29tcG9zZWRFZGl0TW9kZWwoU3RyaW5nIGVkaXRNb2RlbElELCBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQpIHsKKwkJc3VwZXIoZWRpdE1vZGVsSUQsIGNvbnRleHQsIGZhbHNlKTsKKwl9CisKKworCXB1YmxpYyB2b2lkIGNyZWF0ZUNoaWxkcmVuSWZOZWNlc3NhcnkoQ29tcG9zZWRBY2Nlc3NvcktleSBjb21wb3NlZEFjY2Vzc29yS2V5KSB7CisJCS8vZG8gbm90aGluZworCX0KKworCS8qKgorCSAqIEBwYXJhbSBuZXdLZXkKKwkgKi8KKwlwdWJsaWMgdm9pZCBjYWNoZUFjY2Vzc29yS2V5KENvbXBvc2VkQWNjZXNzb3JLZXkgbmV3S2V5KSB7CisJCWlmICghY2FjaGVkS2V5cy5jb250YWlucyhuZXdLZXkpKQorCQkJY2FjaGVkS2V5cy5hZGQobmV3S2V5KTsKKwl9CisKKwkvLyBJcyB0aGlzIG5lY2Vzc2FyeSBhbnltb3JlPyAgVGhlIG9ubHkgZGlmZiBzZWVtcyB0byBiZSBpdCBkb2Vzbid0IHJlbGVhc2UgcmVzb3VyY2VzCisvLwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworLy8JCWRpc3Bvc2luZyA9IHRydWU7CisvLwkJaWYgKGNvbW1hbmRTdGFjayAhPSBudWxsKQorLy8JCQljb21tYW5kU3RhY2sucmVtb3ZlQ29tbWFuZFN0YWNrTGlzdGVuZXIodGhpcyk7CisvLwkJaWYgKGhhc0xpc3RlbmVycygpKQorLy8JCQlub3RpZnlMaXN0ZW5lcnMobmV3IEVkaXRNb2RlbEV2ZW50KEVkaXRNb2RlbEV2ZW50LlBSRV9ESVNQT1NFLCB0aGlzKSk7CisvLwkJcmVsZWFzZVByZWxvYWRSZXNvdXJjZXMoKTsKKy8vCQlyZWxlYXNlSWRlbnRpZmllcnMoKTsKKy8vCQllbWZDb250ZXh0ID0gbnVsbDsgCisvLwkJcmVzb3VyY2VzID0gbnVsbDsKKy8vCQlkaXNwb3NpbmcgPSBmYWxzZTsKKy8vCQlwcm9qZWN0ID0gbnVsbDsKKy8vCQljYWNoZWRLZXlzID0gbmV3IEFycmF5TGlzdCgpOworLy8JfQorCisJcHVibGljIEVkaXRNb2RlbC5SZWZlcmVuY2UgYWRkQ2hpbGQoU3RyaW5nIGVkaXRNb2RlbElELCBNYXAgcGFyYW1zLCBPYmplY3QgYWNjZXNzb3JLZXkpIHsKKwkJcmV0dXJuIGFkZENoaWxkKGVkaXRNb2RlbElELCBwYXJhbXMsIENvbXBvc2VkQWNjZXNzb3JLZXkuZ2V0Q29tcG9zZWRBY2Nlc3NvcktleShhY2Nlc3NvcktleSwgdGhpcykpOworCX0KKworCXB1YmxpYyBFZGl0TW9kZWwuUmVmZXJlbmNlIGFkZENoaWxkKFN0cmluZyBlZGl0TW9kZWxJRCwgTWFwIHBhcmFtcywgQ29tcG9zZWRBY2Nlc3NvcktleSBjb21wb3NlZEFjY2Vzc29yS2V5KSB7CisKKwkJRWRpdE1vZGVsIGVkaXRNb2RlbCA9IGdldEVtZkNvbnRleHQoKS5nZXRFZGl0TW9kZWxGb3JXcml0ZShlZGl0TW9kZWxJRCwgY29tcG9zZWRBY2Nlc3NvcktleSwgcGFyYW1zKTsKKwkJZWRpdE1vZGVsLmFkZExpc3RlbmVyKHRoaXMpOworCisJCWdldENoaWxkcmVuTWFwKCkucHV0KGVkaXRNb2RlbC5nZXRSZWZlcmVuY2UoKSwgZWRpdE1vZGVsKTsKKwkJZ2V0Q2hpbGRyZW4oKS5hZGQoZWRpdE1vZGVsKTsKKworCQlyZXR1cm4gZWRpdE1vZGVsLmdldFJlZmVyZW5jZSgpOworCX0KKworCXB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkKEVkaXRNb2RlbC5SZWZlcmVuY2UgcmVmZXJlbmNlLCBPYmplY3QgYWNjZXNzb3JLZXkpIHsKKwkJQ29tcG9zZWRBY2Nlc3NvcktleSBjb21wb3NlZEFjY2Vzc29yS2V5ID0gQ29tcG9zZWRBY2Nlc3NvcktleS5nZXRDb21wb3NlZEFjY2Vzc29yS2V5KGFjY2Vzc29yS2V5LCB0aGlzKTsKKwkJRWRpdE1vZGVsIGVkaXRNb2RlbCA9IChFZGl0TW9kZWwpIGdldENoaWxkcmVuTWFwKCkucmVtb3ZlKHJlZmVyZW5jZSk7CisJCWlmIChlZGl0TW9kZWwgIT0gbnVsbCkgeworCQkJZWRpdE1vZGVsLnJlbGVhc2VBY2Nlc3MoY29tcG9zZWRBY2Nlc3NvcktleSk7CisJCQllZGl0TW9kZWwucmVtb3ZlTGlzdGVuZXIodGhpcyk7CisJCQlnZXRDaGlsZHJlbigpLnJlbW92ZShlZGl0TW9kZWwpOworCQl9CisJfQorCisJcHVibGljIEl0ZXJhdG9yIGdldENvbnRhaW5lZFJlZmVyZW5jZXMoKSB7CisJCXJldHVybiBnZXRDaGlsZHJlbk1hcCgpLmtleVNldCgpLml0ZXJhdG9yKCk7CisJfQorCisJcHVibGljIEVkaXRNb2RlbCBnZXRDb250YWluZWRFZGl0TW9kZWwoRWRpdE1vZGVsLlJlZmVyZW5jZSByZWZlcmVuY2UpIHsKKwkJcmV0dXJuIChFZGl0TW9kZWwpIGdldENoaWxkcmVuTWFwKCkuZ2V0KHJlZmVyZW5jZSk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBDb21tYW5kU3RhY2suCisJICovCisJcHJvdGVjdGVkIEJhc2ljQ29tbWFuZFN0YWNrIGNyZWF0ZUNvbW1hbmRTdGFjaygpIHsKKwkJcmV0dXJuIG5ldyBXcmFwcGluZ0NvbW1hbmRTdGFjayh0aGlzKTsKKwl9CisKKwkvKioKKwkgKiBGb3J3YXJkIGFsbCBldmVudHMgdG8gdGhlIGxpc3RlbmVycyBmb3IgdGhpcyBtb2RlbAorCSAqLworCXB1YmxpYyB2b2lkIGVkaXRNb2RlbENoYW5nZWQoRWRpdE1vZGVsRXZlbnQgYW5FdmVudCkgeworCQlpZiAoaGFzTGlzdGVuZXJzKCkpCisJCQlub3RpZnlMaXN0ZW5lcnMoYW5FdmVudCk7CisJfQorCisJcHVibGljIFNldCBnZXRBZmZlY3RlZEZpbGVzKCkgeworCQlTZXQgYVNldCA9IG5ldyBIYXNoU2V0KCk7CisJCUxpc3QgbW9kZWxzID0gZ2V0Q2hpbGRyZW4oKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2RlbHMuc2l6ZSgpOyBpKyspIHsKKwkJCUVkaXRNb2RlbCBjaGlsZCA9IChFZGl0TW9kZWwpIG1vZGVscy5nZXQoaSk7CisJCQlhU2V0LmFkZEFsbChjaGlsZC5nZXRBZmZlY3RlZEZpbGVzKCkpOworCQl9CisJCXJldHVybiBhU2V0OworCX0KKworCXB1YmxpYyBMaXN0IGdldENoaWxkcmVuKCkgeworCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkKKwkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOworCQlyZXR1cm4gY2hpbGRyZW47CisJfQorCisJcHJvdGVjdGVkIE1hcCBnZXRDaGlsZHJlbk1hcCgpIHsKKwkJaWYgKGNoaWxkcmVuTWFwID09IG51bGwpCisJCQljaGlsZHJlbk1hcCA9IG5ldyBIYXNoTWFwKCk7CisJCXJldHVybiBjaGlsZHJlbk1hcDsKKwl9CisKKwkvKioKKwkgKiBQYXNzIGFsb25nIHRvIGNoaWxkcmVuLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGhhbmRsZVNhdmVJZk5lY2Vzc2FyeURpZE5vdFNhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCUxpc3QgbGlzdCA9IGdldENoaWxkcmVuKCk7CisJCUVkaXRNb2RlbCBlZGl0TW9kZWw7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgeworCQkJZWRpdE1vZGVsID0gKEVkaXRNb2RlbCkgbGlzdC5nZXQoaSk7CisJCQllZGl0TW9kZWwuaGFuZGxlU2F2ZUlmTmVjZXNzYXJ5RGlkTm90U2F2ZShtb25pdG9yKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIGEgc2F2ZSBpcyBuZWVkZWQgb24gdGhlIENvbW1hbmRTdGFjaworCSAqLworCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7CisJCUl0ZXJhdG9yIGVkaXRNb2RlbHMgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7CisJCXdoaWxlIChlZGl0TW9kZWxzLmhhc05leHQoKSkgeworCQkJRWRpdE1vZGVsIGVkaXRNb2RlbCA9IChFZGl0TW9kZWwpIGVkaXRNb2RlbHMubmV4dCgpOworCQkJaWYgKGVkaXRNb2RlbC5pc0RpcnR5KCkpCisJCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciBhIHNhdmUgaXMgbmVlZGVkIG9uIHRoZSBDb21tYW5kU3RhY2sKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0ludGVycmVzdGVkSW5SZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKKwkJSXRlcmF0b3IgZWRpdE1vZGVscyA9IGdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGVkaXRNb2RlbHMuaGFzTmV4dCgpKSB7CisJCQlFZGl0TW9kZWwgZWRpdE1vZGVsID0gKEVkaXRNb2RlbCkgZWRpdE1vZGVscy5uZXh0KCk7CisJCQlpZiAoZWRpdE1vZGVsLmlzSW50ZXJyZXN0ZWRJblJlc291cmNlKGFSZXNvdXJjZSkpCisJCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyB2b2lkIHByaW1TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQlMaXN0IGxpc3QgPSBnZXRDaGlsZHJlbigpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspCisJCQkoKEVkaXRNb2RlbCkgbGlzdC5nZXQoaSkpLnByaW1TYXZlKG1vbml0b3IpOworCX0KKworCS8qKgorCSAqIFRoaXMgb25seSBpbmNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIGNoaWxkcmVuIGFuZCBzaG91bGQgb25seSBiZSBjYWxsZWQgaWYgeW91CisJICoga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCisJICovCisJcHVibGljIHZvaWQgYWNjZXNzKE9iamVjdCBhY2Nlc3NvcktleSkgeworCQlDb21wb3NlZEFjY2Vzc29yS2V5IGNvbXBvc2VkQWNjZXNzb3JLZXkgPSBDb21wb3NlZEFjY2Vzc29yS2V5LmdldENvbXBvc2VkQWNjZXNzb3JLZXkoYWNjZXNzb3JLZXksIHRoaXMpOworCQlpZiAoZ2V0Q2hpbGRyZW4oKS5zaXplKCkgPT0gMCkgeworCQkJY3JlYXRlQ2hpbGRyZW5JZk5lY2Vzc2FyeShjb21wb3NlZEFjY2Vzc29yS2V5KTsKKwkJfSBlbHNlIHsKKworCQkJTGlzdCB0ZW1wY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZW1wY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKKwkJCQlFZGl0TW9kZWwgbW9kZWwgPSAoRWRpdE1vZGVsKSB0ZW1wY2hpbGRyZW4uZ2V0KGkpOworCQkJCW1vZGVsLmFjY2Vzcyhjb21wb3NlZEFjY2Vzc29yS2V5KTsKKwkJCX0KKwkJfQorCQkvLyByZW1vdmluZyBmb3IgZGVmZWN0IDE5NzgsIGNoaWxkcmVuIHNob3VsZCBkbyBhbGwgdGhlIGFjY2Vzc2luZworCQlzdXBlci5hY2Nlc3MoYWNjZXNzb3JLZXkpOworCisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBmcm9tIGVhY2ggY2xpZW50IHdoZW4gdGhleSBhcmUgZmluaXNoZWQgd29ya2luZyB3aXRoIHRoZQorCSAqIEVkaXRNb2RlbC4KKwkgKi8KKwlwdWJsaWMgdm9pZCByZWxlYXNlQWNjZXNzKE9iamVjdCBhY2Nlc3NvcktleSkgeworCQlMaXN0IHRlbXBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7CisJCUNvbXBvc2VkQWNjZXNzb3JLZXkgY29tcG9zZWRBY2Nlc3NvcktleSA9IENvbXBvc2VkQWNjZXNzb3JLZXkuZ2V0Q29tcG9zZWRBY2Nlc3NvcktleShhY2Nlc3NvcktleSwgdGhpcyk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdGVtcGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7CisJCQlFZGl0TW9kZWwgbW9kZWwgPSAoRWRpdE1vZGVsKSB0ZW1wY2hpbGRyZW4uZ2V0KGkpOworCQkJbW9kZWwucmVsZWFzZUFjY2Vzcyhjb21wb3NlZEFjY2Vzc29yS2V5KTsKKwkJfQorCQlyZW1vdmVLZXlGcm9tQ2FjaGUoY29tcG9zZWRBY2Nlc3NvcktleSk7CisJCS8vIFJlbW92aW5nIHRoaXMgY2FsbC4uLiBDaGlsZHJlbiBzaG91bGQgYmUgYWJsZSB0byBoYW5kbGUgYWxsIHJlbGVhc2luZyBkZWZlY3QgMTk3OAorCQlzdXBlci5yZWxlYXNlQWNjZXNzKGFjY2Vzc29yS2V5KTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVLZXlGcm9tQ2FjaGUoQ29tcG9zZWRBY2Nlc3NvcktleSBrZXkpIHsKKwkJY2FjaGVkS2V5cy5yZW1vdmUoa2V5KTsKKwl9CisKKwkvKioKKwkgKiBJZiBvbmUgc2hvdWxkIHNhdmUsIHRoZXkgYWxsIHNob3VsZCBzYXZlLgorCSAqLworCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFNhdmUoKSB7CisJCUxpc3QgbGlzdCA9IGdldENoaWxkcmVuKCk7CisJCUVkaXRNb2RlbCBlZGl0TW9kZWw7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgeworCQkJZWRpdE1vZGVsID0gKEVkaXRNb2RlbCkgbGlzdC5nZXQoaSk7CisJCQlpZiAoZWRpdE1vZGVsLnNob3VsZFNhdmUoKSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogSWYgb25lIHNob3VsZCBzYXZlLCB0aGV5IGFsbCBzaG91bGQgc2F2ZS4KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRTYXZlKElPcGVyYXRpb25IYW5kbGVyIG9wZXJhdGlvbkhhbmRsZXIpIHsKKwkJTGlzdCBsaXN0ID0gZ2V0Q2hpbGRyZW4oKTsKKwkJRWRpdE1vZGVsIGVkaXRNb2RlbDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7CisJCQllZGl0TW9kZWwgPSAoRWRpdE1vZGVsKSBsaXN0LmdldChpKTsKKwkJCWlmIChlZGl0TW9kZWwuc2hvdWxkU2F2ZShvcGVyYXRpb25IYW5kbGVyKSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVlLndvcmtiZW5jaC5FZGl0TW9kZWwjZ2V0Tm9uUmVzb3VyY2VGaWxlcygpCisJICovCisJcHVibGljIExpc3QgZ2V0Tm9uUmVzb3VyY2VGaWxlcygpIHsKKwkJTGlzdCBsaXN0ID0gZ2V0Q2hpbGRyZW4oKTsKKwkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7CisJCUVkaXRNb2RlbCBlZGl0TW9kZWw7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgeworCQkJZWRpdE1vZGVsID0gKEVkaXRNb2RlbCkgbGlzdC5nZXQoaSk7CisJCQlMaXN0IGZpbGVzID0gZWRpdE1vZGVsLmdldE5vblJlc291cmNlRmlsZXMoKTsKKwkJCWlmIChmaWxlcyAhPSBudWxsICYmICFmaWxlcy5pc0VtcHR5KCkpCisJCQkJcmVzdWx0LmFkZEFsbChmaWxlcyk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0NvbXBvdW5kaW5nQ29tbWFuZFN0YWNrLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Db21wb3VuZGluZ0NvbW1hbmRTdGFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4OGE4ODkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Db21wb3VuZGluZ0NvbW1hbmRTdGFjay5qYXZhCkBAIC0wLDAgKzEsMTUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIENyZWF0ZWQgb24gTm92IDI2LCAyMDAzCisgKgorICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bworICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2tMaXN0ZW5lcjsKKworCisvKioKKyAqIEBhdXRob3IgREFCRVJHCisgKiAKKyAqIFRoaXMgY2xhc3MgZG9lcyBub3QgYWN0dWFsbHkgZXhlY3V0ZSBhbnkgY29tbWFuZHMuIEl0IG1lcmVseSBnYXRoZXJzIHRoZSBjb21tYW5kcyB0byBiZSBleGVjdXRlZAorICogYW5kIGNvbXBvdW5kcyB0aGVtIHNvIHRoYXQgdGhleSBjYW4gYmUgZXhlY3V0ZWQgYWdhaW5zdCB0aGUgYWN0dWFsQ29tbWFuZFN0YWNrLgorICovCitwdWJsaWMgY2xhc3MgQ29tcG91bmRpbmdDb21tYW5kU3RhY2sgaW1wbGVtZW50cyBDb21tYW5kU3RhY2sgeworCXByaXZhdGUgQ29tbWFuZFN0YWNrIGFjdHVhbENvbW1hbmRTdGFjazsKKwlwcml2YXRlIENvbW1hbmQgY29tcG91bmRDb21tYW5kOworCisJLyoqCisJICogIAorCSAqLworCXB1YmxpYyBDb21wb3VuZGluZ0NvbW1hbmRTdGFjayhDb21tYW5kU3RhY2sgYWN0dWFsQ29tbWFuZFN0YWNrKSB7CisJCXRoaXMuYWN0dWFsQ29tbWFuZFN0YWNrID0gYWN0dWFsQ29tbWFuZFN0YWNrOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjayNleGVjdXRlKG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kKQorCSAqLworCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7CisJCWlmIChjb21wb3VuZENvbW1hbmQgPT0gbnVsbCkKKwkJCWNvbXBvdW5kQ29tbWFuZCA9IGNvbW1hbmQ7CisJCWVsc2UKKwkJCWNvbXBvdW5kQ29tbWFuZCA9IGNvbXBvdW5kQ29tbWFuZC5jaGFpbihjb21tYW5kKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBwZXJmb3JtRXhlY3V0aW9uKCkgeworCQlpZiAoY29tcG91bmRDb21tYW5kICE9IG51bGwpIHsKKwkJCXRyeSB7CisJCQkJYWN0dWFsQ29tbWFuZFN0YWNrLmV4ZWN1dGUoY29tcG91bmRDb21tYW5kKTsKKwkJCX0gZmluYWxseSB7CisJCQkJY29tcG91bmRDb21tYW5kID0gbnVsbDsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjayNjYW5VbmRvKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrI3VuZG8oKQorCSAqLworCXB1YmxpYyB2b2lkIHVuZG8oKSB7CisJCS8vZGVmYXVsdAorCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjayNjYW5SZWRvKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBjYW5SZWRvKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrI2dldFVuZG9Db21tYW5kKCkKKwkgKi8KKwlwdWJsaWMgQ29tbWFuZCBnZXRVbmRvQ29tbWFuZCgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrI2dldFJlZG9Db21tYW5kKCkKKwkgKi8KKwlwdWJsaWMgQ29tbWFuZCBnZXRSZWRvQ29tbWFuZCgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrI2dldE1vc3RSZWNlbnRDb21tYW5kKCkKKwkgKi8KKwlwdWJsaWMgQ29tbWFuZCBnZXRNb3N0UmVjZW50Q29tbWFuZCgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrI3JlZG8oKQorCSAqLworCXB1YmxpYyB2b2lkIHJlZG8oKSB7CisJCS8vcmVkbworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjayNmbHVzaCgpCisJICovCisJcHVibGljIHZvaWQgZmx1c2goKSB7CisJCS8vZmx1c2gKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2sjYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXIob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFja0xpc3RlbmVyKQorCSAqLworCXB1YmxpYyB2b2lkIGFkZENvbW1hbmRTdGFja0xpc3RlbmVyKENvbW1hbmRTdGFja0xpc3RlbmVyIGxpc3RlbmVyKSB7CisJCS8vZGVmYXVsdAorCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjayNyZW1vdmVDb21tYW5kU3RhY2tMaXN0ZW5lcihvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrTGlzdGVuZXIpCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlQ29tbWFuZFN0YWNrTGlzdGVuZXIoQ29tbWFuZFN0YWNrTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJLy9kZWZhdWx0CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRHluYW1pY0FkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9EeW5hbWljQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzU3MWVlCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRHluYW1pY0FkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw2NDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQ3JlYXRlZCBvbiBEZWMgMSwgMjAwMworICogCisgKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCisgKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5DaGFuZ2VOb3RpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5yZXNvdXJjZS5SZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRJZGVudGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LkVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuRW5hYmxlbWVudE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuSUVuYWJsZW1lbnRJZGVudGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LklFbmFibGVtZW50SWRlbnRpZmllckxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5lbmFibGVtZW50LklFbmFibGVtZW50TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQuQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQuQWRhcHRlckZhY3RvcnlSZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0LkV4dGVuZGVkQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKKworLyoqCisgKiBAYXV0aG9yIHNjaGFjaGVyCisgKiAKKyAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bworICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCisgKi8KK3B1YmxpYyBjbGFzcyBEeW5hbWljQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBBZGFwdGVyRmFjdG9yeSwgSUNoYW5nZU5vdGlmaWVyLCBJRGlzcG9zYWJsZSwgSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciwgSUVuYWJsZW1lbnRJZGVudGlmaWVyTGlzdGVuZXIgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWRhcHRlckZhY3RvcnkgTlVMTF9GQUNUT1JZID0gbmV3IEFkYXB0ZXJGYWN0b3J5SW1wbCgpOworCisJcHJpdmF0ZSBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IHJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgdmlld0lEOworCisJLy9FYWNoIG9mIHRoZSB0d28gbWFwcyBiZWxvdyBhcmUga2V5ZWQgYnkgdGhlIHByb2plY3QKKwlwcml2YXRlIE1hcCBhZGFwdGVyRmFjdG9yaWVzQnlQYWNrYWdlOworCisJcHJpdmF0ZSBNYXAgYWRhcHRlckZhY3Rvcmllc0J5VHlwZTsKKworCXByaXZhdGUgU2V0IGFsbEZhY3RvcmllczsKKworCS8qKgorCSAqIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQge0BsaW5rIElDaGFuZ2VOb3RpZmllcn0KKwkgKi8KKwlwcm90ZWN0ZWQgQ2hhbmdlTm90aWZpZXIgY2hhbmdlTm90aWZpZXIgPSBuZXcgQ2hhbmdlTm90aWZpZXIoKTsKKworCXByaXZhdGUgYm9vbGVhbiByZXNwZWN0aW5nQWN0aXZpdGllcyA9IGZhbHNlOworCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgTk9fUFJPSkVDVCA9ICJOT19QUk9KRUNUIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICovCisJcHVibGljIER5bmFtaWNBZGFwdGVyRmFjdG9yeShTdHJpbmcgdmlld0lELCBib29sZWFuIHJlc3BlY3RBY3RpdmllcykgeworCQl0aGlzLnZpZXdJRCA9IHZpZXdJRDsKKwkJdGhpcy5yZXNwZWN0aW5nQWN0aXZpdGllcyA9IHJlc3BlY3RBY3RpdmllczsKKwkJaW5pdGlhbGl6ZSgpOworCX0KKworCS8qKgorCSAqLworCXB1YmxpYyBEeW5hbWljQWRhcHRlckZhY3RvcnkoU3RyaW5nIHZpZXdJRCkgeworCQl0aGlzLnZpZXdJRCA9IHZpZXdJRDsKKwkJaW5pdGlhbGl6ZSgpOworCX0KKworCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgeworCQlhZGFwdGVyRmFjdG9yaWVzQnlQYWNrYWdlID0gbmV3IEhhc2hNYXAoKTsKKwkJYWRhcHRlckZhY3Rvcmllc0J5VHlwZSA9IG5ldyBIYXNoTWFwKCk7CisJCWFsbEZhY3RvcmllcyA9IG5ldyBIYXNoU2V0KCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgeworCQlyZXR1cm4gZ2V0RmFjdG9yeUZvclR5cGUodHlwZSkgIT0gbnVsbDsKKwl9CisKKwlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGdldEZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7CisKKwkJaWYgKHR5cGUgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCisJCWlmICh0eXBlIGluc3RhbmNlb2YgRU9iamVjdCkKKwkJCXJldHVybiBnZXRGYWN0b3J5Rm9yVHlwZSgoRU9iamVjdCkgdHlwZSk7CisKKwkJT2JqZWN0IGFQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHR5cGUpOworCQlpZiAoYVByb2plY3QgPT0gbnVsbCkKKwkJCWFQcm9qZWN0ID0gTk9fUFJPSkVDVDsKKwkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IGdldEV4aXN0aW5nRmFjdG9yeUZvclR5cGUoYVByb2plY3QsIHR5cGUpOworCQlpZiAoZmFjdG9yeSA9PSBOVUxMX0ZBQ1RPUlkpCisJCQlyZXR1cm4gbnVsbDsKKwkJZWxzZSBpZiAoZmFjdG9yeSA9PSBudWxsKSB7CisJCQlmYWN0b3J5ID0gZmluZEZhY3RvcnlGb3JUeXBlKGFQcm9qZWN0LCB0eXBlKTsKKworCQkJaWYgKGZhY3RvcnkgPT0gbnVsbCkKKwkJCQlhZGRBZGFwdGVyRmFjdG9yeShhUHJvamVjdCwgdHlwZSwgTlVMTF9GQUNUT1JZKTsKKwkJCWVsc2UKKwkJCQlhZGRBZGFwdGVyRmFjdG9yeShhUHJvamVjdCwgdHlwZSwgZmFjdG9yeSk7CisJCX0KKwkJcmV0dXJuIGZhY3Rvcnk7CisJfQorCisJcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBnZXRFeGlzdGluZ0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBwLCBPYmplY3QgdHlwZSkgeworCQlpZiAocCA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCU1hcCBhTWFwID0gKE1hcCkgYWRhcHRlckZhY3Rvcmllc0J5VHlwZS5nZXQocCk7CisJCWlmIChhTWFwID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJcmV0dXJuIChBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3Rvcmllc0J5VHlwZS5nZXQodHlwZSk7CisJfQorCisJLyoKKwkgKiBUaGUgZmFjdG9yeSB3YXMgbm90IGNhY2hlZCBieSB0eXBlLCBzbyB3ZSB3aWxsIHNlYXJjaCB0aGUgY2FjaGUgb2YgZmFjdG9yaWVzIGZvciB0aGUgcHJvamVjdAorCSAqIGFuZCBzZWUgaWYgaXQgY2FuIGJlIGZvdW5kIHRoZXJlCisJICovCisJcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBmaW5kRmFjdG9yeUZvclR5cGUoT2JqZWN0IHByb2plY3QsIE9iamVjdCB0eXBlKSB7CisJCWlmIChwcm9qZWN0ID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJTWFwIGFNYXAgPSAoTWFwKSBhZGFwdGVyRmFjdG9yaWVzQnlQYWNrYWdlLmdldChwcm9qZWN0KTsKKwkJaWYgKGFNYXAgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQlJdGVyYXRvciBpdGVyID0gYU1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOworCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKKwkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisJCQlmYWN0b3J5ID0gKEFkYXB0ZXJGYWN0b3J5KSBpdGVyLm5leHQoKTsKKwkJCWlmIChmYWN0b3J5LmlzRmFjdG9yeUZvclR5cGUodHlwZSkpCisJCQkJcmV0dXJuIGZhY3Rvcnk7CisJCX0KKworCQkvLyBhZGFwdCB0aGUgcmVzb3VyY2UgdG8gaXRzIGNvbnRlbnRzCisJCWlmIChnZXRSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkKKwkJCXJldHVybiBnZXRSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCk7CisJCXJldHVybiBudWxsOworCX0KKworCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgZ2V0RmFjdG9yeUZvclR5cGUoRU9iamVjdCBvYmopIHsKKwkJRUNsYXNzIGVDbGFzcyA9IG9iai5lQ2xhc3MoKTsKKwkJaWYgKGVDbGFzcyA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisKKwkJRVBhY2thZ2UgZVBhY2thZ2UgPSBlQ2xhc3MuZ2V0RVBhY2thZ2UoKTsKKwkJT2JqZWN0IGFQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KG9iaik7CisJCWlmIChhUHJvamVjdCA9PSBudWxsKQorCQkJYVByb2plY3QgPSBOT19QUk9KRUNUOworCQlBZGFwdGVyRmFjdG9yeSByZXN1bHQgPSBnZXRGYWN0b3J5Rm9yUGFja2FnZShhUHJvamVjdCwgZVBhY2thZ2UpOworCisJCWlmIChyZXN1bHQgPT0gbnVsbCkgeworCQkJU2V0IGZhaWxlZFBhY2thZ2VTZXQgPSBuZXcgSGFzaFNldCgpOworCQkJZmFpbGVkUGFja2FnZVNldC5hZGQoZVBhY2thZ2UpOworCQkJSXRlcmF0b3Igc3VwZXJ0eXBlcyA9IGVDbGFzcy5nZXRFQWxsU3VwZXJUeXBlcygpLml0ZXJhdG9yKCk7CisJCQl3aGlsZSAoc3VwZXJ0eXBlcy5oYXNOZXh0KCkpIHsKKwkJCQllQ2xhc3MgPSAoRUNsYXNzKSBzdXBlcnR5cGVzLm5leHQoKTsKKwkJCQlpZiAoZUNsYXNzICE9IG51bGwpIHsKKwkJCQkJZVBhY2thZ2UgPSBlQ2xhc3MuZ2V0RVBhY2thZ2UoKTsKKwkJCQkJaWYgKGZhaWxlZFBhY2thZ2VTZXQuYWRkKGVQYWNrYWdlKSkgeworCQkJCQkJcmVzdWx0ID0gZ2V0RmFjdG9yeUZvclBhY2thZ2UoYVByb2plY3QsIGVQYWNrYWdlKTsKKwkJCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKKwkJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgZ2V0RmFjdG9yeUZvclBhY2thZ2UoT2JqZWN0IGFQcm9qZWN0LCBFUGFja2FnZSBhUGFja2FnZSkgeworCQlpZiAoYVByb2plY3QgPT0gbnVsbCB8fCBhUGFja2FnZSA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBnZXRFeGlzdGluZ0ZhY3RvcnlGb3JQYWNrYWdlKGFQcm9qZWN0LCBhUGFja2FnZSk7CisJCWlmIChmYWN0b3J5ID09IE5VTExfRkFDVE9SWSkKKwkJCXJldHVybiBudWxsOworCQllbHNlIGlmIChmYWN0b3J5ID09IG51bGwpIHsKKwkJCXRyeSB7CisJCQkJZmFjdG9yeSA9IGNyZWF0ZUFkYXB0ZXJGYWN0b3J5KGFQcm9qZWN0LCBhUGFja2FnZSk7CisKKwkJCQlpZiAoZmFjdG9yeSA9PSBudWxsKQorCQkJCQlhZGRBZGFwdGVyRmFjdG9yeShhUHJvamVjdCwgYVBhY2thZ2UsIE5VTExfRkFDVE9SWSk7CisJCQkJZWxzZQorCQkJCQlhZGRBZGFwdGVyRmFjdG9yeShhUHJvamVjdCwgYVBhY2thZ2UsIGZhY3RvcnkpOworCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihyZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhY3Rvcnk7CisJfQorCisJcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBnZXRGYWN0b3J5Rm9yVHlwZXMoT2JqZWN0IHAsIExpc3QgdHlwZXMpIHsKKwkJTWFwIGFNYXAgPSAoTWFwKSBhZGFwdGVyRmFjdG9yaWVzQnlQYWNrYWdlLmdldChwKTsKKwkJaWYgKGFNYXAgPT0gbnVsbCkKKwkJCXJldHVybiBhZGFwdFJlc291cmNlVHlwZXModHlwZXMpOworCisJCUl0ZXJhdG9yIGZhY3RvcmllcyA9IGFNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKKwkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7CisJCXdoaWxlIChmYWN0b3JpZXMuaGFzTmV4dCgpKSB7CisJCQlmYWN0b3J5ID0gKEFkYXB0ZXJGYWN0b3J5KSBmYWN0b3JpZXMubmV4dCgpOworCQkJaWYgKGlzRmFjdG9yeUZvckFsbFR5cGVzKGZhY3RvcnksIHR5cGVzKSkgeworCQkJCXJldHVybiBmYWN0b3J5OworCQkJfQorCQl9CisKKworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGFkYXB0UmVzb3VyY2VUeXBlcyhMaXN0IHR5cGVzKSB7CisJCS8vICAgICAgYWRhcHQgdGhlIHJlc291cmNlIHRvIGl0cyBjb250ZW50cworCQlpZiAoaXNGYWN0b3J5Rm9yQWxsVHlwZXMoZ2V0UmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLCB0eXBlcykpCisJCQlyZXR1cm4gZ2V0UmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpOworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIHZvaWQgcmVtb3ZlRmFjdG9yeUZvclR5cGVzKE9iamVjdCBwLCBMaXN0IHR5cGVzKSB7CisJCU1hcCBhTWFwID0gKE1hcCkgYWRhcHRlckZhY3Rvcmllc0J5UGFja2FnZS5nZXQocCk7CisJCWlmIChhTWFwID09IG51bGwpCisJCQlyZXR1cm47CisJCUl0ZXJhdG9yIGZhY3RvcmllcyA9IGFNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKKwkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7CisJCXdoaWxlIChmYWN0b3JpZXMuaGFzTmV4dCgpKSB7CisJCQlmYWN0b3J5ID0gKEFkYXB0ZXJGYWN0b3J5KSBmYWN0b3JpZXMubmV4dCgpOworCQkJaWYgKGlzRmFjdG9yeUZvckFsbFR5cGVzKGZhY3RvcnksIHR5cGVzKSkgeworCQkJCWFNYXAucmVtb3ZlKGZhY3RvcnkpOworCQkJfQorCQl9CisKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNGYWN0b3J5Rm9yQWxsVHlwZXMoQWRhcHRlckZhY3RvcnkgZmFjdG9yeSwgTGlzdCB0eXBlcykgeworCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLnNpemUoKTsgaSsrKSB7CisJCQlpZiAoIWZhY3RvcnkuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlcy5nZXQoaSkpKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisJCXJldHVybiB0cnVlOworCisJfQorCisJcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBnZXRFeGlzdGluZ0ZhY3RvcnlGb3JQYWNrYWdlKE9iamVjdCBwLCBFUGFja2FnZSBhUGFja2FnZSkgeworCQlpZiAocCA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCU1hcCBhTWFwID0gKE1hcCkgYWRhcHRlckZhY3Rvcmllc0J5UGFja2FnZS5nZXQocCk7CisJCWlmIChhTWFwID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJcmV0dXJuIChBZGFwdGVyRmFjdG9yeSkgYU1hcC5nZXQoYVBhY2thZ2UpOworCX0KKworCXByaXZhdGUgdm9pZCBhZGRBZGFwdGVyRmFjdG9yeShPYmplY3QgcCwgRVBhY2thZ2UgYVBhY2thZ2UsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCU1hcCBhTWFwID0gZ2V0T3JDcmVhdGVNYXAocCwgYWRhcHRlckZhY3Rvcmllc0J5UGFja2FnZSk7CisKKwkJYU1hcC5wdXQoYVBhY2thZ2UsIGFkYXB0ZXJGYWN0b3J5KTsKKworCQlpZiAoYWRhcHRlckZhY3RvcnkgPT0gTlVMTF9GQUNUT1JZKQorCQkJcmV0dXJuOworCisJCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIElDaGFuZ2VOb3RpZmllcikgeworCQkJKChJQ2hhbmdlTm90aWZpZXIpIGFkYXB0ZXJGYWN0b3J5KS5hZGRMaXN0ZW5lcih0aGlzKTsKKwkJfQorCQlhbGxGYWN0b3JpZXMuYWRkKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwlwcml2YXRlIE1hcCBnZXRPckNyZWF0ZU1hcChPYmplY3QgcCwgTWFwIGNvbnRhaW5lcikgeworCQlNYXAgYU1hcCA9IChNYXApIGNvbnRhaW5lci5nZXQocCk7CisJCWlmIChhTWFwID09IG51bGwpIHsKKwkJCWFNYXAgPSBuZXcgSGFzaE1hcCgxMCk7CisJCQljb250YWluZXIucHV0KHAsIGFNYXApOworCQl9CisJCXJldHVybiBhTWFwOworCX0KKworCXByaXZhdGUgdm9pZCBhZGRBZGFwdGVyRmFjdG9yeShPYmplY3QgcCwgT2JqZWN0IHR5cGUsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7CisJCU1hcCBhTWFwID0gZ2V0T3JDcmVhdGVNYXAocCwgYWRhcHRlckZhY3Rvcmllc0J5VHlwZSk7CisJCWFNYXAucHV0KHR5cGUsIGFkYXB0ZXJGYWN0b3J5KTsKKworCQlpZiAoYWRhcHRlckZhY3RvcnkgPT0gTlVMTF9GQUNUT1JZKQorCQkJcmV0dXJuOworCisJCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIElDaGFuZ2VOb3RpZmllcikgeworCQkJKChJQ2hhbmdlTm90aWZpZXIpIGFkYXB0ZXJGYWN0b3J5KS5hZGRMaXN0ZW5lcih0aGlzKTsKKwkJfQorCQlhbGxGYWN0b3JpZXMuYWRkKGFkYXB0ZXJGYWN0b3J5KTsKKwl9CisKKwlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCB0YXJnZXQsIE9iamVjdCB0eXBlKSB7CisJCU9iamVjdCBhZGFwdGVyID0gdGFyZ2V0OworCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgTm90aWZpZXIpIHsKKwkJCWFkYXB0ZXIgPSBhZGFwdCgoTm90aWZpZXIpIHRhcmdldCwgdHlwZSk7CisJCX0KKworCQlpZiAoISh0eXBlIGluc3RhbmNlb2YgQ2xhc3MpIHx8ICgoKENsYXNzKSB0eXBlKS5pc0luc3RhbmNlKGFkYXB0ZXIpKSkgeworCQkJcmV0dXJuIGFkYXB0ZXI7CisJCX0KKworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKSB7CisJCUFkYXB0ZXIgcmVzdWx0ID0gbnVsbDsKKworCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgRU9iamVjdCkKKwkJCXJlc3VsdCA9IGFkYXB0KChFT2JqZWN0KSB0YXJnZXQsIHR5cGUpOworCQllbHNlIHsKKwkJCU9iamVjdCBwID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHRhcmdldCk7CisJCQlpZiAocCA9PSBudWxsKQorCQkJCXAgPSBOT19QUk9KRUNUOworCQkJcmVzdWx0ID0gYWRhcHQocCwgdGFyZ2V0LCB0eXBlLCBuZXcgSGFzaFNldCgpLCB0YXJnZXQuZ2V0Q2xhc3MoKSk7CisKKwkJfQorCisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHVibGljIEFkYXB0ZXIgYWRhcHQoRU9iamVjdCB0YXJnZXQsIE9iamVjdCB0eXBlKSB7CisKKwkJRUNsYXNzIGVDbGFzcyA9IHRhcmdldC5lQ2xhc3MoKTsKKwkJaWYgKGVDbGFzcyA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisKKwkJRVBhY2thZ2UgZVBhY2thZ2UgPSBlQ2xhc3MuZ2V0RVBhY2thZ2UoKTsKKwkJQWRhcHRlciByZXN1bHQgPSBhZGFwdCh0YXJnZXQsIGVQYWNrYWdlLCB0eXBlKTsKKworCQlpZiAocmVzdWx0ID09IG51bGwpIHsKKwkJCVNldCBmYWlsZWRQYWNrYWdlU2V0ID0gbmV3IEhhc2hTZXQoKTsKKwkJCWZhaWxlZFBhY2thZ2VTZXQuYWRkKGVQYWNrYWdlKTsKKwkJCUl0ZXJhdG9yIHN1cGVydHlwZXMgPSBlQ2xhc3MuZ2V0RUFsbFN1cGVyVHlwZXMoKS5pdGVyYXRvcigpOworCQkJd2hpbGUgKHN1cGVydHlwZXMuaGFzTmV4dCgpKSB7CisJCQkJZUNsYXNzID0gKEVDbGFzcykgc3VwZXJ0eXBlcy5uZXh0KCk7CisJCQkJaWYgKGVDbGFzcyAhPSBudWxsKSB7CisJCQkJCWVQYWNrYWdlID0gZUNsYXNzLmdldEVQYWNrYWdlKCk7CisJCQkJCWlmIChmYWlsZWRQYWNrYWdlU2V0LmFkZChlUGFja2FnZSkpIHsKKwkJCQkJCXJlc3VsdCA9IGFkYXB0KHRhcmdldCwgZVBhY2thZ2UsIHR5cGUpOworCQkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKQorCQkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHJpdmF0ZSBBZGFwdGVyIGFkYXB0KEVPYmplY3QgdGFyZ2V0LCBFUGFja2FnZSBlUGFja2FnZSwgT2JqZWN0IHR5cGUpIHsKKwkJT2JqZWN0IGFQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHRhcmdldCk7CisJCWlmIChhUHJvamVjdCA9PSBudWxsKQorCQkJYVByb2plY3QgPSBOT19QUk9KRUNUOworCQlBZGFwdGVyRmFjdG9yeSBkZWxlZ2F0ZSA9IGdldEZhY3RvcnlGb3JQYWNrYWdlKGFQcm9qZWN0LCBlUGFja2FnZSk7CisJCWlmIChkZWxlZ2F0ZSAhPSBudWxsICYmIGRlbGVnYXRlLmlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKKwkJCXJldHVybiBkZWxlZ2F0ZS5hZGFwdCh0YXJnZXQsIHR5cGUpOworCQl9CisKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoKKwkgKiBDb2RlIGJvcnJvd2VkIGZyb20ge0BsaW5rIENvbXBvc2VkQWRhcHRlckZhY3Rvcnl9CisJICogIAorCSAqLworCXByaXZhdGUgQWRhcHRlciBhZGFwdChPYmplY3QgcCwgTm90aWZpZXIgdGFyZ2V0LCBPYmplY3QgdHlwZSwgQ29sbGVjdGlvbiBmYWlsZWRQYWNrYWdlcywgQ2xhc3MgamF2YUNsYXNzKSB7CisJCWlmIChwID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKworCQlBZGFwdGVyIHJlc3VsdCA9IG51bGw7CisKKwkJUGFja2FnZSBqYXZhUGFja2FnZSA9IGphdmFDbGFzcy5nZXRQYWNrYWdlKCk7CisJCWlmIChmYWlsZWRQYWNrYWdlcy5hZGQoamF2YVBhY2thZ2UpKSB7CisJCQlMaXN0IHR5cGVzID0gbmV3IEFycmF5TGlzdCgyKTsKKwkJCXR5cGVzLmFkZChqYXZhUGFja2FnZSk7CisJCQlpZiAodHlwZSAhPSBudWxsKSB7CisJCQkJdHlwZXMuYWRkKHR5cGUpOworCQkJfQorCisJCQkvKiB3aGVuIGFuIGVycm9yIG9jY3VycywgcmVtb3ZlIHRoZSBkZWxlZ2F0ZSBhbmQgdHJ5IGFnYWluICovCisJCQlib29sZWFuIGF0dGVtcHRBZGFwdEFnYWluID0gdHJ1ZTsKKwkJCXdoaWxlIChyZXN1bHQgPT0gbnVsbCAmJiBhdHRlbXB0QWRhcHRBZ2FpbikgeworCQkJCWF0dGVtcHRBZGFwdEFnYWluID0gZmFsc2U7CisKKwkJCQlBZGFwdGVyRmFjdG9yeSBkZWxlZ2F0ZUFkYXB0ZXJGYWN0b3J5ID0gZ2V0RmFjdG9yeUZvclR5cGVzKHAsIHR5cGVzKTsKKwkJCQlpZiAoZGVsZWdhdGVBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7CisJCQkJCXRyeSB7CisJCQkJCQlyZXN1bHQgPSBkZWxlZ2F0ZUFkYXB0ZXJGYWN0b3J5LmFkYXB0KHRhcmdldCwgdHlwZSk7CisJCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKwkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihyZSk7CisJCQkJCQlyZW1vdmVGYWN0b3J5Rm9yVHlwZXMocCwgdHlwZXMpOworCQkJCQkJYXR0ZW1wdEFkYXB0QWdhaW4gPSB0cnVlOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKHJlc3VsdCA9PSBudWxsKSB7CisJCQlDbGFzcyBzdXBlcmNsYXNzID0gamF2YUNsYXNzLmdldFN1cGVyY2xhc3MoKTsKKwkJCWlmIChzdXBlcmNsYXNzICE9IG51bGwpIHsKKwkJCQlyZXN1bHQgPSBhZGFwdChwLCB0YXJnZXQsIHR5cGUsIGZhaWxlZFBhY2thZ2VzLCBqYXZhQ2xhc3MuZ2V0U3VwZXJjbGFzcygpKTsKKwkJCX0KKwkJCWlmIChyZXN1bHQgPT0gbnVsbCkgeworCQkJCUNsYXNzW10gaW50ZXJmYWNlcyA9IGphdmFDbGFzcy5nZXRJbnRlcmZhY2VzKCk7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VzLmxlbmd0aDsgKytpKSB7CisJCQkJCXJlc3VsdCA9IGFkYXB0KHAsIHRhcmdldCwgdHlwZSwgZmFpbGVkUGFja2FnZXMsIGludGVyZmFjZXNbaV0pOworCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwdWJsaWMgQWRhcHRlciBhZGFwdE5ldyhOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKSB7CisKKwkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IGdldEZhY3RvcnlGb3JUeXBlKHRhcmdldCk7CisKKwkJaWYgKGZhY3RvcnkgIT0gbnVsbCkKKwkJCXJldHVybiBmYWN0b3J5LmFkYXB0TmV3KHRhcmdldCwgdHlwZSk7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIGFkYXB0QWxsTmV3KE5vdGlmaWVyIHRhcmdldCkgeworCisJCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBnZXRGYWN0b3J5Rm9yVHlwZSh0YXJnZXQpOworCisJCWlmIChmYWN0b3J5ICE9IG51bGwpCisJCQlmYWN0b3J5LmFkYXB0QWxsTmV3KHRhcmdldCk7CisKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgeworCQljaGFuZ2VOb3RpZmllci5hZGQobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgeworCQljaGFuZ2VOb3RpZmllci5yZW1vdmUobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCWlmIChjaGFuZ2VOb3RpZmllciA9PSBudWxsIHx8IGNoYW5nZU5vdGlmaWVyLmlzRW1wdHkoKSB8fCBjaGFuZ2VOb3RpZmllci5nZXQoMCkgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlJdGVyYXRvciBpdGVyID0gYWxsRmFjdG9yaWVzLml0ZXJhdG9yKCk7CisJCU9iamVjdCBmYWN0b3J5ID0gbnVsbDsKKwkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisJCQlmYWN0b3J5ID0gaXRlci5uZXh0KCk7CisJCQlkaXNwb3NlRmFjdG9yeShmYWN0b3J5KTsKKwkJfQorCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IGdldEVuYWJsZW1lbnRJZGVudGlmaWVycygpLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisJCQkoKElFbmFibGVtZW50SWRlbnRpZmllcikgaXRyLm5leHQoKSkucmVtb3ZlSWRlbnRpZmllckxpc3RlbmVyKHRoaXMpOworCQl9CisJCWlmIChyZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpCisJCQlyZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LnJlbW92ZUxpc3RlbmVyKHRoaXMpOworCX0KKworCXByaXZhdGUgdm9pZCBkaXNwb3NlRmFjdG9yeShPYmplY3QgZmFjdG9yeSkgeworCQlpZiAoZmFjdG9yeSBpbnN0YW5jZW9mIElEaXNwb3NhYmxlKSB7CisJCQkoKElEaXNwb3NhYmxlKSBmYWN0b3J5KS5kaXNwb3NlKCk7CisJCX0KKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCisJICovCisJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisJCS8vRm93YXJkIHRoZSBub3RpZmljYXRpb24gb24gdG8gYWxsIG15IGxpc3RlbmVycworCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBwcm9qZWN0CisJICovCisJcHJpdmF0ZSB2b2lkIHJlbW92ZUFkYXB0ZXJGYWN0b3JpZXMoT2JqZWN0IHByb2plY3QpIHsKKwkJYWRhcHRlckZhY3Rvcmllc0J5VHlwZS5yZW1vdmUocHJvamVjdCk7CisJCU1hcCBhTWFwID0gKE1hcCkgYWRhcHRlckZhY3Rvcmllc0J5UGFja2FnZS5yZW1vdmUocHJvamVjdCk7CisJCWlmIChhTWFwID09IG51bGwpCisJCQlyZXR1cm47CisKKwkJSXRlcmF0b3IgZmFjdG9yaWVzID0gYU1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOworCQlPYmplY3QgYWRhcHRlckZhY3Rvcnk7CisJCXdoaWxlIChmYWN0b3JpZXMuaGFzTmV4dCgpKSB7CisJCQlhZGFwdGVyRmFjdG9yeSA9IGZhY3Rvcmllcy5uZXh0KCk7CisJCQlhbGxGYWN0b3JpZXMucmVtb3ZlKGFkYXB0ZXJGYWN0b3J5KTsKKwkJCWRpc3Bvc2VGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KTsKKwkJfQorCX0KKworCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgY3JlYXRlQWRhcHRlckZhY3RvcnkoT2JqZWN0IHByb2plY3QsIEVQYWNrYWdlIGVQYWNrYWdlKSB7CisJCWlmIChlUGFja2FnZSA9PSBudWxsKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihFTUZXb3JrYmVuY2hFZGl0UmVzb3VyY2VIYW5kbGVyLkR5bmFtaWNBZGFwdGVyRmFjdG9yeV9FUlJPUl8wKTsKKworCQlyZXR1cm4gY3JlYXRlQWRhcHRlckZhY3RvcnkocHJvamVjdCwgQWRhcHRlckZhY3RvcnlSZWdpc3RyeS5pbnN0YW5jZSgpLmdldERlc2NyaXB0b3JzKGVQYWNrYWdlLCB2aWV3SUQpKTsKKworCX0KKworCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgY3JlYXRlQWRhcHRlckZhY3RvcnkoT2JqZWN0IHByb2plY3QsIExpc3QgZGVzY3JpcHRvcnMpIHsKKwkJaWYgKGRlc2NyaXB0b3JzID09IG51bGwgfHwgZGVzY3JpcHRvcnMuaXNFbXB0eSgpKQorCQkJcmV0dXJuIG51bGw7CisKKwkJQWRhcHRlckZhY3RvcnkgZmFjdCA9IG51bGw7CisJCUlFbmFibGVtZW50SWRlbnRpZmllciBpZGVudGlmaWVyID0gbnVsbDsKKwkJQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yIGRlc2MgPSBudWxsOworCQlpZiAoZGVzY3JpcHRvcnMuc2l6ZSgpID09IDEpIHsKKwkJCWRlc2MgPSAoQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yKSBkZXNjcmlwdG9ycy5nZXQoMCk7CisJCQlpZGVudGlmaWVyID0gZ2V0SWRlbnRpZmllcihwcm9qZWN0LCBkZXNjKTsKKwkJCWFkZExpc3RlbmVySWZOZWNlc3NhcnkoaWRlbnRpZmllcik7CisJCQlpZiAocHJvamVjdC5lcXVhbHMoTk9fUFJPSkVDVCkgfHwgKGlkZW50aWZpZXIgIT0gbnVsbCAmJiBpZGVudGlmaWVyLmlzRW5hYmxlZCgpKSkKKwkJCQlyZXR1cm4gZGVzYy5jcmVhdGVJbnN0YW5jZSgpOworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJTGlzdCBmYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KGRlc2NyaXB0b3JzLnNpemUoKSk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMuc2l6ZSgpOyBpKyspIHsKKwkJCWRlc2MgPSAoQWRhcHRlckZhY3RvcnlEZXNjcmlwdG9yKSBkZXNjcmlwdG9ycy5nZXQoaSk7CisJCQlpZGVudGlmaWVyID0gZ2V0SWRlbnRpZmllcihwcm9qZWN0LCBkZXNjKTsKKwkJCWFkZExpc3RlbmVySWZOZWNlc3NhcnkoaWRlbnRpZmllcik7CisJCQlpZiAocHJvamVjdC5lcXVhbHMoTk9fUFJPSkVDVCkgfHwgKGlkZW50aWZpZXIgIT0gbnVsbCAmJiBpZGVudGlmaWVyLmlzRW5hYmxlZCgpKSkgeworCQkJCWZhY3QgPSBkZXNjLmNyZWF0ZUluc3RhbmNlKCk7CisJCQkJaWYgKGZhY3QgIT0gbnVsbCkKKwkJCQkJZmFjdG9yaWVzLmFkZChmYWN0KTsKKwkJCX0KKwkJfQorCQlpZiAoZmFjdG9yaWVzLmlzRW1wdHkoKSkKKwkJCXJldHVybiBudWxsOworCisJCXJldHVybiBuZXcgRXh0ZW5kZWRDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KGZhY3Rvcmllcyk7CisJfQorCisJLyoqCisJICogQHBhcmFtIHByb2plY3QKKwkgKiBAcGFyYW0gZGVzYworCSAqIEByZXR1cm4KKwkgKi8KKwlwcml2YXRlIElFbmFibGVtZW50SWRlbnRpZmllciBnZXRJZGVudGlmaWVyKE9iamVjdCBwcm9qZWN0LCBBZGFwdGVyRmFjdG9yeURlc2NyaXB0b3IgZGVzYykgeworCQlJRW5hYmxlbWVudElkZW50aWZpZXIgaWRlbnRpZmllciA9IG51bGw7CisJCWlmIChpc1Jlc3BlY3RpbmdBY3Rpdml0aWVzKCkgJiYgcHJvamVjdCBpbnN0YW5jZW9mIElQcm9qZWN0KQorCQkJaWRlbnRpZmllciA9IElFbmFibGVtZW50TWFuYWdlci5JTlNUQU5DRS5nZXRJZGVudGlmaWVyKGRlc2MuZ2V0SUQoKSwgKElQcm9qZWN0KSBwcm9qZWN0KTsKKwkJZWxzZSBpZiAocHJvamVjdCBpbnN0YW5jZW9mIElQcm9qZWN0KQorCQkJaWRlbnRpZmllciA9IEVuYWJsZW1lbnRNYW5hZ2VyLklOU1RBTkNFLmdldElkZW50aWZpZXIoZGVzYy5nZXRJRCgpLCAoSVByb2plY3QpIHByb2plY3QpOworCQlyZXR1cm4gaWRlbnRpZmllcjsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzUmVzcGVjdGluZ0FjdGl2aXRpZXMoKSB7CisJCXJldHVybiByZXNwZWN0aW5nQWN0aXZpdGllczsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcklmTmVjZXNzYXJ5KElFbmFibGVtZW50SWRlbnRpZmllciBpZGVudGlmaWVyKSB7CisJCWlmIChpZGVudGlmaWVyID09IG51bGwpCisJCQlyZXR1cm47CisJCWlkZW50aWZpZXIuYWRkSWRlbnRpZmllckxpc3RlbmVyKHRoaXMpOworCQlnZXRFbmFibGVtZW50SWRlbnRpZmllcnMoKS5hZGQoaWRlbnRpZmllcik7CisJfQorCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNMaXN0ZW5pbmdUbyhJRW5hYmxlbWVudElkZW50aWZpZXIgaWRlbnRpZmllcikgeworCQlyZXR1cm4gZ2V0RW5hYmxlbWVudElkZW50aWZpZXJzKCkuY29udGFpbnMoaWRlbnRpZmllcik7CisJfQorCisJLyoqCisJICogQHJldHVybiBSZXR1cm5zIHRoZSBlbmFibGVtZW50SWRlbnRpZmllcnMuCisJICovCisJcHJvdGVjdGVkIFNldCBnZXRFbmFibGVtZW50SWRlbnRpZmllcnMoKSB7CisJCWlmIChlbmFibGVtZW50SWRlbnRpZmllcnMgPT0gbnVsbCkKKwkJCWVuYWJsZW1lbnRJZGVudGlmaWVycyA9IG5ldyBIYXNoU2V0KCk7CisJCXJldHVybiBlbmFibGVtZW50SWRlbnRpZmllcnM7CisJfQorCisJcHJpdmF0ZSBTZXQgZW5hYmxlbWVudElkZW50aWZpZXJzOworCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5JRW5hYmxlbWVudElkZW50aWZpZXJMaXN0ZW5lciNpZGVudGlmaWVyQ2hhbmdlZChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5FbmFibGVtZW50SWRlbnRpZmllckV2ZW50KQorCSAqLworCXB1YmxpYyB2b2lkIGlkZW50aWZpZXJDaGFuZ2VkKEVuYWJsZW1lbnRJZGVudGlmaWVyRXZlbnQgaWRlbnRpZmllckV2ZW50KSB7CisJCWlmIChpZGVudGlmaWVyRXZlbnQuaGFzRW5hYmxlZENoYW5nZWQoKSB8fCBpZGVudGlmaWVyRXZlbnQuaGFzRnVuY3Rpb25Hcm91cElkc0NoYW5nZWQoKSkgeworCQkJT2JqZWN0IHByb2plY3QgPSAoKEVuYWJsZW1lbnRJZGVudGlmaWVyKSBpZGVudGlmaWVyRXZlbnQuZ2V0SWRlbnRpZmllcigpKS5nZXRQcm9qZWN0KCk7CisJCQlpZiAocHJvamVjdCAhPSBudWxsKSB7CisJCQkJcmVtb3ZlQWRhcHRlckZhY3Rvcmllcyhwcm9qZWN0KTsKKwkJCQkvKgorCQkJCSAqIGZpbmFsIE5vdGlmaWVyIG5vdGlmaWVyID0gKE5vdGlmaWVyKSBnZXRDYWNoZWRSb290cygpLmdldChwcm9qZWN0KTsKKwkJCQkgKi8KKwkJCQkvKiBmb3JjZSBhIHZpZXdlciByZWZyZXNoICovCisJCQkJbm90aWZ5Q2hhbmdlZChuZXcgTm90aWZpY2F0aW9uSW1wbChOb3RpZmljYXRpb24uQURELCBudWxsLCBudWxsKSB7CisKKwkJCQkJLyoKKwkJCQkJICogKG5vbi1KYXZhZG9jKQorCQkJCQkgKiAKKwkJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkltcGwjZ2V0Tm90aWZpZXIoKQorCQkJCQkgKi8KKwkJCQkJcHVibGljIE9iamVjdCBnZXROb3RpZmllcigpIHsKKwkJCQkJCXJldHVybiBudWxsOyAvLyBub3RpZmllcjsKKwkJCQkJfQorCQkJCX0pOworCQkJfQorCQkJLyogZWxzZSByZXBsYWNlIGVudGlyZSBzdHJ1Y3R1cmUgKi8KKwkJfQorCX0KKworCS8qKgorCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS4KKwkgKi8KKwlwdWJsaWMgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBnZXRSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgeworCQlpZiAocmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7CisJCQlyZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5ID0gbmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsKKwkJCXJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuYWRkTGlzdGVuZXIodGhpcyk7CisJCX0KKwkJcmV0dXJuIHJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRU1GV29ya2JlbmNoRWRpdFBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRU1GV29ya2JlbmNoRWRpdFBsdWdpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MDliM2IKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9FTUZXb3JrYmVuY2hFZGl0UGx1Z2luLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FeHRlbmRlZEVjb3JlVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5QYXNzdGhydVJlc291cmNlU2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OworCisvKioKKyAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgorICovCitwdWJsaWMgY2xhc3MgRU1GV29ya2JlbmNoRWRpdFBsdWdpbiBleHRlbmRzIFBsdWdpbiB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24iOyAvLyROT04tTkxTLTEkCisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX01PREVMX0ZBQ1RPUklFU19FWFRFTlNJT05fUE9JTlQgPSAiZWRpdE1vZGVsIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRfTU9ERUxfRVhURU5TSU9OX1JFR0lTVFJZX0VYVEVOU0lPTl9QT0lOVCA9ICJlZGl0TW9kZWxFeHRlbnNpb24iOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURBUFRFUl9GQUNUT1JZX1JFR0lTVFJZX0VYVEVOU0lPTl9QT0lOVCA9ICJhZGFwdGVyRmFjdG9yeSI7IC8vJE5PTi1OTFMtMSQKKworCisJLy9UaGUgc2hhcmVkIGluc3RhbmNlLgorCXByaXZhdGUgc3RhdGljIEVNRldvcmtiZW5jaEVkaXRQbHVnaW4gcGx1Z2luOyAKKworCS8qKgorCSAqIFRoZSBjb25zdHJ1Y3Rvci4KKwkgKi8KKwlwdWJsaWMgRU1GV29ya2JlbmNoRWRpdFBsdWdpbigpIHsKKwkJc3VwZXIoKTsKKwkJcGx1Z2luID0gdGhpczsgCisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgRU1GV29ya2JlbmNoRWRpdFBsdWdpbiBnZXREZWZhdWx0KCkgeworCQlyZXR1cm4gcGx1Z2luOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdGFydHVwKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zdGFydChjb250ZXh0KTsKKwkJRXh0ZW5kZWRFY29yZVV0aWwuc2V0RmlsZU5vdEZvdW5kRGV0ZWN0b3IobmV3IEV4dGVuZGVkRWNvcmVVdGlsLkZpbGVOb3RGb3VuZERldGVjdG9yKCkgeworCQkJcHVibGljIGJvb2xlYW4gaXNGaWxlTm90Rm91bmQoV3JhcHBlZEV4Y2VwdGlvbiB3cmFwcGVkRXgpIHsKKwkJCQlyZXR1cm4gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmlzUmVzb3VyY2VOb3RGb3VuZCh3cmFwcGVkRXgpIHx8IHdyYXBwZWRFeC5leGNlcHRpb24oKSBpbnN0YW5jZW9mIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKKwkJCX0KKwkJfSk7CisJCVdvcmtiZW5jaFJlc291cmNlSGVscGVyLmluaXRpYWxpemVGaWxlQWRhcHRlckZhY3RvcnkoKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc291cmNlU2V0IGNyZWF0ZUlzb2xhdGVkUmVzb3VyY2VTZXQoSVByb2plY3QgcHJvamVjdCkgeworCQlyZXR1cm4gbmV3IFBhc3N0aHJ1UmVzb3VyY2VTZXQocHJvamVjdCk7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXNvdXJjZVNldCBjcmVhdGVXb3Jrc3BhY2VQYXNzdGhydVJlc291cmNlU2V0KCkgeworCQlyZXR1cm4gbmV3IFBhc3N0aHJ1UmVzb3VyY2VTZXQoKTsKKwl9CisKKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRWRpdE1vZGVsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9FZGl0TW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjJkNjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRWRpdE1vZGVsLmphdmEKQEAgLTAsMCArMSwxNjEyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTYWZlUnVubmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU2FmZVJ1bm5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLm5scy5FTUZXb3JrYmVuY2hSZXNvdXJjZUhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5SZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5JU2F2ZUhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLlNhdmVGYWlsZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLlNhdmVIYW5kbGVySGVhZGxlc3M7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLlNhdmVIYW5kbGVyUmVnaXN0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuRW5hYmxlbWVudElkZW50aWZpZXJFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5JRW5hYmxlbWVudElkZW50aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuSUVuYWJsZW1lbnRJZGVudGlmaWVyTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQubm9udWkuSVdGVFdyYXBwZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnMuSU9wZXJhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlZmVyZW5jZWRSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV4dGVuZGVkRWNvcmVVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5QbGVhc2VNaWdyYXRlWW91ckNvZGVFcnJvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQuQ2xpZW50QWNjZXNzUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guZWRpdC5FZGl0TW9kZWxSZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5lZGl0LkVkaXRNb2RlbFJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmVkaXQuUmVhZE9ubHlDbGllbnRBY2Nlc3NSZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuUmVzb3VyY2VTdGF0ZUlucHV0UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0LlJlc291cmNlU3RhdGVWYWxpZGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0LlJlc291cmNlU3RhdGVWYWxpZGF0b3JJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdC5SZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyOworCisKK3B1YmxpYyBjbGFzcyBFZGl0TW9kZWwgaW1wbGVtZW50cyBDb21tYW5kU3RhY2tMaXN0ZW5lciwgUmVzb3VyY2VTdGF0ZUlucHV0UHJvdmlkZXIsIFJlc291cmNlU3RhdGVWYWxpZGF0b3IsIElFbmFibGVtZW50SWRlbnRpZmllckxpc3RlbmVyIHsKKworCXByb3RlY3RlZCBCYXNpY0NvbW1hbmRTdGFjayBjb21tYW5kU3RhY2s7CisJcHJvdGVjdGVkIGZpbmFsIExpc3RlbmVyTGlzdCBsaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7CisKKwlwcml2YXRlIE1hcCBwYXJhbXM7CisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZWRpdE1vZGVsSUQ7CisJcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJlYWRPbmx5OworCS8vIFRoZXNlIGFyZSB0aGUgY3VycmVudCByZXNvdXJjZSB1cmlzIHdlIG5lZWQgdG8gdHJhY2sKKwlwcm90ZWN0ZWQgTGlzdCBrbm93blJlc291cmNlVXJpczsKKwkvLyBUaGVzZSBhcmUgdGhlIGN1cnJlbnQgcmVzb3VyY2UgZXh0ZW5zaW9ucyB0byB0cmFjaworCXByb3RlY3RlZCBMaXN0IGtub3duUmVzb3VyY2VFeHRlbnNpb25zOworCS8vIFRoaXMgaXMgYSBzdWJzZXQgb2YgdGhlIGtub3duIHJlc291cmNlIHVyaXMsIHdoaWNoIHdlIGhhdmUgcmVxdWVzdGVkIGJlIGF1dG9sb2FkZWQKKwlwcm90ZWN0ZWQgTGlzdCBwcmVsb2FkUmVzb3VyY2VVcmlzOworCS8vIFRoaXMgaXMgYSBtYXAgb2YgaWRlbnRpZmllcnMgdG8gcmVzb3VyY2VzIHRoYXQgd2UgbmVlZCB0byBsaXN0ZW4gdG8gaW4gb3JkZXIgdG8gbGlzdGVuIGZvcgorCS8vIHVwZGF0ZXMgdG8gdGhlIGVkaXQgbW9kZWwgcmVzb3VyY2VzCisJcHJvdGVjdGVkIE1hcCByZXNvdXJjZUlkZW50aWZpZXJzOworCisJcHJvdGVjdGVkIEVkaXRNb2RlbEV2ZW50IGRpcnR5TW9kZWxFdmVudDsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc05vdGlmaW5nID0gZmFsc2U7CisJcHJvdGVjdGVkIGJvb2xlYW4gZGlzcG9zaW5nID0gZmFsc2U7CisJcHJpdmF0ZSBib29sZWFuIGRpc3Bvc2VkID0gZmFsc2U7CisJcHJvdGVjdGVkIFJlc291cmNlU3RhdGVWYWxpZGF0b3Igc3RhdGVWYWxpZGF0b3I7CisJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXNzQXNSZWFkRm9yVW5Lbm93blVSSXM7CisJcHJvdGVjdGVkIFJlc291cmNlQWRhcHRlciByZXNvdXJjZUFkYXB0ZXIgPSBuZXcgUmVzb3VyY2VBZGFwdGVyKCk7CisJcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXZlcnRpbmcgPSBmYWxzZTsKKwlwcm90ZWN0ZWQgTGlzdCByZXNvdXJjZXM7CisJcHJpdmF0ZSBDbGllbnRBY2Nlc3NSZWdpc3RyeSByZWdpc3RyeTsKKwlwcm90ZWN0ZWQgRU1GV29ya2JlbmNoQ29udGV4dCBlbWZDb250ZXh0ID0gbnVsbDsKKwlwcm90ZWN0ZWQgSVByb2plY3QgcHJvamVjdCA9IG51bGw7CisKKwlwcml2YXRlIFJlZmVyZW5jZSByZWZlcmVuY2U7CisJcHJpdmF0ZSBMaXN0IHJlc291cmNlc1RhcmdldGVkRm9yVGVybWluYXRpb247CisKKwlwcm90ZWN0ZWQgY2xhc3MgUmVzb3VyY2VBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgeworCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJCWlmICghaXNEaXNwb3NpbmcoKSAmJiBub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlNFVCAmJiBub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKG51bGwpID09IFJlc291cmNlLlJFU09VUkNFX19JU19MT0FERUQpIHsKKwkJCQlyZXNvdXJjZUlzTG9hZGVkQ2hhbmdlZCgoUmVzb3VyY2UpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBub3RpZmljYXRpb24uZ2V0T2xkQm9vbGVhblZhbHVlKCksIG5vdGlmaWNhdGlvbi5nZXROZXdCb29sZWFuVmFsdWUoKSk7CisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgRWRpdE1vZGVsKFN0cmluZyBlZGl0TW9kZWxJRCwgRU1GV29ya2JlbmNoQ29udGV4dCBjb250ZXh0LCBib29sZWFuIHJlYWRPbmx5KSB7CisJCWlmIChjb250ZXh0ID09IG51bGwpCisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFTUYgY29udGV4dCBjYW4ndCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKKwkJdGhpcy5lZGl0TW9kZWxJRCA9IGVkaXRNb2RlbElEOworCQl0aGlzLnJlYWRPbmx5ID0gcmVhZE9ubHk7CisJCWlmIChyZWFkT25seSkKKwkJCXRoaXMucmVnaXN0cnkgPSBuZXcgUmVhZE9ubHlDbGllbnRBY2Nlc3NSZWdpc3RyeSgpOworCQllbHNlCisJCQl0aGlzLnJlZ2lzdHJ5ID0gbmV3IENsaWVudEFjY2Vzc1JlZ2lzdHJ5KCk7CisJCXRoaXMuZW1mQ29udGV4dCA9IGNvbnRleHQ7CisJCXRoaXMucHJvamVjdCA9IGNvbnRleHQuZ2V0UHJvamVjdCgpOworCQlpbml0aWFsaXplS25vd25SZXNvdXJjZVVyaXMoKTsKKwkJcHJvY2Vzc0xvYWRlZFJlc291cmNlcygpOworCQlwcm9jZXNzUHJlbG9hZFJlc291cmNlcygpOworCX0KKworCXB1YmxpYyBFZGl0TW9kZWwoU3RyaW5nIGVkaXRNb2RlbElELCBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQsIGJvb2xlYW4gcmVhZE9ubHksIGJvb2xlYW4gYWNjZXNzVW5rbm93blJlc291cmNlc0FzUmVhZE9ubHkpIHsKKwkJdGhpcyhlZGl0TW9kZWxJRCwgY29udGV4dCwgcmVhZE9ubHkpOworCQl0aGlzLmFjY2Vzc0FzUmVhZEZvclVuS25vd25VUklzID0gYWNjZXNzVW5rbm93blJlc291cmNlc0FzUmVhZE9ubHk7CisJfQorCisJLyoqCisJICogQHJldHVybiBlZGl0TW9kZWxJRAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdE1vZGVsSUQoKSB7CisJCXJldHVybiBlZGl0TW9kZWxJRDsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0Rpc3Bvc2luZygpIHsKKwkJcmV0dXJuIGRpc3Bvc2luZzsKKwl9CisKKwkKKwkvKioKKwkgKiBTdWJjbGFzc2VzIHNob3VsZCBub3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QuIFRoaXMgbWV0aG9kIHdpbGwgYmUgbWFkZQorCSAqIGZpbmFsIGluIHRoZSBuZXh0IHJlbGVhc2UuIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGRvRGlzcG9zZSgpIGFzCisJICogbmVjZXNzYXJ5IHRvIGRpc3Bvc2UgYW55IGFkZGl0aW9uYWwgYXJ0aWZhY3RzLgorCSAqLworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCXRyeSB7CisJCQlpZiAoZGlzcG9zaW5nIHx8IGRpc3Bvc2VkKQorCQkJCXJldHVybjsKKwkJCWRpc3Bvc2luZyA9IHRydWU7CisJCQorCQkJaWYgKGhhc0xpc3RlbmVycygpKQorCQkJCW5vdGlmeUxpc3RlbmVycyhuZXcgRWRpdE1vZGVsRXZlbnQoRWRpdE1vZGVsRXZlbnQuUFJFX0RJU1BPU0UsIHRoaXMpKTsKKwkJCQorCQkJcmVsZWFzZVJlc291cmNlcygpOworCisJCQlpZiAoY29tbWFuZFN0YWNrICE9IG51bGwpCisJCQkJY29tbWFuZFN0YWNrLnJlbW92ZUNvbW1hbmRTdGFja0xpc3RlbmVyKHRoaXMpOworCQkJaWYgKGdldEVtZkNvbnRleHQoKSAhPSBudWxsKQorCQkJCWdldEVtZkNvbnRleHQoKS5yZW1vdmVFZGl0TW9kZWwodGhpcywgaXNSZWFkT25seSgpKTsKKwkJCXJlbGVhc2VQcmVsb2FkUmVzb3VyY2VzKCk7CisJCQlyZWxlYXNlSWRlbnRpZmllcnMoKTsKKwkJCWRvRGlzcG9zZSgpOworCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IocmUpOworCQl9IGZpbmFsbHkgeworCQkJZW1mQ29udGV4dCA9IG51bGw7CisJCQlyZXNvdXJjZXMgPSBudWxsOworCQkJcHJvamVjdCA9IG51bGw7CisJCQlkaXNwb3NlZCA9IHRydWU7CisJCQlkaXNwb3NpbmcgPSBmYWxzZTsKKwkJfQorCX0KKworCS8qKgorCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFzIG5lY2Vzc2FyeQorCSAqLworCXByb3RlY3RlZCB2b2lkIGRvRGlzcG9zZSgpIHsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCByZWxlYXNlSWRlbnRpZmllcnMoKSB7CisJCWlmIChyZXNvdXJjZUlkZW50aWZpZXJzID09IG51bGwpCisJCQlyZXR1cm47CisJCUl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZUlkZW50aWZpZXJzLmtleVNldCgpLml0ZXJhdG9yKCk7CisJCUlFbmFibGVtZW50SWRlbnRpZmllciBpZGVudGlmaWVyID0gbnVsbDsKKwkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisJCQlpZGVudGlmaWVyID0gKElFbmFibGVtZW50SWRlbnRpZmllcikgaXRlci5uZXh0KCk7CisJCQlpZGVudGlmaWVyLnJlbW92ZUlkZW50aWZpZXJMaXN0ZW5lcih0aGlzKTsKKwkJfQorCX0KKworCXByaXZhdGUgUmVzb3VyY2VTZXRXb3JrYmVuY2hTeW5jaHJvbml6ZXIgZ2V0UmVzb3VyY2VTZXRTeW5jaHJvbml6ZXIoKSB7CisJCWlmIChlbWZDb250ZXh0ID09IG51bGwgfHwgIWVtZkNvbnRleHQuaGFzUmVzb3VyY2VTZXQoKSkKKwkJCXJldHVybiBudWxsOworCQlyZXR1cm4gZ2V0RW1mQ29udGV4dCgpLmdldFJlc291cmNlU2V0KCkuZ2V0U3luY2hyb25pemVyKCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcmVsZWFzZVByZWxvYWRSZXNvdXJjZXMoKSB7CisJCVJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplciBzeW5jID0gKFJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplcikgZ2V0UmVzb3VyY2VTZXRTeW5jaHJvbml6ZXIoKTsKKwkJaWYgKHN5bmMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcmVsb2FkUmVzb3VyY2VVcmlzLnNpemUoKTsgaSsrKSB7CisJCQkJVVJJIHVyaSA9IChVUkkpIHByZWxvYWRSZXNvdXJjZVVyaXMuZ2V0KGkpOworCQkJCXN5bmMuZGlzYWJsZUF1dG9sb2FkKHVyaSk7CisJCQl9CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGtub3duUmVzb3VyY2VFeHRlbnNpb25zLnNpemUoKTsgaSsrKSB7CisJCQkJU3RyaW5nIGV4dCA9IChTdHJpbmcpIGtub3duUmVzb3VyY2VFeHRlbnNpb25zLmdldChpKTsKKwkJCQlzeW5jLmRpc2FibGVBdXRvbG9hZChleHQpOworCQkJfQorCQl9CisJfQorCisKKwkvKiogKiogQkVHSU4gQ29tbWFuZCBTdGFjayBNYW5pcHVsYXRpb24gKioqICovCisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIENvbW1hbmRTdGFjay4KKwkgKi8KKwlwcm90ZWN0ZWQgQmFzaWNDb21tYW5kU3RhY2sgY3JlYXRlQ29tbWFuZFN0YWNrKCkgeworCQlCYXNpY0NvbW1hbmRTdGFjayBzdGFjayA9IG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpOworCQlyZXR1cm4gc3RhY2s7CisJfQorCisJLyoqCisJICogVGhpcyBpcyBjYWxsZWQgd2l0aCB0aGUge0BsaW5rb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFja30ncyBzdGF0ZSBoYXMgY2hhbmdlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBjb21tYW5kU3RhY2tDaGFuZ2VkKGphdmEudXRpbC5FdmVudE9iamVjdCBldmVudCkgeworCQlpZiAoZGlydHlNb2RlbEV2ZW50ID09IG51bGwpCisJCQlkaXJ0eU1vZGVsRXZlbnQgPSBuZXcgRWRpdE1vZGVsRXZlbnQoRWRpdE1vZGVsRXZlbnQuRElSVFksIHRoaXMpOworCQlpZiAoaGFzTGlzdGVuZXJzKCkpCisJCQlub3RpZnlMaXN0ZW5lcnMoZGlydHlNb2RlbEV2ZW50KTsKKwl9CisKKwkvKioKKwkgKiBGbHVzaCB0aGUgQ29tbWFuZHMgZnJvbSB0aGUgQ29tbWFuZFN0YWNrLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGZsdXNoQ29tbWFuZFN0YWNrKCkgeworCQlnZXRDb21tYW5kU3RhY2soKS5mbHVzaCgpOworCQlnZXRDb21tYW5kU3RhY2soKS5zYXZlSXNEb25lKCk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBDb21tYW5kU3RhY2suCisJICovCisJcHVibGljIEJhc2ljQ29tbWFuZFN0YWNrIGdldENvbW1hbmRTdGFjaygpIHsKKwkJaWYgKGNvbW1hbmRTdGFjayA9PSBudWxsKSB7CisJCQljb21tYW5kU3RhY2sgPSBjcmVhdGVDb21tYW5kU3RhY2soKTsKKwkJCWNvbW1hbmRTdGFjay5hZGRDb21tYW5kU3RhY2tMaXN0ZW5lcih0aGlzKTsKKwkJfQorCQlyZXR1cm4gY29tbWFuZFN0YWNrOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgYW55IGxpc3RlbmVycworCSAqLworCXB1YmxpYyBib29sZWFuIGhhc0xpc3RlbmVycygpIHsKKwkJcmV0dXJuICFsaXN0ZW5lcnMuaXNFbXB0eSgpOworCX0KKworCS8qKiAqKiBFTkQgQ29tbWFuZCBTdGFjayBNYW5pcHVsYXRpb24gKioqICovCisKKwkvKiogKiogQkVHSU4gTGlzdGVuZXJzICoqKiAqLworCisJLyoqCisJICogQWRkCisJICogCisJICogQGFMaXN0ZW5lciB0byB0aGUgbGlzdCBvZiBsaXN0ZW5lcnMuCisJICovCisJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoRWRpdE1vZGVsTGlzdGVuZXIgYUxpc3RlbmVyKSB7CisJCWlmIChhTGlzdGVuZXIgIT0gbnVsbCkKKwkJCWxpc3RlbmVycy5hZGQoYUxpc3RlbmVyKTsKKwl9CisKKwkvKioKKwkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mCisJICogCisJICogQGFuRXZlbnQuCisJICovCisJcHJvdGVjdGVkIHZvaWQgbm90aWZ5TGlzdGVuZXJzKGZpbmFsIEVkaXRNb2RlbEV2ZW50IGFuRXZlbnQpIHsKKwkJCisJCU5vdGlmeVJ1bm5lciBub3RpZmllciA9IG5ldyBOb3RpZnlSdW5uZXIoYW5FdmVudCk7IAorCQkKKwkJT2JqZWN0W10gbm90aWZ5TGlzdCA9IGxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsgCisJCWZvciAoaW50IGkgPSAwOyBpIDwgbm90aWZ5TGlzdC5sZW5ndGg7IGkrKykgeworCQkJbm90aWZpZXIuc2V0TGlzdGVuZXIoIChFZGl0TW9kZWxMaXN0ZW5lcikgbm90aWZ5TGlzdFtpXSApOworCQkJU2FmZVJ1bm5lci5ydW4obm90aWZpZXIpOworCQl9CisJfQorCisJLyoqCisJICogUmVtb3ZlCisJICogCisJICogQGFMaXN0ZW5lciBmcm9tIHRoZSBsaXN0IG9mIGxpc3RlbmVycy4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiByZW1vdmVMaXN0ZW5lcihFZGl0TW9kZWxMaXN0ZW5lciBhTGlzdGVuZXIpIHsKKwkJbGlzdGVuZXJzLnJlbW92ZShhTGlzdGVuZXIpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKiogKiogRU5EIExpc3RlbmVycyAqKiogKi8KKworCXByb3RlY3RlZCB2b2lkIG1ha2VGaWxlRWRpdGFibGUoSUZpbGUgYUZpbGUpIHsKKwkJaWYgKGFGaWxlID09IG51bGwpCisJCQlyZXR1cm47CisJCWFGaWxlLmdldFJlc291cmNlQXR0cmlidXRlcygpLnNldFJlYWRPbmx5KGZhbHNlKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0IG9mIElGaWxlOyBhbnkgcmVhZC1vbmx5IGZpbGVzIHRoYXQgd2lsbCBiZSB0b3VjaGVkIGlmIHRoaXMgZWRpdCBtb2RlbAorCSAqICAgICAgICAgc2F2ZXMKKwkgKi8KKwlwdWJsaWMgTGlzdCBnZXRSZWFkT25seUFmZmVjdGVkRmlsZXMoKSB7CisJCUl0ZXJhdG9yIGFmZmVjdGVkID0gZ2V0QWZmZWN0ZWRGaWxlcygpLml0ZXJhdG9yKCk7CisJCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOworCQl3aGlsZSAoYWZmZWN0ZWQuaGFzTmV4dCgpKSB7CisJCQlJRmlsZSBhRmlsZSA9IChJRmlsZSkgYWZmZWN0ZWQubmV4dCgpOworCQkJaWYgKGFGaWxlLmlzUmVhZE9ubHkoKSkKKwkJCQlyZXN1bHQuYWRkKGFGaWxlKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKiAqKiBCRUdJTiBTYXZlIEhhbmRsZXJzICoqKiAqLworCisJcHJvdGVjdGVkIElTYXZlSGFuZGxlciBnZXRTYXZlSGFuZGxlcigpIHsKKwkJcmV0dXJuIFNhdmVIYW5kbGVyUmVnaXN0ZXIuZ2V0U2F2ZUhhbmRsZXIoKTsKKwl9CisKKwkvKioKKwkgKiBEZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpZiBhIHNhdmVJZk5lY2Vzc2FyeSBvcgorCSAqIHNhdmVJZk5lY2Vzc2FyeVdpdGhQcm9tcHQgZGV0ZXJtaW5lcyBub3QgdG8gc2F2ZS4gVGhpcyBwcm92aWRlcyBzdWJjbGFzc2VzIHdpdGggYW4KKwkgKiBvcHBvcnR1bml0eSB0byBkbyBzb21lIG90aGVyIGFjdGlvbi4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTYXZlSWZOZWNlc3NhcnlEaWROb3RTYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQkvLyBkbyBub3RoaW5nCisJfQorCisJLyoqCisJICogVGhpcyB3aWxsIGZvcmNlIGFsbCBvZiB0aGUgcmVmZXJlbmNlZCBSZXNvdXJjZXMgdG8gYmUgc2F2ZWQuCisJICovCisJcHVibGljIHZvaWQgc2F2ZShPYmplY3QgYWNjZXNzb3JLZXkpIHsKKwkJc2F2ZShudWxsLCBhY2Nlc3NvcktleSk7CisJfQorCisJLyoqCisJICogVGhpcyB3aWxsIGZvcmNlIGFsbCBvZiB0aGUgcmVmZXJlbmNlZCBSZXNvdXJjZXMgdG8gYmUgc2F2ZWQuCisJICovCisJcHVibGljIHZvaWQgc2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBQbGVhc2VNaWdyYXRlWW91ckNvZGVFcnJvciB7CisJCS8vIHNhdmUKKwl9CisKKwkvKioKKwkgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB7QGxpbmsgI3ByaW1TYXZlfQorCSAqLworCXB1YmxpYyBmaW5hbCB2b2lkIHNhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBPYmplY3QgYWNjZXNzb3JLZXkpIHsKKwkJYXNzZXJ0UGVybWlzc2lvblRvU2F2ZShhY2Nlc3NvcktleSk7CisJCWdldFNhdmVIYW5kbGVyKCkuYWNjZXNzKCk7CisJCXRyeSB7CisJCQlJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgeworCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIGFNb25pdG9yKSB7CisJCQkJCXByaW1TYXZlKGFNb25pdG9yKTsKKwkJCQl9CisJCQl9OworCQkJcnVuU2F2ZU9wZXJhdGlvbihydW5uYWJsZSwgbW9uaXRvcik7CisJCX0gY2F0Y2ggKFNhdmVGYWlsZWRFeGNlcHRpb24gZXgpIHsKKwkJCWdldFNhdmVIYW5kbGVyKCkuaGFuZGxlU2F2ZUZhaWxlZChleCwgbW9uaXRvcik7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7CisJCX0gZmluYWxseSB7CisJCQlnZXRTYXZlSGFuZGxlcigpLnJlbGVhc2UoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFNhdmUgb25seSByZXNvdXJjZXMgdGhhdCBuZWVkIHRvIGJlIHNhdmVkIChpLmUuLCBubyBvdGhlciByZWZlcmVuY2VzKS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzYXZlSWZOZWNlc3NhcnkoT2JqZWN0IGFjY2Vzc29yS2V5KSB7CisJCXNhdmVJZk5lY2Vzc2FyeShudWxsLCBhY2Nlc3NvcktleSk7CisJfQorCisJLyoqCisJICogU2F2ZSBvbmx5IHJlc291cmNlcyB0aGF0IG5lZWQgdG8gYmUgc2F2ZWQgKGkuZS4sIG5vIG90aGVyIHJlZmVyZW5jZXMpLgorCSAqLworCXB1YmxpYyB2b2lkIHNhdmVJZk5lY2Vzc2FyeShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIE9iamVjdCBhY2Nlc3NvcktleSkgeworCQlpZiAoc2hvdWxkU2F2ZSgpKQorCQkJc2F2ZShtb25pdG9yLCBhY2Nlc3NvcktleSk7CisJCWVsc2UKKwkJCWhhbmRsZVNhdmVJZk5lY2Vzc2FyeURpZE5vdFNhdmUobW9uaXRvcik7CisJfQorCisJLyoqCisJICogU2F2ZSBvbmx5IGlmIG5lY2Vzc2FyeS4gSWYgdHlwaWNhbGx5IGEgc2F2ZSB3b3VsZCBub3Qgb2NjdXIgYmVjYXVzZSB0aGlzIGVkaXQgbW9kZWwgaXMKKwkgKiBzaGFyZWQsIHRoZSB1c2VyIHdpbGwgYmUgcHJvbXB0ZWQgdXNpbmcgdGhlCisJICogCisJICogQG9wZXJhdGlvbkhhbmRsZXIuIElmIHRoZSBwcm9tcHQgcmV0dXJucyB0cnVlICh0aGUgdXNlciB3YW50cyB0byBzYXZlKSB0aGUgZW50aXJlIGVkaXQgbW9kZWwKKwkgKiAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzYXZlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzYXZlSWZOZWNlc3NhcnlXaXRoUHJvbXB0KElPcGVyYXRpb25IYW5kbGVyIG9wZXJhdGlvbkhhbmRsZXIsIE9iamVjdCBhY2Nlc3NvcktleSkgeworCQlzYXZlSWZOZWNlc3NhcnlXaXRoUHJvbXB0KG51bGwsIG9wZXJhdGlvbkhhbmRsZXIsIGFjY2Vzc29yS2V5KTsKKwl9CisKKwkvKioKKwkgKiBTYXZlIG9ubHkgaWYgbmVjZXNzYXJ5LiBJZiB0eXBpY2FsbHkgYSBzYXZlIHdvdWxkIG5vdCBvY2N1ciBiZWNhdXNlIHRoaXMgZWRpdCBtb2RlbCBpcworCSAqIHNoYXJlZCwgdGhlIHVzZXIgd2lsbCBiZSBwcm9tcHRlZCB1c2luZyB0aGUKKwkgKiAKKwkgKiBAb3BlcmF0aW9uSGFuZGxlci4gSWYgdGhlIHByb21wdCByZXR1cm5zIHRydWUgKHRoZSB1c2VyIHdhbnRzIHRvIHNhdmUpIHRoZSBlbnRpcmUgZWRpdCBtb2RlbAorCSAqICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHNhdmVkLiBZb3UgbWF5IHBhc3MgaW4gYSBib29sZWFuIDxjb2RlPndhc0RpcnR5PC9jb2RlPiB0bworCSAqICAgICAgICAgICAgICAgICAgICBpbmRpY2F0ZSB3aGV0aGVyIHRoaXMgZWRpdCBtb2RlbCB3YXMgZGlydHkgcHJpb3IgdG8gbWFraW5nIGFueSBjaGFuZ2VzIGFuZAorCSAqICAgICAgICAgICAgICAgICAgICBjYWxsaW5nIHRoaXMgbWV0aG9kLiB7QGxpbmsgRWRpdE1vZGVsI2lzRGlydHkoKX0KKwkgKi8KKwlwdWJsaWMgdm9pZCBzYXZlSWZOZWNlc3NhcnlXaXRoUHJvbXB0KElPcGVyYXRpb25IYW5kbGVyIG9wZXJhdGlvbkhhbmRsZXIsIGJvb2xlYW4gd2FzRGlydHksIE9iamVjdCBhY2Nlc3NvcktleSkgeworCQlzYXZlSWZOZWNlc3NhcnlXaXRoUHJvbXB0KG51bGwsIG9wZXJhdGlvbkhhbmRsZXIsIHdhc0RpcnR5LCBhY2Nlc3NvcktleSk7CisJfQorCisJLyoqCisJICogU2F2ZSBvbmx5IGlmIG5lY2Vzc2FyeS4gSWYgdHlwaWNhbGx5IGEgc2F2ZSB3b3VsZCBub3Qgb2NjdXIgYmVjYXVzZSB0aGlzIGVkaXQgbW9kZWwgaXMKKwkgKiBzaGFyZWQsIHRoZSB1c2VyIHdpbGwgYmUgcHJvbXB0ZWQgdXNpbmcgdGhlCisJICogCisJICogQG9wZXJhdGlvbkhhbmRsZXIuIElmIHRoZSBwcm9tcHQgcmV0dXJucyB0cnVlICh0aGUgdXNlciB3YW50cyB0byBzYXZlKSB0aGUgZW50aXJlIGVkaXQgbW9kZWwKKwkgKiAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzYXZlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzYXZlSWZOZWNlc3NhcnlXaXRoUHJvbXB0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSU9wZXJhdGlvbkhhbmRsZXIgb3BlcmF0aW9uSGFuZGxlciwgT2JqZWN0IGFjY2Vzc29yS2V5KSB7CisJCXNhdmVJZk5lY2Vzc2FyeVdpdGhQcm9tcHQobW9uaXRvciwgb3BlcmF0aW9uSGFuZGxlciwgdHJ1ZSwgYWNjZXNzb3JLZXkpOworCX0KKworCS8qKgorCSAqIFNhdmUgb25seSBpZiBuZWNlc3NhcnkuIElmIHR5cGljYWxseSBhIHNhdmUgd291bGQgbm90IG9jY3VyIGJlY2F1c2UgdGhpcyBlZGl0IG1vZGVsIGlzCisJICogc2hhcmVkLCB0aGUgdXNlciB3aWxsIGJlIHByb21wdGVkIHVzaW5nIHRoZQorCSAqIAorCSAqIEBvcGVyYXRpb25IYW5kbGVyLiBJZiB0aGUgcHJvbXB0IHJldHVybnMgdHJ1ZSAodGhlIHVzZXIgd2FudHMgdG8gc2F2ZSkgdGhlIGVudGlyZSBlZGl0IG1vZGVsCisJICogICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc2F2ZWQuIFlvdSBtYXkgcGFzcyBpbiBhIGJvb2xlYW4gPGNvZGU+d2FzRGlydHk8L2NvZGU+IHRvCisJICogICAgICAgICAgICAgICAgICAgIGluZGljYXRlIHdoZXRoZXIgdGhpcyBlZGl0IG1vZGVsIHdhcyBkaXJ0eSBwcmlvciB0byBtYWtpbmcgYW55IGNoYW5nZXMgYW5kCisJICogICAgICAgICAgICAgICAgICAgIGNhbGxpbmcgdGhpcyBtZXRob2QuIHtAbGluayBFZGl0TW9kZWwjaXNEaXJ0eSgpfQorCSAqLworCXB1YmxpYyB2b2lkIHNhdmVJZk5lY2Vzc2FyeVdpdGhQcm9tcHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJT3BlcmF0aW9uSGFuZGxlciBvcGVyYXRpb25IYW5kbGVyLCBib29sZWFuIHdhc0RpcnR5LCBPYmplY3QgYWNjZXNzb3JLZXkpIHsKKworCQlpZiAoc2hvdWxkU2F2ZShvcGVyYXRpb25IYW5kbGVyLCB3YXNEaXJ0eSkpCisJCQlzYXZlKG1vbml0b3IsIGFjY2Vzc29yS2V5KTsKKwkJZWxzZQorCQkJaGFuZGxlU2F2ZUlmTmVjZXNzYXJ5RGlkTm90U2F2ZShtb25pdG9yKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhc3NlcnRQZXJtaXNzaW9uVG9TYXZlKE9iamVjdCBhY2Nlc3NvcktleSkgeworCQlpZiAocmVnaXN0cnkgIT0gbnVsbCkKKwkJCXJlZ2lzdHJ5LmFzc2VydEFjY2VzcyhhY2Nlc3NvcktleSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcnVuU2F2ZU9wZXJhdGlvbihJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFNhdmVGYWlsZWRFeGNlcHRpb24geworCQl0cnkgeworCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihydW5uYWJsZSwgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSwgSVdvcmtzcGFjZS5BVk9JRF9VUERBVEUsIG1vbml0b3IpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBTYXZlRmFpbGVkRXhjZXB0aW9uKGUpOworCQl9CisJfQorCisJLyoqCisJICogU2hvdWxkIHRoZSByZXNvdXJjZXMgYmUgc2F2ZWQuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU2F2ZShJT3BlcmF0aW9uSGFuZGxlciBvcGVyYXRpb25IYW5kbGVyLCBib29sZWFuIHdhc0RpcnR5KSB7CisJCXJldHVybiAhd2FzRGlydHkgPyBzaG91bGRTYXZlKCkgOiBzaG91bGRTYXZlKG9wZXJhdGlvbkhhbmRsZXIpOworCX0KKworCS8qKgorCSAqIFJldHVybiB0cnVlIGlmIHRoZSB1cmkgZm9yCisJICogCisJICogQGFSZXNvdXJjZSBpcyBvbmUgb2YgdGhlIGtub3duIHJlc291cmNlIHVyaXMuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNJbnRlcnJlc3RlZEluUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKSB7CisJCXJldHVybiBpc0ludGVycmVzdGVkSW5SZXNvdXJjZVVyaShhUmVzb3VyY2UuZ2V0VVJJKCkpOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIGlzSW50ZXJyZXN0ZWRJblJlc291cmNlVXJpKFVSSSByZXNVUkkpIHsKKwkJVVJJIHVyaTsKKwkJTGlzdCB1cmlTdHJpbmdzID0gZ2V0S25vd25SZXNvdXJjZVVyaXMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmlTdHJpbmdzLnNpemUoKTsgaSsrKSB7CisJCQl1cmkgPSAoVVJJKSB1cmlTdHJpbmdzLmdldChpKTsKKwkJCWlmIChFeHRlbmRlZEVjb3JlVXRpbC5lbmRzV2l0aChyZXNVUkksIHVyaSkpCisJCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCisJLyoqCisJICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYW5kIGFkZCBVUklzICh0eXBlIFVSSSkgb2Yga25vd24gcmVzb3VyY2VzLiBZb3UgbXVzdCBhZGQgcmVzb3VyY2VzCisJICogdGhhdCBoYXZlIHJlZmVyZW5jZXMgdG8gb3RoZXIga25vd24gcmVzb3VyY2VzIGZpcnN0IHNvIHRoZXkgd2lsbCBiZSByZWxlYXNlZCBmaXJzdC4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplS25vd25SZXNvdXJjZVVyaXMoKSB7CisJCWtub3duUmVzb3VyY2VVcmlzID0gbmV3IEFycmF5TGlzdCgpOworCQlwcmVsb2FkUmVzb3VyY2VVcmlzID0gbmV3IEFycmF5TGlzdCgpOworCQlFZGl0TW9kZWxSZXNvdXJjZSByZXMgPSBudWxsOworCQlDb2xsZWN0aW9uIGVkaXRNb2RlbFJlc291cmNlcyA9IEVkaXRNb2RlbFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RWRpdE1vZGVsUmVzb3VyY2VzKGdldEVkaXRNb2RlbElEKCkpOworCQlJdGVyYXRvciBpdGVyID0gZWRpdE1vZGVsUmVzb3VyY2VzLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgeworCQkJcmVzID0gKEVkaXRNb2RlbFJlc291cmNlKSBpdGVyLm5leHQoKTsKKwkJCWFkZEVkaXRNb2RlbFJlc291cmNlKHJlcyk7CisJCX0KKwkJQ29sbGVjdGlvbiByZXNvdXJjZUV4dGVuc2lvbnMgPSBFZGl0TW9kZWxSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEVkaXRNb2RlbEV4dGVuc2lvbnMoZ2V0RWRpdE1vZGVsSUQoKSk7CisJCS8qIGJ1ZyAxNzA2OTAgLSBpbml0aWFsaXplIGtub3duUmVzb3VyY2VFeHRlbnNpb25zIGlmIG5lY2Vzc2FyeSwgYW5kIGNoYW5nZSByZWZlcmVuY2UgZnJvbSBpdGVyIHRvIGl0ICovCisJCWlmIChrbm93blJlc291cmNlRXh0ZW5zaW9ucyA9PSBudWxsKQorCQl7CisJCQlrbm93blJlc291cmNlRXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJfQorCQlpZiAoIXJlc291cmNlRXh0ZW5zaW9ucy5pc0VtcHR5KCkpCisJCXsKKwkJCWtub3duUmVzb3VyY2VFeHRlbnNpb25zLmFkZEFsbChyZXNvdXJjZUV4dGVuc2lvbnMpOworCQkJSXRlcmF0b3IgaXQgPSByZXNvdXJjZUV4dGVuc2lvbnMuaXRlcmF0b3IoKTsKKwkJCVJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplciBzeW5jID0gKFJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplcikgZ2V0RW1mQ29udGV4dCgpLmdldFJlc291cmNlU2V0KCkuZ2V0U3luY2hyb25pemVyKCk7CisJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisJCQkJc3luYy5lbmFibGVBdXRvbG9hZChpdC5uZXh0KCkudG9TdHJpbmcoKSk7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgYWRkRWRpdE1vZGVsUmVzb3VyY2UoRWRpdE1vZGVsUmVzb3VyY2UgcmVzKSB7CisJCWJvb2xlYW4gZW5hYmxlZCA9IGZhbHNlOworCQl0cnkgeworCQkJaWYgKHJlcy5pc0NvcmUoKSkgeworCQkJCWVuYWJsZWQgPSB0cnVlOworCQkJfSBlbHNlIHsKKwkJCQlJRW5hYmxlbWVudElkZW50aWZpZXIgaWRlbnRpZmllciA9IHJlcy5nZXRFbmFibGVtZW50SWRlbnRpZmllcihnZXRQcm9qZWN0KCkpOworCQkJCXJlZ2lzdGVySW50ZXJlc3QoaWRlbnRpZmllciwgcmVzKTsKKwkJCQllbmFibGVkID0gaWRlbnRpZmllci5pc0VuYWJsZWQoKTsKKwkJCX0KKwkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ1dhcm5pbmcocmUpOworCQl9CisJCWlmIChlbmFibGVkKSB7CisJCQlVUkkgdXJpID0gcmVzLmdldFVSSSgpOworCQkJa25vd25SZXNvdXJjZVVyaXMuYWRkKHVyaSk7CisJCQlpZiAocmVzLmlzQXV0b0xvYWQoKSkgeworCQkJCVJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplciBzeW5jID0gKFJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplcikgZ2V0RW1mQ29udGV4dCgpLmdldFJlc291cmNlU2V0KCkuZ2V0U3luY2hyb25pemVyKCk7CisJCQkJc3luYy5lbmFibGVBdXRvbG9hZCh1cmkpOworCQkJCXByZWxvYWRSZXNvdXJjZVVyaXMuYWRkKHVyaSk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gcmVzCisJICovCisJcHJpdmF0ZSB2b2lkIHJlZ2lzdGVySW50ZXJlc3QoSUVuYWJsZW1lbnRJZGVudGlmaWVyIGlkZW50aWZpZXIsIEVkaXRNb2RlbFJlc291cmNlIHJlcykgeworCQlnZXRFZGl0TW9kZWxSZXNvdXJjZXMoaWRlbnRpZmllcikuYWRkKHJlcyk7CisJfQorCisJcHJpdmF0ZSBMaXN0IGdldEVkaXRNb2RlbFJlc291cmNlcyhJRW5hYmxlbWVudElkZW50aWZpZXIgaWRlbnRpZmllcikgeworCQlpZiAocmVzb3VyY2VJZGVudGlmaWVycyA9PSBudWxsKQorCQkJcmVzb3VyY2VJZGVudGlmaWVycyA9IG5ldyBIYXNoTWFwKCk7CisJCUxpc3QgdFJlc291cmNlcyA9IChMaXN0KSByZXNvdXJjZUlkZW50aWZpZXJzLmdldChpZGVudGlmaWVyKTsKKwkJaWYgKHRSZXNvdXJjZXMgPT0gbnVsbCkgeworCQkJdFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoMyk7CisJCQlyZXNvdXJjZUlkZW50aWZpZXJzLnB1dChpZGVudGlmaWVyLCB0UmVzb3VyY2VzKTsKKwkJCWlkZW50aWZpZXIuYWRkSWRlbnRpZmllckxpc3RlbmVyKHRoaXMpOworCQl9CisJCXJldHVybiB0UmVzb3VyY2VzOworCX0KKworCisKKwlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0S25vd25SZXNvdXJjZVVyaXMoKSB7CisJCWlmIChrbm93blJlc291cmNlVXJpcyA9PSBudWxsKQorCQkJaW5pdGlhbGl6ZUtub3duUmVzb3VyY2VVcmlzKCk7CisKKwkJcmV0dXJuIGtub3duUmVzb3VyY2VVcmlzOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzU2hhcmVkKCkgeworCQlyZXR1cm4gcmVnaXN0cnkuc2l6ZSgpID4gMTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIFJlc291cmNlU3RhdGVJbnB1dFByb3ZpZGVyI2NhY2hlTm9uUmVzb3VyY2VWYWxpZGF0ZVN0YXRlKExpc3QpCisJICovCisJcHVibGljIHZvaWQgY2FjaGVOb25SZXNvdXJjZVZhbGlkYXRlU3RhdGUoTGlzdCByb05vblJlc291cmNlRmlsZXMpIHsKKwkJLy8gZG8gbm90aGluZworCX0KKworCS8qKgorCSAqIEBzZWUgUmVzb3VyY2VTdGF0ZUlucHV0UHJvdmlkZXIjZ2V0Tm9uUmVzb3VyY2VGaWxlcygpCisJICovCisJcHVibGljIExpc3QgZ2V0Tm9uUmVzb3VyY2VGaWxlcygpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQHNlZSBSZXNvdXJjZVN0YXRlSW5wdXRQcm92aWRlciNnZXROb25SZXNvdXJjZUluY29uc2lzdGVudEZpbGVzKCkKKwkgKi8KKwlwdWJsaWMgTGlzdCBnZXROb25SZXNvdXJjZUluY29uc2lzdGVudEZpbGVzKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBHZXRzIHRoZSBzdGF0ZVZhbGlkYXRvci4KKwkgKiAKKwkgKiBAcmV0dXJuIFJldHVybnMgYSBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yCisJICovCisJcHVibGljIFJlc291cmNlU3RhdGVWYWxpZGF0b3IgZ2V0U3RhdGVWYWxpZGF0b3IoKSB7CisJCWlmIChzdGF0ZVZhbGlkYXRvciA9PSBudWxsKQorCQkJc3RhdGVWYWxpZGF0b3IgPSBjcmVhdGVTdGF0ZVZhbGlkYXRvcigpOworCQlyZXR1cm4gc3RhdGVWYWxpZGF0b3I7CisJfQorCisJLyoqCisJICogTWV0aG9kIGNyZWF0ZVN0YXRlVmFsaWRhdG9yLgorCSAqIAorCSAqIEByZXR1cm4gUmVzb3VyY2VTdGF0ZVZhbGlkYXRvcgorCSAqLworCXByaXZhdGUgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvciBjcmVhdGVTdGF0ZVZhbGlkYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBSZXNvdXJjZVN0YXRlVmFsaWRhdG9ySW1wbCh0aGlzKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIFJlc291cmNlU3RhdGVWYWxpZGF0b3IjY2hlY2tBY3RpdmF0aW9uKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIpCisJICovCisJcHVibGljIHZvaWQgY2hlY2tBY3RpdmF0aW9uKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIgcHJlc2VudGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCWdldFN0YXRlVmFsaWRhdG9yKCkuY2hlY2tBY3RpdmF0aW9uKHByZXNlbnRlcik7CisJfQorCisJLyoqCisJICogQHNlZSBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yI2xvc3RBY3RpdmF0aW9uKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIpCisJICovCisJcHVibGljIHZvaWQgbG9zdEFjdGl2YXRpb24oUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciBwcmVzZW50ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJZ2V0U3RhdGVWYWxpZGF0b3IoKS5sb3N0QWN0aXZhdGlvbihwcmVzZW50ZXIpOworCX0KKworCS8qKgorCSAqIEBzZWUgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvciN2YWxpZGF0ZVN0YXRlKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIpCisJICovCisJcHVibGljIElTdGF0dXMgdmFsaWRhdGVTdGF0ZShSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyIHByZXNlbnRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlpZiAocHJlc2VudGVyID09IG51bGwpCisJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKwkJcmV0dXJuIGdldFN0YXRlVmFsaWRhdG9yKCkudmFsaWRhdGVTdGF0ZShwcmVzZW50ZXIpOworCX0KKworCS8qKgorCSAqIEBzZWUgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvciNjaGVja1NhdmUoUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlcikKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBjaGVja1NhdmUoUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciBwcmVzZW50ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGdldFN0YXRlVmFsaWRhdG9yKCkuY2hlY2tTYXZlKHByZXNlbnRlcik7CisJfQorCisJLyoqCisJICogQHNlZSBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yI2NoZWNrUmVhZE9ubHkoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGNoZWNrUmVhZE9ubHkoKSB7CisJCXJldHVybiBnZXRTdGF0ZVZhbGlkYXRvcigpLmNoZWNrUmVhZE9ubHkoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIFJlc291cmNlU2V0IGZyb20gdGhlIE5hdHVyZS4KKwkgKiAKKwkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldAorCSAqLworCXB1YmxpYyBSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldCgpIHsKKwkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBudWxsOworCQlpZiAoZ2V0RW1mQ29udGV4dCgpICE9IG51bGwpCisJCQlyZXNvdXJjZVNldCA9IGdldEVtZkNvbnRleHQoKS5nZXRSZXNvdXJjZVNldCgpOworCQlyZXR1cm4gcmVzb3VyY2VTZXQ7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcmVzb3VyY2VJc0xvYWRlZENoYW5nZWQoUmVzb3VyY2UgYVJlc291cmNlLCBib29sZWFuIG9sZFZhbHVlLCBib29sZWFuIG5ld1ZhbHVlKSB7CisJCWlmICghaXNSZXZlcnRpbmcgJiYgIWRpc3Bvc2luZyAmJiBoYXNMaXN0ZW5lcnMoKSkgeworCQkJaW50IGV2ZW50Q29kZSA9IG5ld1ZhbHVlID8gRWRpdE1vZGVsRXZlbnQuTE9BREVEX1JFU09VUkNFIDogRWRpdE1vZGVsRXZlbnQuVU5MT0FERURfUkVTT1VSQ0U7CisJCQlFZGl0TW9kZWxFdmVudCBldnQgPSBuZXcgRWRpdE1vZGVsRXZlbnQoZXZlbnRDb2RlLCB0aGlzKTsKKwkJCWV2dC5hZGRSZXNvdXJjZShhUmVzb3VyY2UpOworCQkJbm90aWZ5TGlzdGVuZXJzKGV2dCk7CisJCX0KKwl9CisKKwlwdWJsaWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoVVJJIGFVcmkpIHsKKwkJUmVzb3VyY2UgcmVzID0gZ2V0QW5kTG9hZExvY2FsUmVzb3VyY2UoYVVyaSk7CisJCWlmIChyZXMgPT0gbnVsbCkKKwkJCXJlcyA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldE9yQ3JlYXRlUmVzb3VyY2UoYVVyaSwgZ2V0UmVzb3VyY2VTZXQoKSk7CisJCWlmIChyZXMgIT0gbnVsbCkKKwkJCXByb2Nlc3NSZXNvdXJjZShyZXMpOworCQlyZXR1cm4gcmVzOworCX0KKworCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKKwkJaWYgKGFSZXNvdXJjZSAhPSBudWxsICYmICFnZXRSZXNvdXJjZXMoKS5jb250YWlucyhhUmVzb3VyY2UpKSB7CisJCQlpZiAoYVJlc291cmNlIGluc3RhbmNlb2YgUmVmZXJlbmNlZFJlc291cmNlKSB7CisJCQkJYWNjZXNzKChSZWZlcmVuY2VkUmVzb3VyY2UpIGFSZXNvdXJjZSk7CisJCQkJLy8gV2UgbmVlZCBhIGJldHRlciB3YXkgdG8gcGFzcyB0aGlzIHRocm91Z2ggdGhlIHNhdmUgb3B0aW9ucyBpbnN0ZWFkLgorCQkJCS8vIFdlIGFsc28gbmVlZCB0byBtYWtlIHRoaXMgZHluYW1pYyBiYXNlZCBvbiB0aGUgcHJvamVjdCB0YXJnZXQKKwkJCQkoKFJlZmVyZW5jZWRSZXNvdXJjZSkgYVJlc291cmNlKS5zZXRGb3JtYXQoQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlLkZPUk1BVF9NT0Y1KTsKKwkJCX0gZWxzZSBpZiAoYVJlc291cmNlIGluc3RhbmNlb2YgQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlKSB7CisJCQkJKChDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UpIGFSZXNvdXJjZSkuc2V0Rm9ybWF0KENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZS5GT1JNQVRfTU9GNSk7CisJCQl9CisKKwkJCWFkZFJlc291cmNlKGFSZXNvdXJjZSk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhZGRSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKKwkJZ2V0UmVzb3VyY2VzKCkuYWRkKGFSZXNvdXJjZSk7CisJCWFSZXNvdXJjZS5lQWRhcHRlcnMoKS5hZGQocmVzb3VyY2VBZGFwdGVyKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gYSBSZXNvdXJjZSBmb3IKKwkgKiAKKwkgKiBAYVVyaS4KKwkgKi8KKwkvLyBUT0RPIFRoZSBmb2xsb3dpbmcgbWV0aG9kIHdpbGwgb25seSB1c2UgdGhlIGxhc3Qgc2VnbWVudCB3aGVuIGxvb2tpbmcgZm9yIGEgcmVzb3VyY2UuCisJcHJvdGVjdGVkIFJlc291cmNlIGdldFJlc291cmNlKExpc3QgdFJlc291cmNlcywgVVJJIGFVcmkpIHsKKwkJUmVzb3VyY2UgcmVzb3VyY2U7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdFJlc291cmNlcy5zaXplKCk7IGkrKykgeworCQkJcmVzb3VyY2UgPSAoUmVzb3VyY2UpIHRSZXNvdXJjZXMuZ2V0KGkpOworCQkJaWYgKEV4dGVuZGVkRWNvcmVVdGlsLmVuZHNXaXRoKHJlc291cmNlLmdldFVSSSgpLCBhVXJpKSkKKwkJCQlyZXR1cm4gcmVzb3VyY2U7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRFeGlzdGluZ09yQ3JlYXRlUmVzb3VyY2UodXJpKTsKKwkJcHJvY2Vzc1Jlc291cmNlKHJlc291cmNlKTsKKwkJcmV0dXJuIHJlc291cmNlOworCX0KKworCS8qKgorCSAqIEdldCBhIGNhY2hlZCBSZXNvdXJjZSwgZWl0aGVyIGxvY2FsIG9yIGluIHRoZSBSZXNvdXJjZVNldCwgYmVmb3JlIGNyZWF0aW5nIGEgUmVzb3VyY2UuIFRoaXMKKwkgKiBhcGkgaGFuZGxlcyB0aGUgY2FzZSB0aGF0IHRoZSBSZXNvdXJjZSBtYXkgYmUgY3JlYXRlZCBkdXJpbmcgYSBkZW1hbmQgbG9hZCB0aGF0IGZhaWxlZC4KKwkgKi8KKwlwdWJsaWMgUmVzb3VyY2UgZ2V0RXhpc3RpbmdPckNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKKwkJUmVzb3VyY2UgcmVzID0gZ2V0QW5kTG9hZExvY2FsUmVzb3VyY2UodXJpKTsKKwkJaWYgKHJlcyA9PSBudWxsKQorCQkJcmVzID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldEV4aXN0aW5nT3JDcmVhdGVSZXNvdXJjZSh1cmksIGdldFJlc291cmNlU2V0KCkpOworCQlyZXR1cm4gcmVzOworCX0KKworCS8qKgorCSAqIFJldHVybiBhIFJlc291cmNlIGZvcgorCSAqIAorCSAqIEBhVXJpLgorCSAqLworCXByb3RlY3RlZCBSZXNvdXJjZSBnZXRBbmRMb2FkTG9jYWxSZXNvdXJjZShVUkkgYVVyaSkgeworCQlSZXNvdXJjZSByZXNvdXJjZSA9IGdldExvY2FsUmVzb3VyY2UoYVVyaSk7CisJCWlmIChudWxsICE9IHJlc291cmNlICYmICFyZXNvdXJjZS5pc0xvYWRlZCgpKSB7CisJCQl0cnkgeworCQkJCXJlc291cmNlLmxvYWQoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsgLy8gcmVsb2FkIGl0CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJLy8gSWdub3JlCisJCQl9CisJCX0KKwkJcmV0dXJuIHJlc291cmNlOworCX0KKworCS8qKgorCSAqIFJldHVybiBhIFJlc291cmNlIGZvcgorCSAqIAorCSAqIEBhVXJpLgorCSAqLworCXByb3RlY3RlZCBSZXNvdXJjZSBnZXRMb2NhbFJlc291cmNlKFVSSSBhVXJpKSB7CisJCXJldHVybiBnZXRSZXNvdXJjZShnZXRSZXNvdXJjZXMoKSwgYVVyaSk7CisJfQorCisJLyoKKwkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgUmVhZE9ubHkgRWRpdE1vZGVsIG9yIGlmIHdlIHNob3VsZCBvbmx5IGFjY2VzcyB1bmtub3duIFVSSXMgYXMKKwkgKiBSZWFkT25seS4KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRBY2Nlc3NGb3JSZWFkKFJlZmVyZW5jZWRSZXNvdXJjZSBhUmVzb3VyY2UpIHsKKwkJcmV0dXJuIGlzUmVhZE9ubHkoKSB8fCAoYWNjZXNzQXNSZWFkRm9yVW5Lbm93blVSSXMgJiYgIWlzSW50ZXJyZXN0ZWRJblJlc291cmNlKGFSZXNvdXJjZSkpOworCX0KKworCS8qKgorCSAqIFNhdmUgb25seSByZXNvdXJjZXMgdGhhdCBuZWVkIHRvIGJlIHNhdmVkIChpLmUuLCBubyBvdGhlciByZWZlcmVuY2VzKS4KKwkgKi8KKwlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoRWRpdE1vZGVsRXZlbnQgYW5FdmVudCkgeworCQlpbnQgY29kZSA9IGFuRXZlbnQuZ2V0RXZlbnRDb2RlKCk7CisJCXN3aXRjaCAoY29kZSkgeworCQkJY2FzZSBFZGl0TW9kZWxFdmVudC5SRU1PVkVEX1JFU09VUkNFIDogeworCQkJCWlmICghaXNSZXZlcnRpbmcgJiYgaGFzUmVzb3VyY2VSZWZlcmVuY2UoYW5FdmVudC5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkpKQorCQkJCQlyZW1vdmVSZXNvdXJjZXMoYW5FdmVudC5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkpOworCQkJCWVsc2UKKwkJCQkJcmV0dXJuOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBFZGl0TW9kZWxFdmVudC5BRERFRF9SRVNPVVJDRSA6CisJCQkJaWYgKCFwcm9jZXNzUmVzb3VyY2VzSWZJbnRlcnJlc3RlZChhbkV2ZW50LmdldENoYW5nZWRSZXNvdXJjZXMoKSkpCisJCQkJCXJldHVybjsKKwkJfQorCQlpZiAoaGFzTGlzdGVuZXJzKCkpIHsKKwkJCWFuRXZlbnQuc2V0RWRpdE1vZGVsKHRoaXMpOworCQkJbm90aWZ5TGlzdGVuZXJzKGFuRXZlbnQpOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJuIHRydWUgaWYgYVJlc291cmNlIGlzIHJlZmVyZW5jZWQgYnkgbWUuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaGFzUmVzb3VyY2VSZWZlcmVuY2UoUmVzb3VyY2UgYVJlc291cmNlKSB7CisJCWlmIChhUmVzb3VyY2UgIT0gbnVsbCkKKwkJCXJldHVybiBnZXRSZXNvdXJjZXMoKS5jb250YWlucyhhUmVzb3VyY2UpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRydWUgaWYgYW55IFJlc291cmNlIGluIHRoZSBsaXN0IG9mCisJICogCisJICogQHJlc291cmNlcyBpcyByZWZlcmVuY2VkIGJ5IG1lLgorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGhhc1Jlc291cmNlUmVmZXJlbmNlKExpc3QgdFJlc291cmNlcykgeworCQlmb3IgKGludCBpID0gMDsgaSA8IHRSZXNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKKwkJCWlmIChoYXNSZXNvdXJjZVJlZmVyZW5jZSgoUmVzb3VyY2UpIHRSZXNvdXJjZXMuZ2V0KGkpKSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogUmVtb3ZlIHJlZmVyZW5jZSB0byB0aGUgUmVzb3VyY2Ugb2JqZWN0cyBpbgorCSAqIAorCSAqIEBhTGlzdC4gVGhpcyBzaG91bGQgYmUgY2FsbGVkIHdoZW4gb25lIG9yIG1vcmUgUmVzb3VyY2Ugb2JqZWN0cyBhcmUgcmVtb3ZlZCBmcm9tIHRoZQorCSAqICAgICAgICAgUmVzb3VyY2VTZXQgd2l0aG91dCB0aGUgcmVmZXJlbmNlIGNvdW50IGdvaW5nIHRvIHplcm8uCisJICovCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUmVzb3VyY2VzKExpc3QgYUxpc3QpIHsKKwkJUmVzb3VyY2UgcmVzOworCQlmb3IgKGludCBpID0gMDsgaSA8IGFMaXN0LnNpemUoKTsgaSsrKSB7CisJCQlyZXMgPSAoUmVzb3VyY2UpIGFMaXN0LmdldChpKTsKKwkJCWlmIChyZW1vdmVSZXNvdXJjZShyZXMpICYmIHJlcyBpbnN0YW5jZW9mIFJlZmVyZW5jZWRSZXNvdXJjZSkKKwkJCQlyZW1vdmVkUmVzb3VyY2UoKFJlZmVyZW5jZWRSZXNvdXJjZSkgcmVzKTsKKwkJfQorCX0KKworCXByaXZhdGUgZmluYWwgdm9pZCByZW1vdmVkUmVzb3VyY2UoUmVmZXJlbmNlZFJlc291cmNlIHJlZmVyZW5jZWRSZXNvdXJjZSkgeworCQlpZiAoIWlzUmVhZE9ubHkoKSAmJiByZWZlcmVuY2VkUmVzb3VyY2Uud2FzUmV2ZXJ0ZWQoKSkgeworCQkJaXNSZXZlcnRpbmcgPSB0cnVlOworCQkJdHJ5IHsKKwkJCQlyZXZlcnRlZChyZWZlcmVuY2VkUmVzb3VyY2UpOworCQkJfSBmaW5hbGx5IHsKKwkJCQlpc1JldmVydGluZyA9IGZhbHNlOworCQkJfQorCQl9CisJfQorCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlUmVzb3VyY2UoVVJJIHVyaSkgeworCQlSZXNvdXJjZSByZXMgPSBnZXRMb2NhbFJlc291cmNlKHVyaSk7CisJCXJldHVybiByZW1vdmVSZXNvdXJjZShyZXMpOworCX0KKworCS8qKgorCSAqIFJlbW92ZSByZWZlcmVuY2UgdG8gdGhlIGFSZXNvdXJjZS4KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKKwkJaWYgKGFSZXNvdXJjZSAhPSBudWxsKSB7CisJCQlhUmVzb3VyY2UuZUFkYXB0ZXJzKCkucmVtb3ZlKHJlc291cmNlQWRhcHRlcik7CisJCQlyZXR1cm4gZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKGFSZXNvdXJjZSk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRvIHBvc3QgcHJvY2VzcyBhIHJlbW92ZWQgUmVmZXJlbmNlZFJlc291cmNlLgorCSAqIAorCSAqIEBzZWUgSjJFRUVkaXRNb2RlbCNyZXZlcnRBbGxSZXNvdXJjZXMoKQorCSAqLworCXByb3RlY3RlZCB2b2lkIHJldmVydGVkKFJlZmVyZW5jZWRSZXNvdXJjZSByZXZlcnRlZFJlc291cmNlKSB7CisJCXJldmVydEFsbFJlc291cmNlcygpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHJldmVydEFsbFJlc291cmNlcygpIHsKKwkJTGlzdCBzb21lUmVzb3VyY2VzID0gZ2V0U29ydGVkUmVzb3VyY2VzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc29tZVJlc291cmNlcy5zaXplKCk7IGkrKykKKwkJCSgoUmVzb3VyY2UpIHNvbWVSZXNvdXJjZXMuZ2V0KGkpKS51bmxvYWQoKTsKKwkJZ2V0UmVzb3VyY2VzKCkucmVtb3ZlQWxsKHNvbWVSZXNvdXJjZXMpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNvbWVSZXNvdXJjZXMuc2l6ZSgpOyBpKyspCisJCQkoKFJlc291cmNlKSBzb21lUmVzb3VyY2VzLmdldChpKSkuZUFkYXB0ZXJzKCkucmVtb3ZlKHJlc291cmNlQWRhcHRlcik7CisJfQorCisJLyoqCisJICogZ3JvdXAgdGhlIHJlc291cmNlcyBieSBYTUkgZmlyc3QsIHRoZW4gWE1MCisJICovCisJcHJvdGVjdGVkIExpc3QgZ2V0U29ydGVkUmVzb3VyY2VzKCkgeworCisJCUxpc3QgdGhlUmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKCk7CisJCWludCBzaXplID0gdGhlUmVzb3VyY2VzLnNpemUoKTsKKwkJaWYgKHNpemUgPT0gMCkKKwkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOworCQlSZXNvdXJjZVtdIHNvcnRlZCA9IG5ldyBSZXNvdXJjZVtzaXplXTsKKwkJaW50IHhtbEluc2VydFBvcyA9IHNpemUgLSAxOworCQlpbnQgeG1pSW5zZXJ0UG9zID0gMDsKKwkJUmVzb3VyY2UgcmVzID0gbnVsbDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCXJlcyA9IChSZXNvdXJjZSkgdGhlUmVzb3VyY2VzLmdldChpKTsKKwkJCWlmIChyZXMgaW5zdGFuY2VvZiBUcmFuc2xhdG9yUmVzb3VyY2UpCisJCQkJc29ydGVkW3htbEluc2VydFBvcy0tXSA9IHJlczsKKwkJCWVsc2UKKwkJCQlzb3J0ZWRbeG1pSW5zZXJ0UG9zKytdID0gcmVzOworCQl9CisKKwkJcmV0dXJuIEFycmF5cy5hc0xpc3Qoc29ydGVkKTsKKwl9CisKKwkvKioKKwkgKiBQcm9jZXNzIFJlc291cmNlcyB0aGF0IHdlIGFyZSBpbnRlcnJlc3RlZCBpbi4KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzUmVzb3VyY2VzSWZJbnRlcnJlc3RlZChMaXN0IHNvbWVSZXNvdXJjZXMpIHsKKwkJaW50IHNpemUgPSBzb21lUmVzb3VyY2VzLnNpemUoKTsKKwkJUmVzb3VyY2UgcmVzOworCQlib29sZWFuIHByb2Nlc3NlZCA9IGZhbHNlOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJcmVzID0gKFJlc291cmNlKSBzb21lUmVzb3VyY2VzLmdldChpKTsKKwkJCWlmICgocmVzICE9IG51bGwpICYmIChpc0ludGVycmVzdGVkSW5SZXNvdXJjZShyZXMpKSkgeworCQkJCXByb2Nlc3NSZXNvdXJjZShyZXMpOworCQkJCXByb2Nlc3NlZCA9IHRydWU7CisJCQl9CisJCX0KKwkJcmV0dXJuIHByb2Nlc3NlZDsKKwl9CisKKwlwdWJsaWMgRU1GV29ya2JlbmNoQ29udGV4dCBnZXRFbWZDb250ZXh0KCkgeworCQlpZiAoaXNEaXNwb3NlZCgpKQorCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRWRpdCBNb2RlbCBhbHJlYWR5IGRpc3Bvc2VkIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKGVtZkNvbnRleHQgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkVNRiBjb250ZXh0IGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gZW1mQ29udGV4dDsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0Rpc3Bvc2VkKCkgeworCQlyZXR1cm4gZGlzcG9zZWQ7CisJfQorCisKKworCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgeworCQlyZXR1cm4gcHJvamVjdDsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgYnkgdGhlIEVNRldvcmtiZW5jaENvbnRleHQuCisJICovCisJcHVibGljIHZvaWQgYWNjZXNzKE9iamVjdCBhY2Nlc3NvcktleSkgeworCQlyZWdpc3RyeS5hY2Nlc3MoYWNjZXNzb3JLZXkpOworCX0KKworCS8qKgorCSAqIEFjY2VzcworCSAqIAorCSAqIEBhUmVzb3VyY2UgZm9yIHJlYWQgb3Igd3JpdGUuCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWNjZXNzKFJlZmVyZW5jZWRSZXNvdXJjZSBhUmVzb3VyY2UpIHsKKwkJaWYgKHNob3VsZEFjY2Vzc0ZvclJlYWQoYVJlc291cmNlKSkKKwkJCWFSZXNvdXJjZS5hY2Nlc3NGb3JSZWFkKCk7CisJCWVsc2UKKwkJCWFSZXNvdXJjZS5hY2Nlc3NGb3JXcml0ZSgpOworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgZnJvbSBlYWNoIGNsaWVudCB3aGVuIHRoZXkgYXJlIGZpbmlzaGVkIHdvcmtpbmcgd2l0aCB0aGUKKwkgKiBFZGl0TW9kZWwuCisJICovCisJcHVibGljIHZvaWQgcmVsZWFzZUFjY2VzcyhPYmplY3QgYWNjZXNzb3JLZXkpIHsKKworCQlyZWdpc3RyeS5yZWxlYXNlKGFjY2Vzc29yS2V5KTsKKworCQlpZiAoIWlzRGlzcG9zaW5nKCkpIHsKKwkJCWJvb2xlYW4gc2hvdWxkRGlzcG9zZSA9IGZhbHNlOworCQkJc2hvdWxkRGlzcG9zZSA9IHJlZ2lzdHJ5LnNpemUoKSA9PSAwOworCQkJaWYgKHNob3VsZERpc3Bvc2UpIHsKKwkJCQlkaXNwb3NlKCk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZWxlYXNlIGVhY2ggb2YgdGhlIHJlZmVyZW5jZWQgcmVzb3VyY2VzLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHJlbGVhc2UoUmVzb3VyY2UgYVJlc291cmNlKSB7CisKKwkJcmVtb3ZlUmVzb3VyY2UoYVJlc291cmNlKTsKKwkJaWYgKGFSZXNvdXJjZSAhPSBudWxsICYmIGFSZXNvdXJjZSBpbnN0YW5jZW9mIFJlZmVyZW5jZWRSZXNvdXJjZSkKKwkJCXJlbGVhc2UoKFJlZmVyZW5jZWRSZXNvdXJjZSkgYVJlc291cmNlKTsKKwl9CisKKwkvKioKKwkgKiBSZWxlYXNlIGVhY2ggb2YgdGhlIHJlZmVyZW5jZWQgcmVzb3VyY2VzLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHJlbGVhc2UoUmVmZXJlbmNlZFJlc291cmNlIGFSZXNvdXJjZSkgeworCQlpZiAoaXNSZWFkT25seSgpKQorCQkJYVJlc291cmNlLnJlbGVhc2VGcm9tUmVhZCgpOworCQllbHNlCisJCQlhUmVzb3VyY2UucmVsZWFzZUZyb21Xcml0ZSgpOworCisJfQorCisJLyoqCisJICogUmVsZWFzZSBlYWNoIG9mIHRoZSByZWZlcmVuY2VkIHJlc291cmNlcy4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCByZWxlYXNlUmVzb3VyY2VzKCkgeworCQlMaXN0IHRSZXNvdXJjZXMgPSBnZXRTb3J0ZWRSZXNvdXJjZXMoKTsKKwkJUmVzb3VyY2UgcmVzb3VyY2U7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdFJlc291cmNlcy5zaXplKCk7IGkrKykgeworCQkJcmVzb3VyY2UgPSAoUmVzb3VyY2UpIHRSZXNvdXJjZXMuZ2V0KGkpOworCQkJcmVsZWFzZShyZXNvdXJjZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBkZWxldGVSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKKwkJaWYgKGFSZXNvdXJjZSA9PSBudWxsIHx8IHJlc291cmNlcyA9PSBudWxsIHx8ICFnZXRSZXNvdXJjZXMoKS5jb250YWlucyhhUmVzb3VyY2UpKQorCQkJcmV0dXJuOworCQlnZXRSZXNvdXJjZXNUYXJnZXRlZEZvclRlcm1pbmF0aW9uKCkuYWRkKGFSZXNvdXJjZSk7CisKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuCisJICovCisJcHJvdGVjdGVkIExpc3QgZ2V0UmVzb3VyY2VzVGFyZ2V0ZWRGb3JUZXJtaW5hdGlvbigpIHsKKwkJaWYgKHJlc291cmNlc1RhcmdldGVkRm9yVGVybWluYXRpb24gPT0gbnVsbCkKKwkJCXJlc291cmNlc1RhcmdldGVkRm9yVGVybWluYXRpb24gPSBuZXcgQXJyYXlMaXN0KDUpOworCQlyZXR1cm4gcmVzb3VyY2VzVGFyZ2V0ZWRGb3JUZXJtaW5hdGlvbjsKKwl9CisKKworCisJLyoqCisJICogUmVtb3ZlIG15IHJlZmVyZW5jZSB0byBhUmVzb3VyY2UsIHJlbW92ZSBpdCBmcm9tIHRoZSBSZXNvdXJjZVNldCwgYW5kIGRlbGV0ZSBpdHMgZmlsZSBmcm9tCisJICogdGhlIFdvcmtiZW5jaC4gVGhpcyBvbmx5IGhhcHBlbnMgaWYgdGhlcmUgaXMgY3VycmVudGx5IGEgcmVmZXJlbmNlIHRvCisJICogCisJICogQGFSZXNvdXJjZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBwcmltRGVsZXRlUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKSB7CisJCWlmIChwcmltRmx1c2hSZXNvdXJjZShhUmVzb3VyY2UpKSB7CisJCQl0cnkgeworCQkJCWdldEVtZkNvbnRleHQoKS5kZWxldGVSZXNvdXJjZShhUmVzb3VyY2UpOworCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gd2hhdCBzaG91bGQgd2UgZG8gaGVyZT8KKwkJCX0KKwkJCWlmIChoYXNMaXN0ZW5lcnMoKSkgeworCQkJCUVkaXRNb2RlbEV2ZW50IGV2ZW50ID0gbmV3IEVkaXRNb2RlbEV2ZW50KEVkaXRNb2RlbEV2ZW50LlJFTU9WRURfUkVTT1VSQ0UsIHRoaXMpOworCQkJCWV2ZW50LmFkZFJlc291cmNlKGFSZXNvdXJjZSk7CisJCQkJbm90aWZ5TGlzdGVuZXJzKGV2ZW50KTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFJlbW92ZSBteSByZWZlcmVuY2UgdG8gYVJlc291cmNlIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgUmVzb3VyY2VTZXQuCisJICovCisJcHVibGljIHZvaWQgZmx1c2hSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKKwkJaWYgKHByaW1GbHVzaFJlc291cmNlKGFSZXNvdXJjZSkpIHsKKwkJCWlmIChoYXNMaXN0ZW5lcnMoKSkgeworCQkJCUVkaXRNb2RlbEV2ZW50IGV2ZW50ID0gbmV3IEVkaXRNb2RlbEV2ZW50KEVkaXRNb2RlbEV2ZW50LlJFTU9WRURfUkVTT1VSQ0UsIHRoaXMpOworCQkJCWV2ZW50LmFkZFJlc291cmNlKGFSZXNvdXJjZSk7CisJCQkJbm90aWZ5TGlzdGVuZXJzKGV2ZW50KTsKKwkJCX0KKwkJfQorCX0KKworCXB1YmxpYyBTZXQgZ2V0QWZmZWN0ZWRGaWxlcygpIHsKKwkJU2V0IGFTZXQgPSBuZXcgSGFzaFNldCgpOworCQlMaXN0IG1vZlJlc291cmNlcyA9IGdldFJlc291cmNlcygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZlJlc291cmNlcy5zaXplKCk7IGkrKykgeworCQkJUmVzb3VyY2UgYVJlc291cmNlID0gKFJlc291cmNlKSBtb2ZSZXNvdXJjZXMuZ2V0KGkpOworCQkJSUZpbGUgb3V0cHV0ID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShhUmVzb3VyY2UpOworCQkJaWYgKG91dHB1dCAhPSBudWxsKQorCQkJCWFTZXQuYWRkKG91dHB1dCk7CisJCX0KKwkJcmV0dXJuIGFTZXQ7CisJfQorCisJcHJvdGVjdGVkIExpc3QgcmVzZXRLbm93blJlc291cmNlVXJpcygpIHsKKworCQlpbml0aWFsaXplS25vd25SZXNvdXJjZVVyaXMoKTsKKworCQlyZXR1cm4ga25vd25SZXNvdXJjZVVyaXM7CisJfQorCisJLyoqCisJICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xMS8yMDAxIDQ6MTQ6MjYgUE0pCisJICogCisJICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAorCSAqLworCXB1YmxpYyBMaXN0IGdldFJlc291cmNlcygpIHsKKwkJaWYgKHJlc291cmNlcyA9PSBudWxsKQorCQkJcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCg1KTsKKwkJcmV0dXJuIHJlc291cmNlczsKKwl9CisKKwlwdWJsaWMgU3RyaW5nW10gZ2V0UmVzb3VyY2VVUklzKCkgeworCQlyZXR1cm4gZ2V0UmVzb3VyY2VVUklzKGZhbHNlKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nW10gZ2V0UmVzb3VyY2VVUklzKGJvb2xlYW4gb25seURpcnR5KSB7CisJCUxpc3QgbGlzdCA9IGdldFJlc291cmNlcygpOworCQlpbnQgZGlydHlDb3VudCA9IDA7CisJCVN0cmluZ1tdIHVyaXMgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKKwkJUmVzb3VyY2UgcmVzOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKKwkJCXJlcyA9IChSZXNvdXJjZSkgbGlzdC5nZXQoaSk7CisJCQlpZiAoIW9ubHlEaXJ0eSkKKwkJCQl1cmlzW2ldID0gcmVzLmdldFVSSSgpLnRvU3RyaW5nKCk7CisJCQllbHNlIGlmIChyZXMuaXNNb2RpZmllZCgpKSB7CisJCQkJdXJpc1tpXSA9IHJlcy5nZXRVUkkoKS50b1N0cmluZygpOworCQkJCWRpcnR5Q291bnQrKzsKKwkJCX0KKwkJfQorCQlpZiAob25seURpcnR5ICYmIGRpcnR5Q291bnQgPiAwKSB7CisJCQlTdHJpbmdbXSBkaXJ0eSA9IG5ldyBTdHJpbmdbZGlydHlDb3VudF07CisJCQlpbnQgaiA9IDA7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHVyaXMubGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAodXJpc1tpXSAhPSBudWxsKSB7CisJCQkJCWRpcnR5W2pdID0gdXJpc1tpXTsKKwkJCQkJaisrOworCQkJCX0KKwkJCX0KKwkJCXVyaXMgPSBkaXJ0eTsKKwkJfQorCQlyZXR1cm4gdXJpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBleHRlbnQgb2YgdGhlIHJlc291cmNlOyBsb2dzIGFuIGVycm9yIGFuZCByZXR1cm5zIG51bGwgaWYKKwkgKiB0aGUgZXh0ZW50IGlzIGVtcHR5CisJICovCisJcHVibGljIHN0YXRpYyBFT2JqZWN0IGdldFJvb3QoUmVzb3VyY2UgYVJlc291cmNlKSB7CisJCUVMaXN0IGV4dGVudCA9IGFSZXNvdXJjZS5nZXRDb250ZW50cygpOworCQlpZiAoZXh0ZW50LnNpemUoKSA8IDEpCisJCQlyZXR1cm4gbnVsbDsKKwkJcmV0dXJuIChFT2JqZWN0KSBleHRlbnQuZ2V0KDApOworCX0KKworCS8qKgorCSAqIEhhbmRsZSB0aGUgZmFpbHVyZSBvZgorCSAqIAorCSAqIEBhUmVzb3VyY2UuCisJICovCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2F2ZUZhaWxlZChSZXNvdXJjZSBhUmVzb3VyY2UsIEV4Y2VwdGlvbiBlKSB7CisJCWFSZXNvdXJjZS5zZXRNb2RpZmllZCh0cnVlKTsKKwkJaWYgKGlzRmFpbGVkV3JpdGVGaWxlRmFpbHVyZShlKSAmJiBzaG91bGRTYXZlUmVhZE9ubHkoYVJlc291cmNlKSkKKwkJCXNhdmVSZXNvdXJjZShhUmVzb3VyY2UpOworCQllbHNlCisJCQlwcmltSGFuZGxlU2F2ZUZhaWxlZChhUmVzb3VyY2UsIGUpOworCX0KKworCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIGFueSBvZiBteSByZXNvdXJjZXMgaGFzIGJlZW4gbW9kaWZpZWQuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNBbnlSZXNvdXJjZURpcnR5KCkgeworCQlMaXN0IGxpc3QgPSBnZXRSZXNvdXJjZXMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7CisJCQlpZiAoKChSZXNvdXJjZSkgbGlzdC5nZXQoaSkpLmlzTW9kaWZpZWQoKSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogUmV0dXJuIHdoZXRoZXIgYSBzYXZlIGlzIG5lZWRlZCBvbiB0aGUgQ29tbWFuZFN0YWNrCisJICovCisJcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKKwkJcmV0dXJuIGlzQW55UmVzb3VyY2VEaXJ0eSgpOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIGlzRmFpbGVkV3JpdGVGaWxlRmFpbHVyZShFeGNlcHRpb24gZXgpIHsKKwkJcmV0dXJuIFNhdmVIYW5kbGVySGVhZGxlc3MuaXNGYWlsZWRXcml0ZUZpbGVGYWlsdXJlKGV4KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdHJ1ZSBpZiB5b3UgY2FuIG9ubHkgcmVhZCB0aGUgcmVzb3VyY2VzIGFuZCBub3Qgd3JpdGUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKKwkJcmV0dXJuIHJlYWRPbmx5OworCX0KKworCXByb3RlY3RlZCBib29sZWFuIGlzUmVhZE9ubHlGYWlsdXJlKEV4Y2VwdGlvbiBleCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIGJvb2xlYW4gaGFzUmVhZE9ubHlSZXNvdXJjZSgpIHsKKwkJdHJ5IHsKKwkJCUxpc3QgbGlzdCA9IGdldFJlc291cmNlcygpOworCQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKKwkJCVJlc291cmNlIHJlcyA9IG51bGw7CisJCQlJRmlsZSBmaWxlOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQlyZXMgPSAoUmVzb3VyY2UpIGxpc3QuZ2V0KGkpOworCQkJCWZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHJlcyk7CisJCQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmlzUmVhZE9ubHkoKSkKKwkJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbihlKTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogQGRlcHJlY2F0ZWQgdXNlIGNyZWF0ZVJlc291cmNlKFVSSSkgaW5zdGVhZAorCSAqLworCXB1YmxpYyBSZXNvdXJjZSBtYWtlUmVzb3VyY2UoU3RyaW5nIGFVcmkpIHsKKwkJcmV0dXJuIGNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVVUkkoYVVyaSkpOworCX0KKworCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIGFueSBvZiBteSByZXNvdXJjZXMgaGFzIGEgcmVmZXJlbmNlIGNvdW50IG9mIG9uZSBhbmQgaXQgaGFzIGJlZW4gbW9kaWZpZWQuCisJICovCisJcHVibGljIGJvb2xlYW4gbmVlZHNUb1NhdmUoKSB7CisJCXJldHVybiAhaXNTaGFyZWQoKSAmJiBpc0RpcnR5KCk7CisJfQorCisJLyoqCisJICogUmVtb3ZlIG15IHJlZmVyZW5jZSB0byBhUmVzb3VyY2UgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBSZXNvdXJjZVNldC4gUmV0dXJuIHRydWUgaWYgYVJlc291cmNlCisJICogd2FzIHJlbW92ZWQuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gcHJpbUZsdXNoUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKSB7CisJCWlmIChhUmVzb3VyY2UgIT0gbnVsbCAmJiBoYXNSZXNvdXJjZVJlZmVyZW5jZShhUmVzb3VyY2UpKSB7CisJCQlyZW1vdmVSZXNvdXJjZShhUmVzb3VyY2UpOworCQkJcmVtb3ZlUmVzb3VyY2VTZXRSZXNvdXJjZShhUmVzb3VyY2UpOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIEhhbmRsZSB0aGUgZmFpbHVyZSBvZgorCSAqIAorCSAqIEBhUmVzb3VyY2UuCisJICovCisJcHJvdGVjdGVkIHZvaWQgcHJpbUhhbmRsZVNhdmVGYWlsZWQoUmVzb3VyY2UgYVJlc291cmNlLCBFeGNlcHRpb24gZSkgeworCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOworCQlFeGNlcHRpb24gbmVzdGVkID0gbnVsbDsKKwkJaWYgKGUgaW5zdGFuY2VvZiBJV0ZUV3JhcHBlZEV4Y2VwdGlvbikKKwkJCW5lc3RlZCA9ICgoSVdGVFdyYXBwZWRFeGNlcHRpb24pIGUpLmdldE5lc3RlZEV4Y2VwdGlvbigpOworCQllbHNlCisJCQluZXN0ZWQgPSBlOworCisJCXRocm93IG5ldyBTYXZlRmFpbGVkRXhjZXB0aW9uKEVNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkFuX2Vycm9yX29jY3VycmVkX3doaWxlX3NhX0VSUk9SXyIpLCBuZXN0ZWQpOyAvLyROT04tTkxTLTEkID0gIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHNhdmluZy4iCisJfQorCisJLyoqCisJICogUHJvbXB0IGZvciBhIHNhdmUuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gcHJvbXB0VG9TYXZlKElPcGVyYXRpb25IYW5kbGVyIG9wZXJhdGlvbkhhbmRsZXIpIHsKKwkJaWYgKG9wZXJhdGlvbkhhbmRsZXIgPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJcmV0dXJuIG9wZXJhdGlvbkhhbmRsZXIuY2FuQ29udGludWUoRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX2ZvbGxvd2luZ19yZXNvdXJjZXNfbmVfVUlfIiksIGdldFJlc291cmNlVVJJcyh0cnVlKSk7IC8vJE5PTi1OTFMtMSQgPSAiVGhlIGZvbGxvd2luZyByZXNvdXJjZXMgbmVlZCB0byBiZSBzYXZlZCBidXQgYXJlIGN1cnJlbnRseSBzaGFyZWQsIGRvIHlvdSB3YW50IHRvIHNhdmUgbm93PyIKKwl9CisKKwkvKioKKwkgKiBUaGlzIHdpbGwgZm9yY2UgYWxsIG9mIHRoZSByZWZlcmVuY2VkIFJlc291cmNlcyB0byBiZSBzYXZlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBwcmltU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJaWYgKGlzUmVhZE9ubHkoKSkKKwkJCXJldHVybjsgLy8gZG8gbm90aGluZworCQlkZWxldGVSZXNvdXJjZXNJZk5lY2Vzc2FyeSgpOworCQlSZXNvdXJjZSByZXNvdXJjZTsKKwkJaWYgKGdldFJlc291cmNlcygpLmlzRW1wdHkoKSkKKwkJCXJldHVybjsgLy8gbm90aGluZyB0byBzYXZlCisJCUxpc3QgbG9jYWxSZXNvdXJjZXMgPSBnZXRTb3J0ZWRSZXNvdXJjZXMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbFJlc291cmNlcy5zaXplKCk7IGkrKykgeworCQkJcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGxvY2FsUmVzb3VyY2VzLmdldChpKTsKKwkJCXNhdmVSZXNvdXJjZShyZXNvdXJjZSk7CisJCX0KKwkJZ2V0Q29tbWFuZFN0YWNrKCkuc2F2ZUlzRG9uZSgpOworCQlpZiAoaGFzTGlzdGVuZXJzKCkpIHsKKwkJCUVkaXRNb2RlbEV2ZW50IGV2ZW50ID0gbmV3IEVkaXRNb2RlbEV2ZW50KEVkaXRNb2RlbEV2ZW50LlNBVkUsIHRoaXMpOworCQkJbm90aWZ5TGlzdGVuZXJzKGV2ZW50KTsKKwkJfQorCX0KKworCS8qKgorCSAqIAorCSAqLworCXByb3RlY3RlZCB2b2lkIGRlbGV0ZVJlc291cmNlc0lmTmVjZXNzYXJ5KCkgeworCQlpZiAocmVzb3VyY2VzVGFyZ2V0ZWRGb3JUZXJtaW5hdGlvbiA9PSBudWxsIHx8IHJlc291cmNlc1RhcmdldGVkRm9yVGVybWluYXRpb24uc2l6ZSgpID09IDApCisJCQlyZXR1cm47CisJCVJlc291cmNlIGRlYWRyZXMgPSBudWxsOworCQlmb3IgKGludCBpID0gMDsgaSA8IGdldFJlc291cmNlc1RhcmdldGVkRm9yVGVybWluYXRpb24oKS5zaXplKCk7IGkrKykgeworCQkJZGVhZHJlcyA9IChSZXNvdXJjZSkgZ2V0UmVzb3VyY2VzVGFyZ2V0ZWRGb3JUZXJtaW5hdGlvbigpLmdldChpKTsKKwkJCXByaW1EZWxldGVSZXNvdXJjZShkZWFkcmVzKTsKKworCQkJZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKGRlYWRyZXMpOworCQkJZ2V0UmVzb3VyY2VzVGFyZ2V0ZWRGb3JUZXJtaW5hdGlvbigpLnJlbW92ZShkZWFkcmVzKTsKKwkJfQorCX0KKworCisKKwkvKioKKwkgKiBTYXZlCisJICogCisJICogQGFSZXNvdXJjZS4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBwcmltU2F2ZVJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWlmIChhUmVzb3VyY2UuaXNNb2RpZmllZCgpKQorCQkJYVJlc291cmNlLnNhdmUoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKKwl9CisKKwkvKioKKwkgKiBQcm9jZXNzIHJlc291cmNlcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGxvYWRlZC4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzTG9hZGVkUmVzb3VyY2VzKCkgeworCQlMaXN0IGxvYWRlZCA9IGdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCk7CisJCWlmICghbG9hZGVkLmlzRW1wdHkoKSkKKwkJCXByb2Nlc3NSZXNvdXJjZXNJZkludGVycmVzdGVkKGxvYWRlZCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHByb2Nlc3NQcmVsb2FkUmVzb3VyY2VzKCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IHByZWxvYWRSZXNvdXJjZVVyaXMuc2l6ZSgpOyBpKyspIHsKKwkJCVVSSSB1cmkgPSAoVVJJKSBwcmVsb2FkUmVzb3VyY2VVcmlzLmdldChpKTsKKwkJCWdldFJlc291cmNlKHVyaSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZW1vdmUgYVJlc291cmNlIGZyb20gbXkgUmVzb3VyY2VTZXQuIFJldHVybiB0cnVlIGlmIGFSZXNvdXJjZSB3YXMgcmVtb3ZlZC4KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVSZXNvdXJjZVNldFJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgeworCQlhUmVzb3VyY2UuZVNldERlbGl2ZXIoZmFsc2UpOworCQlhUmVzb3VyY2UudW5sb2FkKCk7CisJCWFSZXNvdXJjZS5lU2V0RGVsaXZlcih0cnVlKTsKKwkJcmV0dXJuIGdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKGFSZXNvdXJjZSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2F2ZVJlc291cmNlKFJlc291cmNlIHJlc291cmNlKSB7CisJCXRyeSB7CisJCQlwcmltU2F2ZVJlc291cmNlKHJlc291cmNlKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWhhbmRsZVNhdmVGYWlsZWQocmVzb3VyY2UsIGUpOworCQl9CisJfQorCisJLyoqCisJICogU2hvdWxkIHRoZSByZXNvdXJjZXMgYmUgc2F2ZWQuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU2F2ZSgpIHsKKwkJcmV0dXJuICFpc1JlYWRPbmx5KCkgJiYgIWlzU2hhcmVkKCk7CisJfQorCisJLyoqCisJICogU2hvdWxkIHRoZSByZXNvdXJjZXMgYmUgc2F2ZWQuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU2F2ZShJT3BlcmF0aW9uSGFuZGxlciBvcGVyYXRpb25IYW5kbGVyKSB7CisJCXJldHVybiBzaG91bGRTYXZlKCkgfHwgcHJvbXB0VG9TYXZlKG9wZXJhdGlvbkhhbmRsZXIpOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFNhdmVSZWFkT25seShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKKwkJSUZpbGUgYUZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKGFSZXNvdXJjZSk7CisJCWlmIChhRmlsZSA9PSBudWxsIHx8ICFhRmlsZS5pc1JlYWRPbmx5KCkpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJcmV0dXJuIGdldFNhdmVIYW5kbGVyKCkuc2hvdWxkQ29udGludWVBbmRNYWtlRmlsZUVkaXRhYmxlKGFGaWxlKTsKKwl9CisKKwkvKioKKwkgKiBGb3JjZSBhbGwgb2YgdGhlIGtub3duIHJlc291cmNlIFVSSXMgdG8gYmUgbG9hZGVkIGlmIHRoZXkgYXJlIG5vdCBhbHJlYWR5LgorCSAqLworCXB1YmxpYyB2b2lkIGZvcmNlTG9hZEtub3duUmVzb3VyY2VzKCkgeworCQlMaXN0IHVyaXMgPSBnZXRLbm93blJlc291cmNlVXJpcygpOworCQlVUkkgdXJpID0gbnVsbDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmlzLnNpemUoKTsgaSsrKSB7CisJCQl1cmkgPSAoVVJJKSB1cmlzLmdldChpKTsKKwkJCWdldFJlc291cmNlKHVyaSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHdoZW4geW91IHdhbnQgdG8gZXh0ZW5kIHRoaXMgZWRpdCBtb2RlbCB0byBoYW5kbGUgYSByZXNvdXJjZQorCSAqIHdpdGggYSBVUkkgZXF1YWwgdG8gPGNvZGU+YVJlbGF0aXZlVVJJPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgdm9pZCBtYW5hZ2VFeHRlbnNpb25SZXNvdXJjZVVSSShTdHJpbmcgYVJlbGF0aXZlVVJJKSB7CisJCWlmIChhUmVsYXRpdmVVUkkgIT0gbnVsbCAmJiBhUmVsYXRpdmVVUkkubGVuZ3RoKCkgPiAwKSB7CisJCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSShhUmVsYXRpdmVVUkkpOworCQkJaWYgKCFpc0ludGVycmVzdGVkSW5SZXNvdXJjZVVyaSh1cmkpKSB7CisJCQkJZ2V0S25vd25SZXNvdXJjZVVyaXMoKS5hZGQodXJpKTsKKwkJCQkvLyBQcm9jZXNzIHRoZSByZXNvdXJjZSBpZiBpdCBpcyBhbHJlYWR5IGxvYWRlZC4KKwkJCQl0cnkgeworCQkJCQlSZXNvdXJjZSByZXMgPSBnZXRFbWZDb250ZXh0KCkuZ2V0UmVzb3VyY2UodXJpKTsKKwkJCQkJaWYgKHJlcyAhPSBudWxsKQorCQkJCQkJcHJvY2Vzc1Jlc291cmNlKHJlcyk7CisJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJLy8gSWdub3JlCisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyoqCisJICogR2V0IGEgY2FjaGVkIFJlc291cmNlIG9yIHRyeSB0byBsb2FkIHRoZSBSZXNvdXJjZSBwcmlvciB0byBjcmVhdGluZyBhIFJlc291cmNlLiBUaGlzIGFwaQorCSAqIGhhbmRsZXMgdGhlIGNhc2UgdGhhdCB0aGUgUmVzb3VyY2UgbWF5IGJlIGNyZWF0ZWQgZHVyaW5nIHRoZSBsb2FkLgorCSAqLworCXB1YmxpYyBSZXNvdXJjZSBnZXRPckNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKKwkJcmV0dXJuIGdldFJlc291cmNlKHVyaSk7CisJfQorCisJLyoqCisJICogQHJldHVybiBib29sZWFuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNBY2Nlc3NBc1JlYWRGb3JVbktub3duVVJJcygpIHsKKwkJcmV0dXJuIGFjY2Vzc0FzUmVhZEZvclVuS25vd25VUklzOworCX0KKworCS8qKgorCSAqIFVzZSB0aGlzIGFwaSB0byBpbmRpY2F0ZSB0aGF0IHlvdSB3YW50IGFsbCB1bmtub3duIFJlc291cmNlcyB0byBiZSBhY2Nlc3NlZCBmb3IgUmVhZE9ubHkuCisJICogCisJICogQHBhcmFtIGIKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NBc1JlYWRGb3JVbktub3duVVJJcyhib29sZWFuIGIpIHsKKwkJYWNjZXNzQXNSZWFkRm9yVW5Lbm93blVSSXMgPSBiOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKwkJYnVmZmVyLmFwcGVuZCgiOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAoaXNSZWFkT25seSgpKQorCQkJYnVmZmVyLmFwcGVuZCgiIFIgPSAiKTsgLy8kTk9OLU5MUy0xJAorCQllbHNlCisJCQlidWZmZXIuYXBwZW5kKCIgVyA9ICIpOyAvLyROT04tTkxTLTEkCisJCWJ1ZmZlci5hcHBlbmQoZ2V0UmVnaXN0cnkoKS5zaXplKCkpOworCQlidWZmZXIuYXBwZW5kKCJbSUQ6IFwiIik7IC8vJE5PTi1OTFMtMSQKKwkJYnVmZmVyLmFwcGVuZChnZXRFZGl0TW9kZWxJRCgpKTsKKwkJYnVmZmVyLmFwcGVuZCgiXCIgS25vd24gUmVzb3VyY2VzOiBbIik7IC8vJE5PTi1OTFMtMSQKKwkJTGlzdCB1cmlzID0gZ2V0S25vd25SZXNvdXJjZVVyaXMoKTsKKwkJaWYgKHVyaXMgIT0gbnVsbCkgeworCQkJaW50IGkgPSAwOworCQkJZm9yIChpID0gMDsgaSA8ICh1cmlzLnNpemUoKSAtIDEpOyBpKyspCisJCQkJYnVmZmVyLmFwcGVuZCh1cmlzLmdldChpKSArICIsICIpOyAvLyROT04tTkxTLTEkCisJCQlidWZmZXIuYXBwZW5kKHVyaXMuZ2V0KGkpKTsKKwkJCWJ1ZmZlci5hcHBlbmQoIl0iKTsgLy8kTk9OLU5MUy0xJAorCQl9IGVsc2UKKwkJCWJ1ZmZlci5hcHBlbmQoIm5vbmUiKTsgLy8kTk9OLU5MUy0xJAorCisKKwkJYnVmZmVyLmFwcGVuZCgiXSIpOyAvLyROT04tTkxTLTEkCisJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKwl9CisKKwlwdWJsaWMgUmVmZXJlbmNlIGdldFJlZmVyZW5jZSgpIHsKKwkJaWYgKHJlZmVyZW5jZSA9PSBudWxsKQorCQkJcmVmZXJlbmNlID0gbmV3IFJlZmVyZW5jZSgpOworCQlyZXR1cm4gcmVmZXJlbmNlOworCX0KKworCS8qKgorCSAqIEByZXR1cm4KKwkgKi8KKwlwcm90ZWN0ZWQgQ2xpZW50QWNjZXNzUmVnaXN0cnkgZ2V0UmVnaXN0cnkoKSB7CisJCXJldHVybiByZWdpc3RyeTsKKwl9CisKKwlwdWJsaWMgY2xhc3MgUmVmZXJlbmNlIHsKKworCQlwcm90ZWN0ZWQgU3RyaW5nIHRvc3RyaW5nID0gbnVsbDsKKworCQkvKgorCQkgKiAobm9uLUphdmFkb2MpCisJCSAqIAorCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQorCQkgKi8KKwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCWlmICh0b3N0cmluZyA9PSBudWxsKSB7CisJCQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoIkVkaXRNb2RlbC5SZWZlcmVuY2UgWyIpOyAvLyROT04tTkxTLTEkCisJCQkJcmVzdWx0LmFwcGVuZCgieyIpOyAvLyROT04tTkxTLTEkCisJCQkJcmVzdWx0LmFwcGVuZChnZXRFZGl0TW9kZWxJRCgpKTsKKwkJCQlyZXN1bHQuYXBwZW5kKCJ9IHsiKTsgLy8kTk9OLU5MUy0xJAorCQkJCXJlc3VsdC5hcHBlbmQoZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7CisJCQkJcmVzdWx0LmFwcGVuZCgifV0iKTsgLy8kTk9OLU5MUy0xJAorCQkJCXRvc3RyaW5nID0gcmVzdWx0LnRvU3RyaW5nKCk7CisJCQl9CisJCQlyZXR1cm4gdG9zdHJpbmc7CisJCX0KKworCQkvKgorCQkgKiAobm9uLUphdmFkb2MpCisJCSAqIAorCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQorCQkgKi8KKwkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJCXJldHVybiB0b1N0cmluZygpLmhhc2hDb2RlKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSAtIGJ5IGRlZmF1bHQgdGhpcyB3aWxsIHJldHVybiB0aGUgZmlyc3Qgcm9vdCBvYmplY3QgZnJvbSB0aGUgZmlyc3QKKwkgKiByZXNvdXJjZSByZWZlcmVuY2VkIGJ5IHRoZSBrbm93biByZXNvdXJjZSBVUklzIGZvciB0aGlzIEVkaXRNb2RlbAorCSAqIAorCSAqIEByZXR1cm4gYW4gRU9iamVjdCBvciBOdWxsCisJICovCisJcHVibGljIEVPYmplY3QgZ2V0UHJpbWFyeVJvb3RPYmplY3QoKSB7CisJCVJlc291cmNlIHJlcyA9IGdldFByaW1hcnlSZXNvdXJjZSgpOworCQlpZiAocmVzID09IG51bGwgfHwgcmVzLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKQorCQkJcmV0dXJuIG51bGw7CisJCXJldHVybiAoRU9iamVjdCkgcmVzLmdldENvbnRlbnRzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIC0gYnkgZGVmYXVsdCB0aGlzIHdpbGwgcmV0dXJuIHRoZSBmaXJzdCByZXNvdXJjZSByZWZlcmVuY2VkIGJ5IHRoZQorCSAqIGtub3duIHJlc291cmNlIFVSSXMgZm9yIHRoaXMgRWRpdE1vZGVsCisJICogCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBSZXNvdXJjZSBnZXRQcmltYXJ5UmVzb3VyY2UoKSB7CisJCWlmIChrbm93blJlc291cmNlVXJpcyA9PSBudWxsKQorCQkJZ2V0S25vd25SZXNvdXJjZVVyaXMoKTsKKwkJaWYgKGtub3duUmVzb3VyY2VVcmlzID09IG51bGwgfHwga25vd25SZXNvdXJjZVVyaXMuaXNFbXB0eSgpKQorCQkJcmV0dXJuIG51bGw7CisKKwkJVVJJIHVyaSA9IChVUkkpIGtub3duUmVzb3VyY2VVcmlzLmdldCgwKTsKKwkJcmV0dXJuIGdldFJlc291cmNlKHVyaSk7CisJfQorCisKKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuSUVuYWJsZW1lbnRJZGVudGlmaWVyTGlzdGVuZXIjaWRlbnRpZmllckNoYW5nZWQob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuRW5hYmxlbWVudElkZW50aWZpZXJFdmVudCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBpZGVudGlmaWVyQ2hhbmdlZChFbmFibGVtZW50SWRlbnRpZmllckV2ZW50IGV2dCkgeworCQlpZiAoZXZ0Lmhhc0VuYWJsZWRDaGFuZ2VkKCkpIHsKKwkJCUVkaXRNb2RlbEV2ZW50IGVkaXRNb2RlbEV2ZW50ID0gbmV3IEVkaXRNb2RlbEV2ZW50KEVkaXRNb2RlbEV2ZW50LktOT1dOX1JFU09VUkNFU19BQk9VVF9UT19DSEFOR0UsIHRoaXMpOworCQkJbm90aWZ5TGlzdGVuZXJzKGVkaXRNb2RlbEV2ZW50KTsKKwkJCUlFbmFibGVtZW50SWRlbnRpZmllciBpZCA9IGV2dC5nZXRJZGVudGlmaWVyKCk7CisJCQlpZiAoaWQuaXNFbmFibGVkKCkpCisJCQkJYWRkS25vd25SZXNvdXJjZXMoaWQpOworCQkJZWxzZQorCQkJCXJlbW92ZUtub3duUmVzb3VyY2VzKGlkKTsKKwkJCWVkaXRNb2RlbEV2ZW50ID0gbmV3IEVkaXRNb2RlbEV2ZW50KEVkaXRNb2RlbEV2ZW50LktOT1dOX1JFU09VUkNFU19DSEFOR0VELCB0aGlzKTsKKwkJCW5vdGlmeUxpc3RlbmVycyhlZGl0TW9kZWxFdmVudCk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgcmVtb3ZlS25vd25SZXNvdXJjZXMoSUVuYWJsZW1lbnRJZGVudGlmaWVyIGlkKSB7CisJCUxpc3QgZWRpdE1vZGVsUmVzb3VyY2VzID0gZ2V0RWRpdE1vZGVsUmVzb3VyY2VzKGlkKTsKKwkJRWRpdE1vZGVsUmVzb3VyY2UgZWRpdE1vZGVsUmVzb3VyY2UgPSBudWxsOworCQlSZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIgc3luYyA9IChSZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIpIGdldFJlc291cmNlU2V0U3luY2hyb25pemVyKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdE1vZGVsUmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7CisJCQllZGl0TW9kZWxSZXNvdXJjZSA9IChFZGl0TW9kZWxSZXNvdXJjZSkgZWRpdE1vZGVsUmVzb3VyY2VzLmdldChpKTsKKwkJCWlmIChlZGl0TW9kZWxSZXNvdXJjZS5pc0F1dG9Mb2FkKCkgJiYgc3luYyAhPSBudWxsKSB7CisJCQkJc3luYy5kaXNhYmxlQXV0b2xvYWQoZWRpdE1vZGVsUmVzb3VyY2UuZ2V0VVJJKCkpOworCQkJCXByZWxvYWRSZXNvdXJjZVVyaXMucmVtb3ZlKGVkaXRNb2RlbFJlc291cmNlLmdldFVSSSgpKTsKKwkJCX0KKwkJCWtub3duUmVzb3VyY2VVcmlzLnJlbW92ZShlZGl0TW9kZWxSZXNvdXJjZS5nZXRVUkkoKSk7CisJCQlyZW1vdmVSZXNvdXJjZShlZGl0TW9kZWxSZXNvdXJjZS5nZXRVUkkoKSk7CisJCX0KKworCX0KKworCisKKwlwcml2YXRlIHZvaWQgYWRkS25vd25SZXNvdXJjZXMoSUVuYWJsZW1lbnRJZGVudGlmaWVyIGlkKSB7CisJCUxpc3QgZWRpdE1vZGVsUmVzb3VyY2VzID0gZ2V0RWRpdE1vZGVsUmVzb3VyY2VzKGlkKTsKKwkJRWRpdE1vZGVsUmVzb3VyY2UgZWRpdE1vZGVsUmVzb3VyY2UgPSBudWxsOworCQlSZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIgc3luYyA9IChSZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIpIGdldFJlc291cmNlU2V0U3luY2hyb25pemVyKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdE1vZGVsUmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7CisJCQllZGl0TW9kZWxSZXNvdXJjZSA9IChFZGl0TW9kZWxSZXNvdXJjZSkgZWRpdE1vZGVsUmVzb3VyY2VzLmdldChpKTsKKwkJCWlmIChlZGl0TW9kZWxSZXNvdXJjZS5pc0F1dG9Mb2FkKCkgJiYgc3luYyAhPSBudWxsKSB7CisJCQkJc3luYy5lbmFibGVBdXRvbG9hZChlZGl0TW9kZWxSZXNvdXJjZS5nZXRVUkkoKSk7CisJCQkJcHJlbG9hZFJlc291cmNlVXJpcy5hZGQoZWRpdE1vZGVsUmVzb3VyY2UuZ2V0VVJJKCkpOworCQkJCWdldFJlc291cmNlKGVkaXRNb2RlbFJlc291cmNlLmdldFVSSSgpKTsKKwkJCX0KKwkJCWtub3duUmVzb3VyY2VVcmlzLmFkZChlZGl0TW9kZWxSZXNvdXJjZS5nZXRVUkkoKSk7CisKKwkJfQorCX0KKworCisJLyoqCisJICogQHJldHVybiBSZXR1cm5zIHRoZSBwYXJhbXMuCisJICovCisJcHVibGljIE1hcCBnZXRQYXJhbXMoKSB7CisJCXJldHVybiBwYXJhbXM7CisJfQorCisJLyoqCisJICogQHBhcmFtIHBhcmFtcworCSAqICAgICAgICAgICAgVGhlIHBhcmFtcyB0byBzZXQuCisJICovCisJcHVibGljIHZvaWQgc2V0UGFyYW1zKE1hcCBwYXJhbXMpIHsKKwkJdGhpcy5wYXJhbXMgPSBwYXJhbXM7CisJfQorCQorCXB1YmxpYyBjbGFzcyBOb3RpZnlSdW5uZXIgaW1wbGVtZW50cyBJU2FmZVJ1bm5hYmxlIHsgCisJCQorCQlwcml2YXRlIGZpbmFsIEVkaXRNb2RlbEV2ZW50IGV2ZW50OworCQlwcml2YXRlIEVkaXRNb2RlbExpc3RlbmVyIGxpc3RlbmVyOworCQkKKwkJcHVibGljIE5vdGlmeVJ1bm5lcihFZGl0TW9kZWxFdmVudCBldmVudCkgeworCQkJQXNzZXJ0LmlzTm90TnVsbChldmVudCk7CisJCQl0aGlzLmV2ZW50ID0gZXZlbnQ7CisJCX0KKwkJCisJCQorCQlwdWJsaWMgdm9pZCBzZXRMaXN0ZW5lcihFZGl0TW9kZWxMaXN0ZW5lciBsaXN0ZW5lcikgeworCQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOworCQl9CisKKwkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsgCisJCQlFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBFTUZXb3JrYmVuY2hFZGl0UGx1Z2luLklELCAwLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pKTsKKwkJCQorCQl9CisKKwkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCQlpZihsaXN0ZW5lciAhPSBudWxsKQorCQkJCWxpc3RlbmVyLmVkaXRNb2RlbENoYW5nZWQoZXZlbnQpOyAKKwkJfQorCQkKKwl9OworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRWRpdE1vZGVsQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRWRpdE1vZGVsQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZWVkOTAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9FZGl0TW9kZWxDb21tYW5kLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7CisKKworCisvKioKKyAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNS8yMi8wMSA4OjU3OjAwIEFNKQorICogCisgKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBFZGl0TW9kZWxDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RFZGl0TW9kZWxDb21tYW5kIHsKKwlwcm90ZWN0ZWQgRWRpdE1vZGVsQ29tbWFuZCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgRWRpdE1vZGVsQ29tbWFuZChDb21tYW5kIHRhcmdldENvbW1hbmQpIHsKKwkJc3VwZXIodGFyZ2V0Q29tbWFuZCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKKwkJcmV0dXJuIGdldFRhcmdldCgpLmNhblVuZG8oKTsKKwl9CisKKwlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBleGVjdXRlSW5Nb2RlbChBYnN0cmFjdEVkaXRNb2RlbENvbW1hbmQgY21kKTsKKworCXB1YmxpYyBFZGl0TW9kZWxDb21tYW5kIGdldEVkaXRNb2RlbENvbW1hbmQoKSB7CisJCXJldHVybiB0aGlzOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7CisJCXJldHVybiBnZXRUYXJnZXQoKS5nZXRMYWJlbCgpOworCX0KKworCXB1YmxpYyB2b2lkIGludmVydEFuZFB1c2goKSB7CisJCWV4ZWN1dGVJbk1vZGVsKHRoaXMuaW52ZXJ0ZWQoKSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0VkaXRNb2RlbEV2ZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9FZGl0TW9kZWxFdmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MGE4NGEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9FZGl0TW9kZWxFdmVudC5qYXZhCkBAIC0wLDAgKzEsMTIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCisgKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uOworCisKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CisKK3B1YmxpYyBjbGFzcyBFZGl0TW9kZWxFdmVudCB7CisJLy9UaGVzZSBhcmUgdGhlIGV2ZW50IGNvZGVzLgorCisJLy8gVXNlZCB3aGVuIHRoZSBlZGl0IG1vZGVsIGlzIHNhdmVkLgorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNBVkUgPSAxOworCS8vIFVzZWQgd2hlbiB0aGUgY29tbWFuZCBzdGFjayBiZWNvbWVzIGRpcnR5LgorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUlRZID0gMjsKKwkvLyBVc2VkIHdoZW4gYSByZWZlcmVuY2VkIHJlc291cmNlIGlzIHJlbW92ZWQgZnJvbSB0aGUgUmVzb3VyY2VTZXQuCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1ZFRF9SRVNPVVJDRSA9IDM7CisJLy8gVXNlZCB3aGVuIGEgcmVmZXJlbmNlZCByZXNvdXJjZSBpcyBhZGRlZCB0byB0aGUgUmVzb3VyY2VTZXQuCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQURERURfUkVTT1VSQ0UgPSA0OworCS8vIFVzZWQgd2hlbiB0aGUgZWRpdCBtb2RlbCBpcyBkaXNwb3NlZAorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRV9ESVNQT1NFID0gNTsKKwkvLyBVc2VkIHdoZW4gYSBSZXNvdXJjZSBpcyBsb2FkZWQgb3IgdGhlIGZpcnN0IG9iamVjdAorCS8vIGlzIGFkZGVkIHRvIHRoZSBjb250ZW50cyB3aGVuIGNyZWF0ZWQuCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9BREVEX1JFU09VUkNFID0gNjsKKwkvLyBVc2VkIHdoZW4gYSBSZXNvdXJjZSBpcyB1bmxvYWRlZC4KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkxPQURFRF9SRVNPVVJDRSA9IDc7CisJLy8gSW5kaWNhdGVzIHRoYXQgdGhlIGxpc3Qgb2Yga25vd24gcmVzb3VyY2VzIG1hbmFnZWQgYnkgdGhlIGVkaXQgbW9kZWwgaXMgYWJvdXQgdG8gY2hhbmdlCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS05PV05fUkVTT1VSQ0VTX0FCT1VUX1RPX0NIQU5HRSA9IDg7CisJLy8gSW5kaWNhdGVzIHRoYXQgdGhlIGxpc3Qgb2Yga25vd24gcmVzb3VyY2VzIG1hbmFnZWQgYnkgdGhlIGVkaXQgbW9kZWwgaGFzIGNoYW5nZWQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLTk9XTl9SRVNPVVJDRVNfQ0hBTkdFRCA9IDk7CisKKwlwcml2YXRlIGludCBldmVudENvZGU7CisJcHJpdmF0ZSBFZGl0TW9kZWwgZWRpdE1vZGVsOworCXByaXZhdGUgTGlzdCBjaGFuZ2VkUmVzb3VyY2VzOworCisJLyoqCisJICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xMi8yMDAxIDI6NDY6NTkgUE0pCisJICovCisJcHVibGljIEVkaXRNb2RlbEV2ZW50KGludCBhbkV2ZW50Q29kZSwgRWRpdE1vZGVsIG1vZGVsKSB7CisJCXNldEV2ZW50Q29kZShhbkV2ZW50Q29kZSk7CisJCXNldEVkaXRNb2RlbChtb2RlbCk7CisJfQorCisJcHVibGljIHZvaWQgYWRkUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKSB7CisJCWlmIChhUmVzb3VyY2UgIT0gbnVsbCkKKwkJCWdldENoYW5nZWRSZXNvdXJjZXMoKS5hZGQoYVJlc291cmNlKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRSZXNvdXJjZXMoQ29sbGVjdGlvbiBzb21lUmVzb3VyY2VzKSB7CisJCWlmIChzb21lUmVzb3VyY2VzICE9IG51bGwpCisJCQlnZXRDaGFuZ2VkUmVzb3VyY2VzKCkuYWRkQWxsKHNvbWVSZXNvdXJjZXMpOworCX0KKworCS8qKgorCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvMTIvMjAwMSAyOjQ2OjQzIFBNKQorCSAqIAorCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKKwkgKi8KKwlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0Q2hhbmdlZFJlc291cmNlcygpIHsKKwkJaWYgKGNoYW5nZWRSZXNvdXJjZXMgPT0gbnVsbCkKKwkJCWNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCXJldHVybiBjaGFuZ2VkUmVzb3VyY2VzOworCX0KKworCS8qKgorCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDA1LzIxLzAxIDk6MDE6MDggUE0pCisJICogCisJICogQHJldHVybiBjb20uaWJtLmV0b29scy5qMmVlLndvcmtiZW5jaC5FZGl0TW9kZWwKKwkgKi8KKwlwdWJsaWMgRWRpdE1vZGVsIGdldEVkaXRNb2RlbCgpIHsKKwkJcmV0dXJuIGVkaXRNb2RlbDsKKwl9CisKKwkvKioKKwkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzEyLzIwMDEgMjo0Njo0MyBQTSkKKwkgKiAKKwkgKiBAcmV0dXJuIGludAorCSAqLworCXB1YmxpYyBpbnQgZ2V0RXZlbnRDb2RlKCkgeworCQlyZXR1cm4gZXZlbnRDb2RlOworCX0KKworCS8qKgorCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvMTIvMjAwMSAyOjQ2OjQzIFBNKQorCSAqIAorCSAqIEBwYXJhbSBuZXdDaGFuZ2VkUmVzb3VyY2VzCisJICogICAgICAgICAgICBqYXZhLnV0aWwuTGlzdAorCSAqLworCXB1YmxpYyB2b2lkIHNldENoYW5nZWRSZXNvdXJjZXMoamF2YS51dGlsLkxpc3QgbmV3Q2hhbmdlZFJlc291cmNlcykgeworCQljaGFuZ2VkUmVzb3VyY2VzID0gbmV3Q2hhbmdlZFJlc291cmNlczsKKwl9CisKKwkvKioKKwkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgwNS8yMS8wMSA5OjAxOjA4IFBNKQorCSAqIAorCSAqIEBwYXJhbSBuZXdFZGl0TW9kZWwKKwkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLmoyZWUud29ya2JlbmNoLkVkaXRNb2RlbAorCSAqLworCXB1YmxpYyB2b2lkIHNldEVkaXRNb2RlbChFZGl0TW9kZWwgbmV3RWRpdE1vZGVsKSB7CisJCWVkaXRNb2RlbCA9IG5ld0VkaXRNb2RlbDsKKwl9CisKKwkvKioKKwkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzEyLzIwMDEgMjo0Njo0MyBQTSkKKwkgKiAKKwkgKiBAcGFyYW0gbmV3RXZlbnRDb2RlCisJICogICAgICAgICAgICBpbnQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRFdmVudENvZGUoaW50IG5ld0V2ZW50Q29kZSkgeworCQlldmVudENvZGUgPSBuZXdFdmVudENvZGU7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0VkaXRNb2RlbEZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0VkaXRNb2RlbEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTdiYmU0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRWRpdE1vZGVsRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uOworCisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dDsKKworIAorcHVibGljIGNsYXNzIEVkaXRNb2RlbEZhY3RvcnkgaW1wbGVtZW50cyBJRWRpdE1vZGVsRmFjdG9yeSB7CisJcHJvdGVjdGVkIGJvb2xlYW4gbG9hZEtub3duUmVzb3VyY2VzQXNSZWFkT25seSA9IHRydWU7CisKKwlwdWJsaWMgRWRpdE1vZGVsIGNyZWF0ZUVkaXRNb2RlbEZvclJlYWQoU3RyaW5nIGVkaXRNb2RlbElELCBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQpIHsKKwkJcmV0dXJuIGNyZWF0ZUVkaXRNb2RlbEZvclJlYWQoZWRpdE1vZGVsSUQsIGNvbnRleHQsIG51bGwpOworCX0KKworCXB1YmxpYyBFZGl0TW9kZWwgY3JlYXRlRWRpdE1vZGVsRm9yV3JpdGUoU3RyaW5nIGVkaXRNb2RlbElELCBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQpIHsKKwkJcmV0dXJuIGNyZWF0ZUVkaXRNb2RlbEZvcldyaXRlKGVkaXRNb2RlbElELCBjb250ZXh0LCBudWxsKTsKKwl9CisKKwlwdWJsaWMgRWRpdE1vZGVsIGNyZWF0ZUVkaXRNb2RlbEZvclJlYWQoU3RyaW5nIGVkaXRNb2RlbElELCBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQsIE1hcCBwYXJhbXMpIHsKKwkJRWRpdE1vZGVsIGVkaXRNb2RlbCA9IG5ldyBFZGl0TW9kZWwoZWRpdE1vZGVsSUQsIGNvbnRleHQsIHRydWUpOworCQllZGl0TW9kZWwuc2V0QWNjZXNzQXNSZWFkRm9yVW5Lbm93blVSSXMobG9hZEtub3duUmVzb3VyY2VzQXNSZWFkT25seSk7CisJCXJldHVybiBlZGl0TW9kZWw7CisJfQorCisJcHVibGljIEVkaXRNb2RlbCBjcmVhdGVFZGl0TW9kZWxGb3JXcml0ZShTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCwgTWFwIHBhcmFtcykgeworCQlFZGl0TW9kZWwgZWRpdE1vZGVsID0gbmV3IEVkaXRNb2RlbChlZGl0TW9kZWxJRCwgY29udGV4dCwgZmFsc2UpOworCQllZGl0TW9kZWwuc2V0QWNjZXNzQXNSZWFkRm9yVW5Lbm93blVSSXMobG9hZEtub3duUmVzb3VyY2VzQXNSZWFkT25seSk7CisJCXJldHVybiBlZGl0TW9kZWw7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRDYWNoZUlEKFN0cmluZyBlZGl0TW9kZWxJRCwgTWFwIHBhcmFtcykgeworCQlyZXR1cm4gZWRpdE1vZGVsSUQ7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5JRWRpdE1vZGVsRmFjdG9yeSNzZXRMb2FkS25vd25SZXNvdXJjZXNBc1JlYWRPbmx5KGJvb2xlYW4pCisJICovCisJcHVibGljIHZvaWQgc2V0TG9hZEtub3duUmVzb3VyY2VzQXNSZWFkT25seShib29sZWFuIHZhbHVlKSB7CisJCXRoaXMubG9hZEtub3duUmVzb3VyY2VzQXNSZWFkT25seSA9IHZhbHVlOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbG9hZEtub3duUmVzb3VyY2VzQXNSZWFkT25seS4KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0xvYWRLbm93blJlc291cmNlc0FzUmVhZE9ubHkoKSB7CisJCXJldHVybiBsb2FkS25vd25SZXNvdXJjZXNBc1JlYWRPbmx5OworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRWRpdE1vZGVsTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0VkaXRNb2RlbExpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVmZTllNAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0VkaXRNb2RlbExpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwyNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uOworCisKKy8qKgorICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvMTEvMjAwMSA0OjQ1OjEzIFBNKQorICogCisgKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRWRpdE1vZGVsTGlzdGVuZXIgeworCS8qKgorCSAqIEFuIGV2ZW50IG9jdXJyZWQgb24gdGhlIEoyRUVFZGl0TW9kZWwuCisJICovCisJdm9pZCBlZGl0TW9kZWxDaGFuZ2VkKEVkaXRNb2RlbEV2ZW50IGFuRXZlbnQpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0VkaXRNb2RlbE5hdHVyZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vRWRpdE1vZGVsTmF0dXJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgwYTg4NgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0VkaXRNb2RlbE5hdHVyZS5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQ3JlYXRlZCBvbiBNYXIgNCwgMjAwNAorICoKKyAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KKyAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cworICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2gubmF0dXJlLkVNRk5hdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0OworCisvKioKKyAqIEBhdXRob3Igc2NoYWNoZXIKKyAqIAorICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCisgKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEVkaXRNb2RlbE5hdHVyZSBleHRlbmRzIEVNRk5hdHVyZSB7CisJLyoqCisJICogIAorCSAqLworCXB1YmxpYyBFZGl0TW9kZWxOYXR1cmUoKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIEVkaXRNb2RlbCBnZXRFZGl0TW9kZWxGb3JSZWFkKFN0cmluZyBlZGl0TW9kZWxLZXksIE9iamVjdCBhY2Nlc3NvcktleSkgeworCQlyZXR1cm4gZ2V0RWRpdE1vZGVsRm9yUmVhZChlZGl0TW9kZWxLZXksIGFjY2Vzc29yS2V5LCBudWxsKTsKKwl9CisKKwlwdWJsaWMgRWRpdE1vZGVsIGdldEVkaXRNb2RlbEZvcldyaXRlKFN0cmluZyBlZGl0TW9kZWxLZXksIE9iamVjdCBhY2Nlc3NvcktleSkgeworCQlyZXR1cm4gZ2V0RWRpdE1vZGVsRm9yV3JpdGUoZWRpdE1vZGVsS2V5LCBhY2Nlc3NvcktleSwgbnVsbCk7CisJfQorCisJcHVibGljIEVkaXRNb2RlbCBnZXRFZGl0TW9kZWxGb3JSZWFkKFN0cmluZyBlZGl0TW9kZWxLZXksIE9iamVjdCBhY2Nlc3NvcktleSwgTWFwIHBhcmFtcykgeworCQlFZGl0TW9kZWwgcmVzdWx0ID0gbnVsbDsKKwkJaWYgKGdldEVtZkNvbnRleHQoKSAhPSBudWxsKQorCQkJcmVzdWx0ID0gZ2V0RW1mQ29udGV4dCgpLmdldEVkaXRNb2RlbEZvclJlYWQoZWRpdE1vZGVsS2V5LCBhY2Nlc3NvcktleSwgcGFyYW1zKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwdWJsaWMgRWRpdE1vZGVsIGdldEVkaXRNb2RlbEZvcldyaXRlKFN0cmluZyBlZGl0TW9kZWxLZXksIE9iamVjdCBhY2Nlc3NvcktleSwgTWFwIHBhcmFtcykgeworCQlFZGl0TW9kZWwgcmVzdWx0ID0gbnVsbDsKKwkJaWYgKGdldEVtZkNvbnRleHQoKSAhPSBudWxsKQorCQkJcmVzdWx0ID0gZ2V0RW1mQ29udGV4dCgpLmdldEVkaXRNb2RlbEZvcldyaXRlKGVkaXRNb2RlbEtleSwgYWNjZXNzb3JLZXksIHBhcmFtcyk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHJvdGVjdGVkIEVNRldvcmtiZW5jaENvbnRleHQgZ2V0RW1mQ29udGV4dCgpIHsKKwkJcmV0dXJuIChFTUZXb3JrYmVuY2hDb250ZXh0KSBnZXRFbWZDb250ZXh0QmFzZSgpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vSUVkaXRNb2RlbEZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0lFZGl0TW9kZWxGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODczMjA5ZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0lFZGl0TW9kZWxGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dDsKKworCitwdWJsaWMgaW50ZXJmYWNlIElFZGl0TW9kZWxGYWN0b3J5IHsKKworCXB1YmxpYyBhYnN0cmFjdCBFZGl0TW9kZWwgY3JlYXRlRWRpdE1vZGVsRm9yUmVhZChTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCk7CisKKwlwdWJsaWMgYWJzdHJhY3QgRWRpdE1vZGVsIGNyZWF0ZUVkaXRNb2RlbEZvclJlYWQoU3RyaW5nIGVkaXRNb2RlbElELCBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQsIE1hcCBwYXJhbXMpOworCisJcHVibGljIGFic3RyYWN0IEVkaXRNb2RlbCBjcmVhdGVFZGl0TW9kZWxGb3JXcml0ZShTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCk7CisKKwlwdWJsaWMgYWJzdHJhY3QgRWRpdE1vZGVsIGNyZWF0ZUVkaXRNb2RlbEZvcldyaXRlKFN0cmluZyBlZGl0TW9kZWxJRCwgRU1GV29ya2JlbmNoQ29udGV4dCBjb250ZXh0LCBNYXAgcGFyYW1zKTsKKworCXB1YmxpYyBTdHJpbmcgZ2V0Q2FjaGVJRChTdHJpbmcgZWRpdE1vZGVsSUQsIE1hcCBwYXJhbXMpOworCisJcHVibGljIHZvaWQgc2V0TG9hZEtub3duUmVzb3VyY2VzQXNSZWFkT25seShib29sZWFuIHZhbHVlKTsKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0xvb3NlQ29tcG9zZWRFZGl0TW9kZWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL0xvb3NlQ29tcG9zZWRFZGl0TW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWE1ZjgyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vTG9vc2VDb21wb3NlZEVkaXRNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHQ7CisKKworLyoqCisgKiBAYXV0aG9yIEFkbWluaXN0cmF0b3IKKyAqLworcHVibGljIGNsYXNzIExvb3NlQ29tcG9zZWRFZGl0TW9kZWwgZXh0ZW5kcyBDb21wb3NlZEVkaXRNb2RlbCB7CisKKwlwdWJsaWMgTG9vc2VDb21wb3NlZEVkaXRNb2RlbChTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCkgeworCQlzdXBlcihlZGl0TW9kZWxJRCwgY29udGV4dCk7CisKKwl9CisKKwlwdWJsaWMgRWRpdE1vZGVsLlJlZmVyZW5jZSBhZGRDaGlsZChFZGl0TW9kZWwgZWRpdE1vZGVsKSB7CisJCWdldENoaWxkcmVuKCkuYWRkKGVkaXRNb2RlbCk7CisJCVJlZmVyZW5jZSByZWYgPSBlZGl0TW9kZWwuZ2V0UmVmZXJlbmNlKCk7CisJCWdldENoaWxkcmVuTWFwKCkucHV0KHJlZiwgZWRpdE1vZGVsKTsKKwkJcmV0dXJuIHJlZjsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVDaGlsZChFZGl0TW9kZWwgZWRpdE1vZGVsKSB7CisJCWdldENoaWxkcmVuKCkucmVtb3ZlKGVkaXRNb2RlbCk7CisJCWdldENoaWxkcmVuTWFwKCkucmVtb3ZlKGVkaXRNb2RlbC5nZXRSZWZlcmVuY2UoKSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL01vZGVsTW9kaWZpZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL01vZGVsTW9kaWZpZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGVkODZhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vTW9kZWxNb2RpZmllci5qYXZhCkBAIC0wLDAgKzEsNjIxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW1MaXRlcmFsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5TZXRDb21tYW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FeHRlbmRlZEVjb3JlVXRpbDsKKworLyoqCisgKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC82LzIwMDEgMzo0MDozNSBQTSkKKyAqIAorICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgorICovCitwdWJsaWMgY2xhc3MgTW9kZWxNb2RpZmllciB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVF9QQVRURVJOID0gIlNldCB7MH0iOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9QQVRURVJOID0gIkFkZCB7MH0iOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9WRV9QQVRURVJOID0gIlJlbW92ZSB7MH0iOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ09NTUFORF9MQUJFTCA9ICJDb21tYW5kIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluOworCXByaXZhdGUgTGlzdCBoZWxwZXJzOworCXByaXZhdGUgTGlzdCBleHRlbmRlZEhlbHBlcnM7CisJcHJvdGVjdGVkIExpc3QgYWRkaXRpb25hbENvbW1hbmRzOworCXByb3RlY3RlZCBpbnQgc3RhdHVzOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PX1ZBTFVFX0NIQU5HRSA9IDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUVfQ0hBTkdFID0gMTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IDI7CisKKwkvKioKKwkgKiBKMkVFTW9kZWxNb2RpZmllciBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqLworCXB1YmxpYyBNb2RlbE1vZGlmaWVyKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIEoyRUVNb2RlbE1vZGlmaWVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICogCisJICogQHBhcmFtIGFEb21haW4KKwkgKiAgICAgICAgICAgIEVkaXRpbmdEb21haW4KKwkgKi8KKwlwdWJsaWMgTW9kZWxNb2RpZmllcihFZGl0aW5nRG9tYWluIGFEb21haW4pIHsKKwkJc2V0RWRpdGluZ0RvbWFpbihhRG9tYWluKTsKKwl9CisKKwkvKioKKwkgKiBBZGQKKwkgKiAKKwkgKiBAYUhlbHBlciB0byB0aGUgbGlzdCBvZiBoZWxwZXIgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkLgorCSAqLworCXB1YmxpYyB2b2lkIGFkZEhlbHBlcihNb2RpZmllckhlbHBlciBhSGVscGVyKSB7CisJCWlmIChhSGVscGVyICE9IG51bGwgJiYgIWdldEhlbHBlcnMoKS5jb250YWlucyhhSGVscGVyKSkKKwkJCWdldEhlbHBlcnMoKS5hZGQoYUhlbHBlcik7CisJfQorCisJcHVibGljIHZvaWQgYWRkQWRkaXRpb25hbENvbW1hbmQoQ29tbWFuZCBhQ29tbWFuZCkgeworCQlpZiAoYUNvbW1hbmQgIT0gbnVsbCAmJiAhZ2V0QWRkaXRpb25hbENvbW1hbmRzKCkuY29udGFpbnMoYUNvbW1hbmQpKQorCQkJYWRkaXRpb25hbENvbW1hbmRzLmFkZChhQ29tbWFuZCk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRydWUgaWYgdGhpcyBtb2RpZmllciBjYW4gY3JlYXRlIGEgY29tbWFuZCB0aGF0IHdpbGwgcGVyZm9ybSB0aGUgbmVjZXNzYXJ5IG9wZXJhdGlvbi4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlQ29tbWFuZCgpIHsKKwkJcmV0dXJuIGdldEVkaXRpbmdEb21haW4oKSAhPSBudWxsOworCX0KKworCXB1YmxpYyBpbnQgZXhlY3V0ZVdpdGhTdGF0dXMoKSB7CisJCXRyeSB7CisJCQlleGVjdXRlKCk7CisJCQlyZXR1cm4gc3RhdHVzOworCQl9IGZpbmFsbHkgeworCQkJc3RhdHVzID0gLTE7CisJCX0KKwl9CisKKwkvKioKKwkgKiBFeGVjdXRlIHRoaXMgbW9kaWZpZXIgdXNpbmcgdGhlIHJlY29yZGluZyBtZWNoYW5pc20gb2YgdGhlIFN0cnVjdGVkVGV4dFVuZG9NYW5hZ2VyLiBJZiB0aGlzCisJICogbW9kaWZpZXIgY2Fubm90IHJlY29yZCwgdHJ5IHRvIGV4ZWN1dGUgdXNpbmcgdGhlIENvbW1hbmRTdGFjayAoaWYgaXQgY2FuIGV4ZWN1dGUgY29tbWFuZHMpLgorCSAqIFJldHVybiB0cnVlIGlmIHRoZSBleGVjdXRpb24gd2FzIGF0dGVtcHRlZC4KKwkgKiAKKwkgKiBAc2VlIGNhbkV4ZWN1dGVDb21tYW5kKCkKKwkgKiBAc2VlIGNhblJlY29yZCgpCisJICogQHNlZSBydW4oKQorCSAqLworCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoTW9kaWZpZXJIZWxwZXIgYUhlbHBlcikgeworCQlhZGRIZWxwZXIoYUhlbHBlcik7CisJCXJldHVybiBleGVjdXRlKCk7CisJfQorCisJLyoqCisJICogRXhlY3V0ZSB0aGlzIG1vZGlmaWVyIHVzaW5nIHRoZSByZWNvcmRpbmcgbWVjaGFuaXNtIG9mIHRoZSBTdHJ1Y3RlZFRleHRVbmRvTWFuYWdlci4gSWYgdGhpcworCSAqIG1vZGlmaWVyIGNhbm5vdCByZWNvcmQsIHRyeSB0byBleGVjdXRlIHVzaW5nIHRoZSBDb21tYW5kU3RhY2sgKGlmIGl0IGNhbiBleGVjdXRlIGNvbW1hbmRzKS4KKwkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZXhlY3V0aW9uIHdhcyBhdHRlbXB0ZWQuCisJICogCisJICogQHNlZSBjYW5FeGVjdXRlQ29tbWFuZCgpCisJICogQHNlZSBjYW5SZWNvcmQoKQorCSAqIEBzZWUgcnVuKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKExpc3Qgc29tZUhlbHBlcnMpIHsKKwkJc2V0SGVscGVycyhzb21lSGVscGVycyk7CisJCXJldHVybiBleGVjdXRlKCk7CisJfQorCisJLyoqCisJICogRXhlY3V0ZSB0aGlzIG1vZGlmaWVyIGJ5IGNyZWF0aW5nIGEgQ29tbWFuZCB0aGF0IGlzIGV4ZWN1dGVkIG9uIHRoZSBDb21tYW5kU3RhY2suIElmIHRoaXMKKwkgKiBtb2RpZmllciBjYW5ub3QgZXhlY3V0ZSBjb21tYW5kcywgdGhlIGV4ZWN1dGlvbiB3aWxsIG5vdCB0YWtlIHBsYWNlLiBSZXR1cm4gdHJ1ZSBpZiB0aGUKKwkgKiBleGVjdXRpb24gd2FzIGF0dGVtcHRlZC4KKwkgKiAKKwkgKiBAc2VlIGNhbkV4ZWN1dGVDb21tYW5kKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKCkgeworCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOworCQlpZiAoY2FuRXhlY3V0ZUNvbW1hbmQoKSkgeworCQkJdHJ5IHsKKwkJCQlDb21tYW5kIGNvbW1hbmQgPSBjcmVhdGVDb21tYW5kKCk7CisJCQkJcmVzdWx0ID0gY29tbWFuZCAhPSBudWxsOworCQkJCWlmIChyZXN1bHQpIHsKKwkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKKwkJCQl9CisJCQl9IGZpbmFsbHkgeworCQkJCXJlbGVhc2UoKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXNldFN0YXR1cyhFUlJPUik7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcm90ZWN0ZWQgQ29tbWFuZFN0YWNrIGdldENvbW1hbmRTdGFjaygpIHsKKwkJaWYgKGdldEVkaXRpbmdEb21haW4oKSAhPSBudWxsKQorCQkJcmV0dXJuIGdldEVkaXRpbmdEb21haW4oKS5nZXRDb21tYW5kU3RhY2soKTsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC82LzIwMDEgMjo1MzoxNyBQTSkKKwkgKiAKKwkgKiBAcmV0dXJuIEVkaXRpbmdEb21haW4KKwkgKi8KKwlwdWJsaWMgRWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCkgeworCQlyZXR1cm4gZWRpdGluZ0RvbWFpbjsKKwl9CisKKwkvKioKKwkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzEwLzIwMDEgODo0NjozNSBBTSkKKwkgKiAKKwkgKiBAcmV0dXJuIEoyRUVNb2RpZmllckhlbHBlcgorCSAqLworCXB1YmxpYyBNb2RpZmllckhlbHBlciBnZXRGaXJzdEhlbHBlcigpIHsKKwkJaWYgKGhlbHBlcnMgIT0gbnVsbCAmJiBnZXRIZWxwZXJzKCkuc2l6ZSgpID4gMCkKKwkJCXJldHVybiAoTW9kaWZpZXJIZWxwZXIpIGdldEhlbHBlcnMoKS5nZXQoMCk7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvMTAvMjAwMSA4OjQ2OjM1IEFNKQorCSAqIAorCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKKwkgKi8KKwlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0SGVscGVycygpIHsKKwkJaWYgKGhlbHBlcnMgPT0gbnVsbCkKKwkJCWhlbHBlcnMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCXJldHVybiBoZWxwZXJzOworCX0KKworCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRBZGRpdGlvbmFsQ29tbWFuZHMoKSB7CisJCWlmIChhZGRpdGlvbmFsQ29tbWFuZHMgPT0gbnVsbCkKKwkJCWFkZGl0aW9uYWxDb21tYW5kcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJcmV0dXJuIGFkZGl0aW9uYWxDb21tYW5kczsKKwl9CisKKwkvKioKKwkgKiBSZWxlYXNlIGFsbCBtb2RlbCBhcnRpZmFjdHMuCisJICovCisJcHJvdGVjdGVkIHZvaWQgcmVsZWFzZSgpIHsKKwkJc2V0RWRpdGluZ0RvbWFpbihudWxsKTsKKwkJc2V0SGVscGVycyhudWxsKTsKKwl9CisKKwkvKioKKwkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzYvMjAwMSAyOjUzOjE3IFBNKQorCSAqIAorCSAqIEBwYXJhbSBuZXdFZGl0aW5nRG9tYWluCisJICogICAgICAgICAgICBFZGl0aW5nRG9tYWluCisJICovCisJcHVibGljIHZvaWQgc2V0RWRpdGluZ0RvbWFpbihFZGl0aW5nRG9tYWluIG5ld0VkaXRpbmdEb21haW4pIHsKKwkJZWRpdGluZ0RvbWFpbiA9IG5ld0VkaXRpbmdEb21haW47CisJfQorCisJLyoqCisJICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xMC8yMDAxIDg6NDY6MzUgQU0pCisJICogCisJICogQHBhcmFtIG5ld0hlbHBlcnMKKwkgKiAgICAgICAgICAgIGphdmEudXRpbC5MaXN0CisJICovCisJcHVibGljIHZvaWQgc2V0SGVscGVycyhqYXZhLnV0aWwuTGlzdCBuZXdIZWxwZXJzKSB7CisJCWhlbHBlcnMgPSBuZXdIZWxwZXJzOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldFN0YXR1cyhpbnQgc3RhdHVzQ29kZSkgeworCQlpZiAoc3RhdHVzQ29kZSA+IHN0YXR1cykKKwkJCXN0YXR1cyA9IHN0YXR1c0NvZGU7CisJfQorCisJLyoqCisJICogUmV0dXJuIGFuIEFkZENvbW1hbmQgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGJ5IGEgQ29tbWFuZFN0YWNrLgorCSAqLworCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoTW9kaWZpZXJIZWxwZXIgYUhlbHBlcikgeworCQlPYmplY3QgdmFsdWUgPSBnZXRWYWx1ZShhSGVscGVyKTsKKwkJQ29tbWFuZCBjb21tYW5kID0gbnVsbDsKKwkJaWYgKHZhbHVlQ2hhbmdlZChhSGVscGVyLmdldE93bmVyKCksIGFIZWxwZXIuZ2V0RmVhdHVyZSgpLCB2YWx1ZSwgZmFsc2UpKSB7CisJCQljb21tYW5kID0gQWRkQ29tbWFuZC5jcmVhdGUoZ2V0RWRpdGluZ0RvbWFpbigpLCBhSGVscGVyLmdldE93bmVyKCksIGFIZWxwZXIuZ2V0RmVhdHVyZSgpLCB2YWx1ZSk7CisJCQkoKEFic3RyYWN0Q29tbWFuZCkgY29tbWFuZCkuc2V0TGFiZWwoY3JlYXRlQ29tbWFuZExhYmVsKEFERF9QQVRURVJOLCBhSGVscGVyLmdldEZlYXR1cmUoKSkpOworCQkJc2V0U3RhdHVzKFZBTFVFX0NIQU5HRSk7CisJCX0gZWxzZSB7CisJCQlzZXRTdGF0dXMoTk9fVkFMVUVfQ0hBTkdFKTsKKwkJfQorCQlyZXR1cm4gY29tbWFuZDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gYSBDb21tYW5kIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBieSBhIENvbW1hbmRTdGFjay4gVGhlIGRlZmF1bHQgaXMgdG8gcmV0dXJuIG51bGwuCisJICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCisJICovCisJcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZCgpIHsKKwkJQ29tbWFuZCBjaGFpbmVkQ29tbWFuZCA9IGNyZWF0ZUNvbW1hbmQobnVsbCwgZ2V0SGVscGVycygpKTsKKwkJaWYgKG51bGwgPT0gY2hhaW5lZENvbW1hbmQgJiYgYWRkaXRpb25hbENvbW1hbmRzICE9IG51bGwgJiYgYWRkaXRpb25hbENvbW1hbmRzLmlzRW1wdHkoKSkgeworCQkJc2V0U3RhdHVzKEVSUk9SKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJCWNoYWluZWRDb21tYW5kID0gYXBwZW5kQWRkaXRpb25hbENvbW1hbmRzKGNoYWluZWRDb21tYW5kKTsKKwkJcmV0dXJuIGNoYWluZWRDb21tYW5kOworCX0KKworCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoQ29tbWFuZCBjaGFpbmVkQ29tbWFuZCwgTGlzdCBoZWxwZXJzQXJnKSB7CisJCWlmIChudWxsID09IGV4dGVuZGVkSGVscGVycykgeworCQkJZXh0ZW5kZWRIZWxwZXJzID0gbmV3IEFycmF5TGlzdCgpOworCQl9CisKKwkJaWYgKCFoZWxwZXJzQXJnLmlzRW1wdHkoKSkgeworCQkJSXRlcmF0b3IgaXQgPSBoZWxwZXJzQXJnLml0ZXJhdG9yKCk7CisJCQlDb21tYW5kIG5leHRDb21tYW5kID0gbnVsbDsKKwkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKwkJCQluZXh0Q29tbWFuZCA9IGNyZWF0ZUNvbW1hbmQoKE1vZGlmaWVySGVscGVyKSBpdC5uZXh0KCkpOworCQkJCWlmIChjaGFpbmVkQ29tbWFuZCA9PSBudWxsKQorCQkJCQljaGFpbmVkQ29tbWFuZCA9IG5leHRDb21tYW5kOworCQkJCWVsc2UgaWYgKG5leHRDb21tYW5kICE9IG51bGwpCisJCQkJCWNoYWluZWRDb21tYW5kID0gY2hhaW5lZENvbW1hbmQuY2hhaW4obmV4dENvbW1hbmQpOworCQkJfQorCQl9CisJCWlmICghZXh0ZW5kZWRIZWxwZXJzLmlzRW1wdHkoKSkgeworCQkJTGlzdCBjb3B5ID0gbmV3IEFycmF5TGlzdCgpOworCQkJY29weS5hZGRBbGwoZXh0ZW5kZWRIZWxwZXJzKTsKKwkJCWV4dGVuZGVkSGVscGVycy5jbGVhcigpOworCQkJY2hhaW5lZENvbW1hbmQgPSBjcmVhdGVDb21tYW5kKGNoYWluZWRDb21tYW5kLCBjb3B5KTsKKwkJfQorCQlyZXR1cm4gY2hhaW5lZENvbW1hbmQ7CisJfQorCisJcHJvdGVjdGVkIENvbW1hbmQgYXBwZW5kQWRkaXRpb25hbENvbW1hbmRzKENvbW1hbmQgY2hhaW5lZENvbW1hbmQpIHsKKwkJaWYgKGFkZGl0aW9uYWxDb21tYW5kcyAhPSBudWxsICYmICFhZGRpdGlvbmFsQ29tbWFuZHMuaXNFbXB0eSgpKSB7CisJCQlDb21tYW5kIGNvbW1hbmQ7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGFkZGl0aW9uYWxDb21tYW5kcy5zaXplKCk7IGkrKykgeworCQkJCWNvbW1hbmQgPSAoQ29tbWFuZCkgYWRkaXRpb25hbENvbW1hbmRzLmdldChpKTsKKwkJCQlpZiAoY2hhaW5lZENvbW1hbmQgPT0gbnVsbCkKKwkJCQkJY2hhaW5lZENvbW1hbmQgPSBjb21tYW5kOworCQkJCWVsc2UKKwkJCQkJY2hhaW5lZENvbW1hbmQgPSBjaGFpbmVkQ29tbWFuZC5jaGFpbihjb21tYW5kKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gY2hhaW5lZENvbW1hbmQ7CisJfQorCisJLyoqCisJICogUmV0dXJuIGEgQ29tbWFuZCB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYnkgYSBDb21tYW5kU3RhY2suCisJICovCisJcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ29tbWFuZChNb2RpZmllckhlbHBlciBhSGVscGVyKSB7CisJCWlmIChhSGVscGVyID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJQ29tbWFuZCBjb21tYW5kMSwgY29tbWFuZDI7CisJCU1vZGlmaWVySGVscGVyIG93bmVySGVscGVyID0gYUhlbHBlci5nZXRPd25lckhlbHBlcigpOworCQlpZiAoYUhlbHBlci5zaG91bGRVbnNldFZhbHVlKCkgJiYgb3duZXJIZWxwZXIgIT0gbnVsbCkKKwkJCXJldHVybiBudWxsOyAvL3dlIGFyZSB1bnNldHRpbmcgYSB2YWx1ZSBvbiBhbiBvd25lciB0aGF0IGRvZXMgbm90IGV4aXN0IHNvIGRvIG5vdAorCQkvLyBjcmVhdGUgdGhlIG93bmVyCisJCWNvbW1hbmQxID0gY3JlYXRlQ29tbWFuZChvd25lckhlbHBlcik7CisJCWNvbW1hbmQyID0gcHJpbUNyZWF0ZUNvbW1hbmQoYUhlbHBlcik7CisKKwkJaWYgKGNvbW1hbmQxICE9IG51bGwpIHsKKwkJCWlmIChjb21tYW5kMiA9PSBudWxsKQorCQkJCWNvbW1hbmQyID0gY29tbWFuZDE7CisJCQllbHNlCisJCQkJY29tbWFuZDIgPSBjb21tYW5kMi5jaGFpbihjb21tYW5kMSk7CisJCX0KKwkJcmV0dXJuIGNvbW1hbmQyOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgY3JlYXRlQ29tbWFuZExhYmVsKFN0cmluZyBhUGF0dGVybiwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKKwkJU3RyaW5nIHJlcGxhY2VtZW50ID0gZmVhdHVyZSA9PSBudWxsID8gREVGQVVMVF9DT01NQU5EX0xBQkVMIDogZmVhdHVyZS5nZXROYW1lKCk7CisJCXJldHVybiBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQoYVBhdHRlcm4sIG5ldyBTdHJpbmdbXXtyZXBsYWNlbWVudH0pOworCX0KKworCS8qKgorCSAqIFJldHVybiBhIENvbW1hbmQgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGJ5IGEgQ29tbWFuZFN0YWNrLiBUaGUgZGVmYXVsdCBpcyB0byByZXR1cm4gbnVsbC4KKwkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZC4KKwkgKi8KKwlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVNYW55Q29tbWFuZChNb2RpZmllckhlbHBlciBhSGVscGVyKSB7CisJCWlmIChhSGVscGVyLnNob3VsZFVuc2V0VmFsdWUoKSkKKwkJCXJldHVybiBjcmVhdGVSZW1vdmVDb21tYW5kKGFIZWxwZXIpOworCQlyZXR1cm4gY3JlYXRlQWRkQ29tbWFuZChhSGVscGVyKTsKKwl9CisKKwlwcm90ZWN0ZWQgRU9iamVjdCBjcmVhdGVPYmplY3RGcm9tSGVscGVyKE1vZGlmaWVySGVscGVyIGFIZWxwZXIpIHsKKwkJcmV0dXJuIGFIZWxwZXIuY3JlYXRlTmV3T2JqZWN0RnJvbUZlYXR1cmUoKTsKKwl9CisKKwkKKwkvKioKKwkgKiBVc2VkIHRvIHJlbW92ZSBhbiBvYmplY3Qgb24gdW5zZXQuICBNYWtlcyB0aGUgb2JqZWN0IGEgcHJveHkgIAorCSAqIG9uIGV4ZWN1dGUgYW5kIHJlZG8gY29tbWFuZHMuICBVbmRvIHdpbGwgcmVtb3ZlIHRoZSBwcm94eS4KKwkgKi8KKwlwdWJsaWMgY2xhc3MgUHJveHlXcmFwcGluZ0NvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgeworCQlwcm90ZWN0ZWQgQ29tbWFuZCBiYXNlQ29tbWFuZCA9IG51bGw7CisJCXByb3RlY3RlZCBFT2JqZWN0IGVPYmplY3QgPSBudWxsOworCQlwcm90ZWN0ZWQgUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOworCisJCXB1YmxpYyBQcm94eVdyYXBwaW5nQ29tbWFuZChDb21tYW5kIGJhc2VDb21tYW5kLCBFT2JqZWN0IGVPYmplY3QpIHsKKwkJCXRoaXMuYmFzZUNvbW1hbmQgPSBiYXNlQ29tbWFuZDsKKwkJCXRoaXMuZU9iamVjdCA9IGVPYmplY3Q7CisJCQl0aGlzLnJlc291cmNlID0gZU9iamVjdC5lUmVzb3VyY2UoKTsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7CisJCQlyZXR1cm4gYmFzZUNvbW1hbmQuY2FuRXhlY3V0ZSgpOworCQl9CisKKwkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKKwkJCUV4dGVuZGVkRWNvcmVVdGlsLmJlY29tZVByb3h5KGVPYmplY3QsIHJlc291cmNlKTsKKwkJCWJhc2VDb21tYW5kLmV4ZWN1dGUoKTsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7CisJCQlyZXR1cm4gYmFzZUNvbW1hbmQuY2FuVW5kbygpOworCQl9CisKKwkJcHVibGljIHZvaWQgdW5kbygpIHsKKwkJCWJhc2VDb21tYW5kLnVuZG8oKTsKKwkJCUV4dGVuZGVkRWNvcmVVdGlsLnJlbW92ZVByb3h5KGVPYmplY3QsIHJlc291cmNlKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHJlZG8oKSB7CisJCQlFeHRlbmRlZEVjb3JlVXRpbC5iZWNvbWVQcm94eShlT2JqZWN0LCByZXNvdXJjZSk7CisJCQliYXNlQ29tbWFuZC5yZWRvKCk7CisJCX0KKworCQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7CisJCQlyZXR1cm4gYmFzZUNvbW1hbmQuZ2V0UmVzdWx0KCk7CisJCX0KKworCQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7CisJCQlyZXR1cm4gYmFzZUNvbW1hbmQuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgeworCQkJcmV0dXJuIGJhc2VDb21tYW5kLmdldExhYmVsKCk7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworCQkJcmV0dXJuIGJhc2VDb21tYW5kLmdldERlc2NyaXB0aW9uKCk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQkJc3VwZXIuZGlzcG9zZSgpOworCQkJYmFzZUNvbW1hbmQuZGlzcG9zZSgpOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJuIGEgUmVtb3ZlIENvbW1hbmQgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGJ5IGEgQ29tbWFuZFN0YWNrLgorCSAqLworCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZVJlbW92ZUNvbW1hbmQoTW9kaWZpZXJIZWxwZXIgYUhlbHBlcikgeworCQlPYmplY3QgdmFsdWUgPSBnZXRWYWx1ZShhSGVscGVyKTsKKwkJQ29tbWFuZCBjb21tYW5kID0gbnVsbDsKKwkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBhSGVscGVyLmdldEZlYXR1cmUoKTsKKwkJaWYgKHZhbHVlQ2hhbmdlZChhSGVscGVyLmdldE93bmVyKCksIGZlYXR1cmUsIHZhbHVlLCB0cnVlKSkgeworCQkJaWYgKGlzVmFsdWVFcXVhbChhSGVscGVyLCB2YWx1ZSkpIHsKKwkJCQljb21tYW5kID0gUmVtb3ZlQ29tbWFuZC5jcmVhdGUoZ2V0RWRpdGluZ0RvbWFpbigpLCBhSGVscGVyLmdldE93bmVyKCksIGZlYXR1cmUsIChDb2xsZWN0aW9uKSB2YWx1ZSk7CisJCQl9IGVsc2UgeworCQkJCWNvbW1hbmQgPSBSZW1vdmVDb21tYW5kLmNyZWF0ZShnZXRFZGl0aW5nRG9tYWluKCksIGFIZWxwZXIuZ2V0T3duZXIoKSwgZmVhdHVyZSwgdmFsdWUpOworCQkJfQorCQkJKChBYnN0cmFjdENvbW1hbmQpIGNvbW1hbmQpLnNldExhYmVsKGNyZWF0ZUNvbW1hbmRMYWJlbChSRU1PVkVfUEFUVEVSTiwgZmVhdHVyZSkpOworCQkJc2V0U3RhdHVzKFZBTFVFX0NIQU5HRSk7CisJCX0gZWxzZSB7CisJCQlzZXRTdGF0dXMoTk9fVkFMVUVfQ0hBTkdFKTsKKwkJfQorCQlyZXR1cm4gY29tbWFuZDsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNWYWx1ZUVxdWFsKE1vZGlmaWVySGVscGVyIGFIZWxwZXIsIE9iamVjdCB2YWx1ZSkgeworCQlyZXR1cm4gYUhlbHBlci5nZXRPd25lcigpLmVHZXQoYUhlbHBlci5nZXRGZWF0dXJlKCkpID09IHZhbHVlOworCX0KKworCS8qKgorCSAqIFJldHVybiBhIFNldENvbW1hbmQgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGJ5IGEgQ29tbWFuZFN0YWNrLgorCSAqLworCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZVNpbmdsZUNvbW1hbmQoTW9kaWZpZXJIZWxwZXIgYUhlbHBlcikgeworCQlPYmplY3QgdmFsdWUgPSBnZXRWYWx1ZShhSGVscGVyKTsKKwkJQ29tbWFuZCBjb21tYW5kID0gbnVsbDsKKwkJaWYgKHZhbHVlQ2hhbmdlZChhSGVscGVyLmdldE93bmVyKCksIGFIZWxwZXIuZ2V0RmVhdHVyZSgpLCB2YWx1ZSwgYUhlbHBlci5zaG91bGRVbnNldFZhbHVlKCkpKSB7CisJCQljb21tYW5kID0gU2V0Q29tbWFuZC5jcmVhdGUoZ2V0RWRpdGluZ0RvbWFpbigpLCBhSGVscGVyLmdldE93bmVyKCksIGFIZWxwZXIuZ2V0RmVhdHVyZSgpLCB2YWx1ZSk7CisJCQkoKEFic3RyYWN0Q29tbWFuZCkgY29tbWFuZCkuc2V0TGFiZWwoY3JlYXRlQ29tbWFuZExhYmVsKFNFVF9QQVRURVJOLCBhSGVscGVyLmdldEZlYXR1cmUoKSkpOworCQkJc2V0U3RhdHVzKFZBTFVFX0NIQU5HRSk7CisJCX0gZWxzZSB7CisJCQlzZXRTdGF0dXMoTk9fVkFMVUVfQ0hBTkdFKTsKKwkJfQorCQlyZXR1cm4gY29tbWFuZDsKKwl9CisKKwlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVZhbHVlRnJvbUhlbHBlcihNb2RpZmllckhlbHBlciBhSGVscGVyKSB7CisJCUVPYmplY3QgbmV3T2JqZWN0ID0gY3JlYXRlT2JqZWN0RnJvbUhlbHBlcihhSGVscGVyKTsKKwkJc2V0TmV3T2JqZWN0QXR0cmlidXRlcyhuZXdPYmplY3QsIGFIZWxwZXIpOworCQlyZXR1cm4gbmV3T2JqZWN0OworCX0KKworCXByb3RlY3RlZCBib29sZWFuIGVudW1WYWx1ZUNoYW5nZWQoRU9iamVjdCBhbk9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBPYmplY3QgYVZhbHVlKSB7CisJCWlmICghYW5PYmplY3QuZUlzU2V0KGFGZWF0dXJlKSkKKwkJCXJldHVybiB0cnVlOworCQlFbnVtZXJhdG9yIGV4aXN0aW5nRW51bWVyYXRvciA9IChFbnVtZXJhdG9yKSBhbk9iamVjdC5lR2V0KGFGZWF0dXJlKTsKKwkJRW51bWVyYXRvciBuZXdFbnVtZXJhdG9yID0gZ2V0RW51bWVyYXRvcihhRmVhdHVyZSwgYVZhbHVlKTsKKwkJcmV0dXJuIGV4aXN0aW5nRW51bWVyYXRvciAhPSBuZXdFbnVtZXJhdG9yOworCX0KKworCXByaXZhdGUgRW51bWVyYXRvciBnZXRFbnVtZXJhdG9yKEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgT2JqZWN0IGFWYWx1ZSkgeworCQlpZiAoYVZhbHVlIGluc3RhbmNlb2YgRW51bWVyYXRvcikKKwkJCXJldHVybiAoRW51bWVyYXRvcikgYVZhbHVlOworCQlFRW51bSBhbkVudW0gPSAoRUVudW0pIGFGZWF0dXJlLmdldEVUeXBlKCk7CisJCUVFbnVtTGl0ZXJhbCBsaXRlcmFsID0gbnVsbDsKKwkJaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykKKwkJCWxpdGVyYWwgPSBhbkVudW0uZ2V0RUVudW1MaXRlcmFsKChTdHJpbmcpIGFWYWx1ZSk7CisJCWVsc2UgaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIEludGVnZXIpCisJCQlsaXRlcmFsID0gYW5FbnVtLmdldEVFbnVtTGl0ZXJhbCgoKEludGVnZXIpIGFWYWx1ZSkuaW50VmFsdWUoKSk7CisJCWlmIChsaXRlcmFsICE9IG51bGwpCisJCQlyZXR1cm4gbGl0ZXJhbC5nZXRJbnN0YW5jZSgpOworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbHVlKE1vZGlmaWVySGVscGVyIGFIZWxwZXIpIHsKKwkJaWYgKGFIZWxwZXIubXVzdENyZWF0ZVZhbHVlKCkpIHsKKwkJCU9iamVjdCB2YWx1ZSA9IGNyZWF0ZVZhbHVlRnJvbUhlbHBlcihhSGVscGVyKTsKKwkJCWFIZWxwZXIuc2V0VmFsdWUodmFsdWUpOworCQl9CisJCXJldHVybiBhSGVscGVyLmdldFZhbHVlKCk7CisJfQorCisJcHJvdGVjdGVkIGJvb2xlYW4gbWFueVZhbHVlQ2hhbmdlZChFT2JqZWN0IGFuT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIE9iamVjdCBhVmFsdWUsIGJvb2xlYW4gaXNVbnNldCkgeworCQlMaXN0IGxpc3QgPSAoTGlzdCkgYW5PYmplY3QuZUdldChhRmVhdHVyZSk7CisJCWlmIChpc1Vuc2V0KQorCQkJcmV0dXJuIGxpc3QuY29udGFpbnMoYVZhbHVlKSB8fCAobGlzdCA9PSBhVmFsdWUgJiYgIWxpc3QuaXNFbXB0eSgpKTsKKwkJcmV0dXJuICFsaXN0LmNvbnRhaW5zKGFWYWx1ZSk7CisJfQorCisJLyoqCisJICogUmV0dXJuIGEgQ29tbWFuZCB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYnkgYSBDb21tYW5kU3RhY2suIFRoZSBkZWZhdWx0IGlzIHRvIHJldHVybiBudWxsLgorCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgorCSAqLworCXByb3RlY3RlZCBDb21tYW5kIHByaW1DcmVhdGVDb21tYW5kKE1vZGlmaWVySGVscGVyIGFIZWxwZXIpIHsKKwkJQ29tbWFuZCBjb21tYW5kID0gZG9DcmVhdGVDb21tYW5kKGFIZWxwZXIpOworCQlpZiAoYUhlbHBlci5zaG91bGRVbnNldFZhbHVlKCkpIHsKKwkJCU9iamVjdCB2YWx1ZSA9IGFIZWxwZXIuZ2V0VmFsdWUoKTsKKwkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEVPYmplY3QgJiYgISgoRU9iamVjdCkgdmFsdWUpLmVJc1Byb3h5KCkpIHsKKwkJCQljb21tYW5kID0gbmV3IFByb3h5V3JhcHBpbmdDb21tYW5kKGNvbW1hbmQsIChFT2JqZWN0KSB2YWx1ZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGNvbW1hbmQ7CisJfQorCisJcHJvdGVjdGVkIENvbW1hbmQgZG9DcmVhdGVDb21tYW5kKE1vZGlmaWVySGVscGVyIGFIZWxwZXIpIHsKKwkJaWYgKCFhSGVscGVyLmlzQ29tcGxldGUoKSkgeworCQkJc2V0U3RhdHVzKEVSUk9SKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJCUNvbW1hbmQgY29tbWFuZCA9IG51bGw7CisJCWlmIChhSGVscGVyLmdldEZlYXR1cmUoKS5pc01hbnkoKSkKKwkJCWNvbW1hbmQgPSBjcmVhdGVNYW55Q29tbWFuZChhSGVscGVyKTsKKwkJZWxzZQorCQkJY29tbWFuZCA9IGNyZWF0ZVNpbmdsZUNvbW1hbmQoYUhlbHBlcik7CisKKwkJaWYgKG51bGwgIT0gY29tbWFuZCkgeworCQkJTGlzdCBsb2NhbEhlbHBlcnMgPSBNb2RpZmllckhlbHBlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SGVscGVycyhhSGVscGVyKTsKKwkJCWlmIChudWxsICE9IGxvY2FsSGVscGVycykgeworCQkJCWV4dGVuZGVkSGVscGVycy5hZGRBbGwobG9jYWxIZWxwZXJzKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gY29tbWFuZDsKKworCX0KKworCS8qKgorCSAqIFJ1biB1c2luZworCSAqIAorCSAqIEBhSGVscGVyLiBUaGlzIHdpbGwgc2V0IGEgTU9GIGF0dGlidXRlIHZhbHVlIHRvIHRoZSBvd25lciBvZiB0aGUgaGVscGVyLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHByaW1SdW4oTW9kaWZpZXJIZWxwZXIgYUhlbHBlcikgeworCQlpZiAoYUhlbHBlci5pc0NvbXBsZXRlKCkpIHsKKwkJCU9iamVjdCB2YWx1ZSA9IGdldFZhbHVlKGFIZWxwZXIpOworCQkJaWYgKHZhbHVlQ2hhbmdlZChhSGVscGVyLmdldE93bmVyKCksIGFIZWxwZXIuZ2V0RmVhdHVyZSgpLCB2YWx1ZSwgYUhlbHBlci5zaG91bGRVbnNldFZhbHVlKCkpKQorCQkJCXNldE9iamVjdEF0dHJpYnV0ZShhSGVscGVyLmdldE93bmVyKCksIGFIZWxwZXIuZ2V0RmVhdHVyZSgpLCB2YWx1ZSwgYUhlbHBlci5zaG91bGRVbnNldFZhbHVlKCkpOworCQl9CisJfQorCisJLyoqCisJICogVGhlIGRlZmF1bHQgaXMgdG8gZG8gbm90aGluZy4gU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhleSBhcmUgdXNpbmcKKwkgKiByZWNvcmRhYmxlIGNvbW1hbmRzLiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2Qgc2hvdWxkIHVwZGF0ZSB0aGUgTU9GIG1vZGVsIGRpcmVjdGx5LgorCSAqIEFueSBtb2RpZmljYXRpb24gd2lsbCBiZSByZWNvcmRlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBydW4oKSB7CisJCWlmICghZ2V0SGVscGVycygpLmlzRW1wdHkoKSkgeworCQkJSXRlcmF0b3IgaXQgPSBnZXRIZWxwZXJzKCkuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChpdC5oYXNOZXh0KCkpCisJCQkJcnVuKChNb2RpZmllckhlbHBlcikgaXQubmV4dCgpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJ1biB1c2luZworCSAqIAorCSAqIEBhSGVscGVyJ3Mgb3duZXJIZWxwZXIgZmlyc3QgYmVmb3JlIHJ1bm5pbmcgd2l0aAorCSAqIEBhSGVscGVyLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHJ1bihNb2RpZmllckhlbHBlciBhSGVscGVyKSB7CisJCWlmIChhSGVscGVyICE9IG51bGwpIHsKKwkJCXJ1bihhSGVscGVyLmdldE93bmVySGVscGVyKCkpOworCQkJcHJpbVJ1bihhSGVscGVyKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIHNldE5ld09iamVjdEF0dHJpYnV0ZXMoRU9iamVjdCBhbk9iamVjdCwgTW9kaWZpZXJIZWxwZXIgYUhlbHBlcikgeworCQlIYXNoTWFwIGF0dHJpYnV0ZXMgPSBhSGVscGVyLmdldEF0dHJpYnV0ZXMoKTsKKwkJSXRlcmF0b3IgaXQgPSBhdHRyaWJ1dGVzLmtleVNldCgpLml0ZXJhdG9yKCk7CisJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOworCQlPYmplY3QgdmFsdWUgPSBudWxsOworCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisJCQlmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXQubmV4dCgpOworCQkJdmFsdWUgPSBhdHRyaWJ1dGVzLmdldChmZWF0dXJlKTsKKwkJCXNldE9iamVjdEF0dHJpYnV0ZShhbk9iamVjdCwgZmVhdHVyZSwgdmFsdWUsIGZhbHNlKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIHNldE9iamVjdEF0dHJpYnV0ZShFT2JqZWN0IGFuT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIE9iamVjdCBhVmFsdWUsIGJvb2xlYW4gc2hvdWxkVW5zZXRWYWx1ZSkgeworCQlpZiAoYUZlYXR1cmUuaXNNYW55KCkpCisJCQlzZXRPYmplY3RNYW55QXR0cmlidXRlKGFuT2JqZWN0LCBhRmVhdHVyZSwgYVZhbHVlLCBzaG91bGRVbnNldFZhbHVlKTsKKwkJZWxzZQorCQkJc2V0T2JqZWN0U2luZ2xlQXR0cmlidXRlKGFuT2JqZWN0LCBhRmVhdHVyZSwgYVZhbHVlLCBzaG91bGRVbnNldFZhbHVlKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRPYmplY3RFbnVtQXR0cmlidXRlKEVPYmplY3QgYW5PYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgT2JqZWN0IGFWYWx1ZSkgeworCQlFbnVtZXJhdG9yIGVudW1lcmF0b3IgPSBnZXRFbnVtZXJhdG9yKGFGZWF0dXJlLCBhVmFsdWUpOworCQlhbk9iamVjdC5lU2V0KGFGZWF0dXJlLCBlbnVtZXJhdG9yKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRPYmplY3RNYW55QXR0cmlidXRlKEVPYmplY3QgYW5PYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgT2JqZWN0IGFWYWx1ZSwgYm9vbGVhbiBzaG91bGRVbnNldFZhbHVlKSB7CisJCUxpc3QgbGlzdCA9IChMaXN0KSBhbk9iamVjdC5lR2V0KGFGZWF0dXJlKTsKKwkJaWYgKHNob3VsZFVuc2V0VmFsdWUpCisJCQlsaXN0LnJlbW92ZShhVmFsdWUpOworCQllbHNlCisJCQlsaXN0LmFkZChhVmFsdWUpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldE9iamVjdFNpbmdsZUF0dHJpYnV0ZShFT2JqZWN0IGFuT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIE9iamVjdCBhVmFsdWUsIGJvb2xlYW4gc2hvdWxkVW5zZXRWYWx1ZSkgeworCQlpZiAoc2hvdWxkVW5zZXRWYWx1ZSkKKwkJCWFuT2JqZWN0LmVVbnNldChhRmVhdHVyZSk7CisJCWVsc2UgaWYgKGFGZWF0dXJlLmdldEVUeXBlKCkgaW5zdGFuY2VvZiBFRW51bSkKKwkJCXNldE9iamVjdEVudW1BdHRyaWJ1dGUoYW5PYmplY3QsIGFGZWF0dXJlLCBhVmFsdWUpOworCQllbHNlCisJCQlhbk9iamVjdC5lU2V0KGFGZWF0dXJlLCBhVmFsdWUpOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIHNpbmdsZVZhbHVlQ2hhbmdlZChFT2JqZWN0IGFuT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIE9iamVjdCBhVmFsdWUsIGJvb2xlYW4gaXNVbnNldCkgeworCQlpZiAoYUZlYXR1cmUuZ2V0RVR5cGUoKSBpbnN0YW5jZW9mIEVFbnVtKQorCQkJcmV0dXJuIGVudW1WYWx1ZUNoYW5nZWQoYW5PYmplY3QsIGFGZWF0dXJlLCBhVmFsdWUpOworCisJCU9iamVjdCBleGlzdGluZ1ZhbHVlID0gYW5PYmplY3QuZUdldChhRmVhdHVyZSk7CisJCWlmIChleGlzdGluZ1ZhbHVlID09IG51bGwgJiYgYVZhbHVlID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChleGlzdGluZ1ZhbHVlICE9IG51bGwgJiYgIWV4aXN0aW5nVmFsdWUuZXF1YWxzKGFWYWx1ZSkpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJaWYgKGFWYWx1ZSAhPSBudWxsICYmICFhVmFsdWUuZXF1YWxzKGV4aXN0aW5nVmFsdWUpKQorCQkJcmV0dXJuIHRydWU7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiB2YWx1ZUNoYW5nZWQoRU9iamVjdCBhbk9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBPYmplY3QgYVZhbHVlLCBib29sZWFuIGlzVW5zZXQpIHsKKwkJaWYgKGFGZWF0dXJlLmlzTWFueSgpKQorCQkJcmV0dXJuIG1hbnlWYWx1ZUNoYW5nZWQoYW5PYmplY3QsIGFGZWF0dXJlLCBhVmFsdWUsIGlzVW5zZXQpOworCQlyZXR1cm4gc2luZ2xlVmFsdWVDaGFuZ2VkKGFuT2JqZWN0LCBhRmVhdHVyZSwgYVZhbHVlLCBpc1Vuc2V0KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Nb2RpZmllckhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vTW9kaWZpZXJIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDk0OWIzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vTW9kaWZpZXJIZWxwZXIuamF2YQpAQCAtMCwwICsxLDM2MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247CisKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FQ2xhc3NJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuU2V0Q29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5GZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5GZWF0dXJlVmFsdWVDb252ZXJ0ZXI7CisKKy8qKgorICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvNi8yMDAxIDM6MjM6MzYgUE0pCisgKiAKKyAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKKyAqLworcHVibGljIGNsYXNzIE1vZGlmaWVySGVscGVyIHsKKworCXByaXZhdGUgRU9iamVjdCBvd25lcjsKKwlwcml2YXRlIE1vZGlmaWVySGVscGVyIG93bmVySGVscGVyOworCXByaXZhdGUgT3duZXJQcm92aWRlciBvd25lclByb3ZpZGVyOworCXByaXZhdGUgT2JqZWN0IHZhbHVlOworCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7CisJcHJpdmF0ZSBIYXNoTWFwIGF0dHJpYnV0ZXM7CisJcHJpdmF0ZSBib29sZWFuIHNob3VsZFVuc2V0VmFsdWUgPSBmYWxzZTsKKwlwcml2YXRlIFN0cmluZyB2YWx1ZVhTSVR5cGVOYW1lOworCXByaXZhdGUgRmVhdHVyZVZhbHVlQ29udmVydGVyIGZlYXR1cmVWYWx1ZUNvbnZlcnRlcjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9TRVQgPSAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9VTlNFVCA9IDE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX0JPVEggPSAyOworCisJLyoqCisJICogSjJFRU1vZGlmaWVySGVscGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICovCisJcHVibGljIE1vZGlmaWVySGVscGVyKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIEoyRUVNb2RpZmllckhlbHBlciBjb25zdHJ1Y3RvciBjb21tZW50LgorCSAqLworCXB1YmxpYyBNb2RpZmllckhlbHBlcihFT2JqZWN0IGFuT3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgT2JqZWN0IGFWYWx1ZSkgeworCQlzZXRPd25lcihhbk93bmVyKTsKKwkJc2V0RmVhdHVyZShhRmVhdHVyZSk7CisJCXNldFZhbHVlKGFWYWx1ZSk7CisJfQorCisJLyoqCisJICogSjJFRU1vZGlmaWVySGVscGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICovCisJcHVibGljIE1vZGlmaWVySGVscGVyKE1vZGlmaWVySGVscGVyIGFuT3duZXJIZWxwZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgT2JqZWN0IGFWYWx1ZSkgeworCQlzZXRPd25lckhlbHBlcihhbk93bmVySGVscGVyKTsKKwkJc2V0RmVhdHVyZShhRmVhdHVyZSk7CisJCXNldFZhbHVlKGFWYWx1ZSk7CisJfQorCisJLyoqCisJICogSjJFRU1vZGlmaWVySGVscGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCisJICovCisJcHVibGljIE1vZGlmaWVySGVscGVyKE93bmVyUHJvdmlkZXIgYW5Pd25lclByb3ZpZGVyLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIE9iamVjdCBhVmFsdWUpIHsKKwkJc2V0T3duZXJQcm92aWRlcihhbk93bmVyUHJvdmlkZXIpOworCQlzZXRGZWF0dXJlKGFGZWF0dXJlKTsKKwkJc2V0VmFsdWUoYVZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzYvMjAwMSAzOjI4OjE2IFBNKQorCSAqIAorCSAqIEByZXR1cm4gamF2YS51dGlsLkhhc2hNYXAKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGUoRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlLCBPYmplY3QgYVZhbHVlKSB7CisJCWlmIChhRmVhdHVyZSAhPSBudWxsICYmIGFWYWx1ZSAhPSBudWxsKQorCQkJZ2V0QXR0cmlidXRlcygpLnB1dChhRmVhdHVyZSwgYVZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzYvMjAwMSAzOjI4OjE2IFBNKQorCSAqIAorCSAqIEBwYXJhbSBuZXdWYWx1ZQorCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdAorCSAqLworCXByb3RlY3RlZCBPYmplY3QgY29udmVydFZhbHVlKGphdmEubGFuZy5PYmplY3QgbmV3VmFsdWUpIHsKKwkJcmV0dXJuIGdldEZlYXR1cmVWYWx1ZUNvbnZlcnRlcigpLmNvbnZlcnRWYWx1ZShuZXdWYWx1ZSwgZ2V0RmVhdHVyZSgpKTsKKwl9CisKKwkvL0NhbGxpbmcgdGhpcyB3aWxsIGNhdXNlIHRoZSB2YWx1ZSB0byBiZSByZW1vdmVkIG9yIHVuc2V0IGZyb20gdGhlIG93bmVyLgorCXB1YmxpYyB2b2lkIGRvVW5zZXRWYWx1ZSgpIHsKKwkJc2hvdWxkVW5zZXRWYWx1ZSA9IHRydWU7CisJCWlmICh2YWx1ZSAhPSBTZXRDb21tYW5kLlVOU0VUX1ZBTFVFICYmIGZlYXR1cmUgIT0gbnVsbCAmJiAhZmVhdHVyZS5pc01hbnkoKSkKKwkJCXByaW1TZXRWYWx1ZShTZXRDb21tYW5kLlVOU0VUX1ZBTFVFKTsKKwl9CisKKwkvKioKKwkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzYvMjAwMSAzOjI4OjE2IFBNKQorCSAqIAorCSAqIEByZXR1cm4gamF2YS51dGlsLkhhc2hNYXAKKwkgKi8KKwlwdWJsaWMgamF2YS51dGlsLkhhc2hNYXAgZ2V0QXR0cmlidXRlcygpIHsKKwkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkKKwkJCWF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOworCQlyZXR1cm4gYXR0cmlidXRlczsKKwl9CisKKwkvKioKKwkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzYvMjAwMSAzOjI4OjE2IFBNKQorCSAqIAorCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5CisJICovCisJcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeSBnZXRGYWN0b3J5KCkgeworCQlyZXR1cm4gZ2V0UGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKTsKKwl9CisKKwlwcm90ZWN0ZWQgRVBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKKwkJcmV0dXJuICgoRUNsYXNzSW1wbCkgZ2V0RmVhdHVyZVR5cGUoKSkuZ2V0RVBhY2thZ2UoKTsKKwl9CisKKwkvKioKKwkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzYvMjAwMSAzOjI4OjE2IFBNKQorCSAqIAorCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZQorCSAqLworCXB1YmxpYyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmUoKSB7CisJCXJldHVybiBmZWF0dXJlOworCX0KKworCS8qKgorCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvNi8yMDAxIDM6Mjg6MTYgUE0pCisJICogCisJICogQHJldHVybiBFT2JqZWN0CisJICovCisJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RmVhdHVyZVR5cGUoKSB7CisJCXJldHVybiBnZXRGZWF0dXJlKCkuZ2V0RVR5cGUoKTsKKwl9CisKKwkvKioKKwkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg1LzEwLzIwMDEgNDo1MTo1OCBQTSkKKwkgKiAKKwkgKiBAcmV0dXJuIGNvbS5pYm0uZXRvb2xzLmoyZWUuY29tbWFuZHMuRmVhdHVyZVZhbHVlQ29udmVydGVyCisJICovCisJcHVibGljIEZlYXR1cmVWYWx1ZUNvbnZlcnRlciBnZXRGZWF0dXJlVmFsdWVDb252ZXJ0ZXIoKSB7CisJCWlmIChmZWF0dXJlVmFsdWVDb252ZXJ0ZXIgPT0gbnVsbCkKKwkJCWZlYXR1cmVWYWx1ZUNvbnZlcnRlciA9IEZlYXR1cmVWYWx1ZUNvbnZlcnRlci5ERUZBVUxUOworCQlyZXR1cm4gZmVhdHVyZVZhbHVlQ29udmVydGVyOworCX0KKworCS8qKgorCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvNi8yMDAxIDM6Mjg6MTYgUE0pCisJICogCisJICogQHJldHVybiBTdHJpbmcKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldE5ld1ZhbHVlVHlwZU5hbWUoKSB7CisJCWlmIChnZXRWYWx1ZVhTSVR5cGVOYW1lKCkgIT0gbnVsbCAmJiBnZXRWYWx1ZVhTSVR5cGVOYW1lKCkubGVuZ3RoKCkgPiAwKQorCQkJcmV0dXJuIGdldFZhbHVlWFNJVHlwZU5hbWUoKTsKKwkJcmV0dXJuICgoKEVDbGFzcykgZ2V0RmVhdHVyZVR5cGUoKSkuZ2V0TmFtZSgpKTsKKwl9CisKKwkvKioKKwkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzYvMjAwMSAzOjI4OjE2IFBNKQorCSAqIAorCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QKKwkgKi8KKwlwdWJsaWMgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QgZ2V0T3duZXIoKSB7CisJCWlmIChvd25lciA9PSBudWxsKSB7CisJCQlPd25lclByb3ZpZGVyIHByb3ZpZGVyID0gZ2V0T3duZXJQcm92aWRlcigpOworCQkJRU9iamVjdCBwcm92aWRlck93bmVyID0gbnVsbDsKKwkJCWlmIChwcm92aWRlciAhPSBudWxsKQorCQkJCXByb3ZpZGVyT3duZXIgPSBwcm92aWRlci5nZXRPd25lcigpOworCQkJaWYgKHByb3ZpZGVyT3duZXIgPT0gbnVsbCAmJiBnZXRPd25lckhlbHBlcigpICE9IG51bGwpCisJCQkJcHJvdmlkZXJPd25lciA9IChFT2JqZWN0KSBnZXRPd25lckhlbHBlcigpLmdldFZhbHVlKCk7CisJCQlyZXR1cm4gcHJvdmlkZXJPd25lcjsKKwkJfQorCQlyZXR1cm4gb3duZXI7CisJfQorCisJLyoqCisJICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC84LzIwMDEgMjo0Nzo1NCBQTSkKKwkgKiAKKwkgKiBAcmV0dXJuIGNvbS5pYm0uZXRvb2xzLmoyZWUuY29tbWFuZHMuSjJFRU1vZGlmaWVySGVscGVyCisJICovCisJcHVibGljIE1vZGlmaWVySGVscGVyIGdldE93bmVySGVscGVyKCkgeworCQlpZiAob3duZXJIZWxwZXIgPT0gbnVsbCkgeworCQkJaWYgKGdldE93bmVyUHJvdmlkZXIoKSAhPSBudWxsICYmIGdldE93bmVyUHJvdmlkZXIoKS5nZXRPd25lcigpID09IG51bGwpCisJCQkJcmV0dXJuIGdldE93bmVyUHJvdmlkZXIoKS5nZXRPd25lckhlbHBlcigpOworCQl9CisJCXJldHVybiBvd25lckhlbHBlcjsKKwl9CisKKwlwdWJsaWMgTW9kaWZpZXJIZWxwZXIgcHJpbUdldE93bmVySGVscGVyKCkgeworCQlyZXR1cm4gb3duZXJIZWxwZXI7CisJfQorCisJLyoqCisJICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoOS8xOC8yMDAxIDE6MzE6MTQgUE0pCisJICogCisJICogQHJldHVybiBjb20uaWJtLmV0b29scy5qMmVlLnVpLkoyRUVPd25lclByb3ZpZGVyCisJICovCisJcHVibGljIE93bmVyUHJvdmlkZXIgZ2V0T3duZXJQcm92aWRlcigpIHsKKwkJcmV0dXJuIG93bmVyUHJvdmlkZXI7CisJfQorCisJLyoqCisJICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC82LzIwMDEgMzoyODoxNiBQTSkKKwkgKiAKKwkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKKwkgKi8KKwlwdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvMTAvMjAwMSAzOjM5OjMxIFBNKQorCSAqIAorCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZworCSAqLworCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFZhbHVlWFNJVHlwZU5hbWUoKSB7CisJCXJldHVybiB2YWx1ZVhTSVR5cGVOYW1lOworCX0KKworCS8qKgorCSAqIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGdldCBjYWxsZWQgZnJvbSB0aGUgSjJFRU1vZGVsTW9kaWZpZXIgYmVmb3JlIGV4ZWN1dGluZyBzbyBpdCBpcyBub3QKKwkgKiBuZWNlc3NhcnkgdG8gY2FsbCBpdCBkaXJlY3RseS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgeworCQlib29sZWFuIHJlc3VsdCA9IHRydWU7CisJCWlmIChnZXRPd25lckhlbHBlcigpICE9IG51bGwpCisJCQlyZXN1bHQgPSBnZXRPd25lckhlbHBlcigpLmlzQ29tcGxldGUoKTsKKwkJaWYgKCFtdXN0Q3JlYXRlVmFsdWUoKSkKKwkJCXJlc3VsdCA9IGdldFZhbHVlKCkgIT0gbnVsbCB8fCBzaG91bGRVbnNldFZhbHVlKCk7CisJCWVsc2UKKwkJCXJlc3VsdCA9IGdldEZlYXR1cmVUeXBlKCkgIT0gbnVsbDsKKwkJcmV0dXJuIHJlc3VsdCAmJiBnZXRGZWF0dXJlKCkgIT0gbnVsbCAmJiAoZ2V0T3duZXIoKSAhPSBudWxsIHx8IGdldE93bmVySGVscGVyKCkgIT0gbnVsbCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gbXVzdENyZWF0ZVZhbHVlKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoKSA9PSBudWxsICYmIGdldEZlYXR1cmUoKSAhPSBudWxsICYmICFzaG91bGRVbnNldFZhbHVlKCk7CisJfQorCisJLyoqCisJICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC82LzIwMDEgMzoyODoxNiBQTSkKKwkgKiAKKwkgKiBAcGFyYW0gbmV3VmFsdWUKKwkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QKKwkgKi8KKwlwdWJsaWMgdm9pZCBwcmltU2V0VmFsdWUoamF2YS5sYW5nLk9iamVjdCBuZXdWYWx1ZSkgeworCQl2YWx1ZSA9IG5ld1ZhbHVlOworCX0KKworCS8qKgorCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvNi8yMDAxIDM6Mjg6MTYgUE0pCisJICogCisJICogQHBhcmFtIG5ld0ZlYXR1cmUKKwkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUgbmV3RmVhdHVyZSkgeworCQlmZWF0dXJlID0gbmV3RmVhdHVyZTsKKwl9CisKKwkvKioKKwkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg1LzEwLzIwMDEgNDo1MTo1OCBQTSkKKwkgKiAKKwkgKiBAcGFyYW0gbmV3RmVhdHVyZVZhbHVlQ29udmVydGVyCisJICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5qMmVlLmNvbW1hbmRzLkZlYXR1cmVWYWx1ZUNvbnZlcnRlcgorCSAqLworCXB1YmxpYyB2b2lkIHNldEZlYXR1cmVWYWx1ZUNvbnZlcnRlcihGZWF0dXJlVmFsdWVDb252ZXJ0ZXIgbmV3RmVhdHVyZVZhbHVlQ29udmVydGVyKSB7CisJCWZlYXR1cmVWYWx1ZUNvbnZlcnRlciA9IG5ld0ZlYXR1cmVWYWx1ZUNvbnZlcnRlcjsKKwl9CisKKwkvKioKKwkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzYvMjAwMSAzOjI4OjE2IFBNKQorCSAqIAorCSAqIEBwYXJhbSBuZXdPd25lcgorCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRPd25lcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCBuZXdPd25lcikgeworCQlvd25lciA9IG5ld093bmVyOworCX0KKworCS8qKgorCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvOC8yMDAxIDI6NDc6NTQgUE0pCisJICogCisJICogQHBhcmFtIG5ld093bmVySGVscGVyCisJICogICAgICAgICAgICBjb20uaWJtLmV0b29scy5qMmVlLmNvbW1hbmRzLkoyRUVNb2RpZmllckhlbHBlcgorCSAqLworCXB1YmxpYyB2b2lkIHNldE93bmVySGVscGVyKE1vZGlmaWVySGVscGVyIG5ld093bmVySGVscGVyKSB7CisJCW93bmVySGVscGVyID0gbmV3T3duZXJIZWxwZXI7CisJfQorCisJLyoqCisJICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoOS8xOC8yMDAxIDE6MzE6MTQgUE0pCisJICogCisJICogQHBhcmFtIG5ld093bmVyUHJvdmlkZXIKKwkgKiAgICAgICAgICAgIGNvbS5pYm0uZXRvb2xzLmoyZWUudWkuSjJFRU93bmVyUHJvdmlkZXIKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRPd25lclByb3ZpZGVyKE93bmVyUHJvdmlkZXIgbmV3T3duZXJQcm92aWRlcikgeworCQlvd25lclByb3ZpZGVyID0gbmV3T3duZXJQcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzYvMjAwMSAzOjI4OjE2IFBNKQorCSAqIAorCSAqIEBwYXJhbSBuZXdWYWx1ZQorCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdAorCSAqLworCXB1YmxpYyB2b2lkIHNldFZhbHVlKGphdmEubGFuZy5PYmplY3QgbmV3VmFsdWUpIHsKKwkJdHJ5IHsKKwkJCXByaW1TZXRWYWx1ZShjb252ZXJ0VmFsdWUobmV3VmFsdWUpKTsKKwkJfSBjYXRjaCAoRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbiBmZWF0dXJlRXhjZXB0aW9uKSB7CisJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZmVhdHVyZUV4Y2VwdGlvbik7CisJCQlwcmltU2V0VmFsdWUobnVsbCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUcmVhdCBhbiBlbXB0eSBTdHJpbmcgYXMgYSBudWxsIHZhbHVlLiBDcmVhdGlvbiBkYXRlOiAoNC82LzIwMDEgMzoyODoxNiBQTSkKKwkgKiAKKwkgKiBAcGFyYW0gbmV3VmFsdWUKKwkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZUZyb21XaWRnZXQoU3RyaW5nIG5ld1ZhbHVlKSB7CisJCU9iamVjdCBkYXRhID0gbmV3VmFsdWU7CisJCWlmIChuZXdWYWx1ZSAhPSBudWxsICYmIG5ld1ZhbHVlLmxlbmd0aCgpID09IDApCisJCQlkYXRhID0gbnVsbDsKKwkJc2V0VmFsdWUoZGF0YSk7CisJCWlmIChkYXRhID09IG51bGwpCisJCQlkb1Vuc2V0VmFsdWUoKTsKKwkJZWxzZQorCQkJc2hvdWxkVW5zZXRWYWx1ZSA9IGZhbHNlOworCX0KKworCS8qKgorCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvMTAvMjAwMSAzOjM5OjMxIFBNKQorCSAqIAorCSAqIEBwYXJhbSBuZXdWYWx1ZVhTSVR5cGVOYW1lCisJICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCisJICovCisJcHVibGljIHZvaWQgc2V0VmFsdWVYU0lUeXBlTmFtZShqYXZhLmxhbmcuU3RyaW5nIG5ld1ZhbHVlWFNJVHlwZU5hbWUpIHsKKwkJdmFsdWVYU0lUeXBlTmFtZSA9IG5ld1ZhbHVlWFNJVHlwZU5hbWU7CisJfQorCisJcHVibGljIGJvb2xlYW4gc2hvdWxkVW5zZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHNob3VsZFVuc2V0VmFsdWU7CisJfQorCisJcHVibGljIEVPYmplY3QgY3JlYXRlTmV3T2JqZWN0RnJvbUZlYXR1cmUoKSB7CisJCUVDbGFzcyBtZXRhQ2xhc3MgPSAoRUNsYXNzKSBnZXRQYWNrYWdlKCkuZ2V0RUNsYXNzaWZpZXIoZ2V0TmV3VmFsdWVUeXBlTmFtZSgpKTsKKwkJcmV0dXJuIGdldEZhY3RvcnkoKS5jcmVhdGUobWV0YUNsYXNzKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Nb2RpZmllckhlbHBlckNoYWluZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL01vZGlmaWVySGVscGVyQ2hhaW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNjE0OGQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Nb2RpZmllckhlbHBlckNoYWluZXIuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworCisKKworLyoqCisgKiBAdmVyc2lvbiAxLjAKKyAqIEBhdXRob3IKKyAqLworcHVibGljIGNsYXNzIE1vZGlmaWVySGVscGVyQ2hhaW5lciB7CisKKwlNb2RpZmllckhlbHBlciBoZWxwZXI7CisKKwlwdWJsaWMgTW9kaWZpZXJIZWxwZXJDaGFpbmVyKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBFT2JqZWN0IG93bmVyLCBPYmplY3QgdmFsdWUpIHsKKwkJaGVscGVyID0gbmV3IE1vZGlmaWVySGVscGVyKCk7CisKKwkJaWYgKG93bmVyICE9IG51bGwpCisJCQloZWxwZXIuc2V0T3duZXIob3duZXIpOworCisJCWhlbHBlci5zZXRGZWF0dXJlKGZlYXR1cmUpOworCisJCWlmICh2YWx1ZSAhPSBudWxsKQorCQkJaGVscGVyLnNldFZhbHVlKHZhbHVlKTsKKworCX0KKworCXB1YmxpYyBNb2RpZmllckhlbHBlciBnZXRIZWxwZXIoKSB7CisJCXJldHVybiBoZWxwZXI7CisJfQorCisJcHVibGljIHZvaWQgc2V0T3duZXJCYXNlZE9uVHlwZShPYmplY3Qgb3duZXIpIHsKKwkJaWYgKG93bmVyIGluc3RhbmNlb2YgRU9iamVjdCkKKwkJCWhlbHBlci5zZXRPd25lcigoRU9iamVjdCkgb3duZXIpOworCQllbHNlIGlmIChvd25lciBpbnN0YW5jZW9mIE1vZGlmaWVySGVscGVyKQorCQkJaGVscGVyLnNldE93bmVySGVscGVyKChNb2RpZmllckhlbHBlcikgb3duZXIpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Nb2RpZmllckhlbHBlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL01vZGlmaWVySGVscGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNDFhNjIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Nb2RpZmllckhlbHBlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBDcmVhdGVkIG9uIEFwciAyNywgMjAwNAorICoKKyAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KKyAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247CisKKy8qKgorICogQGF1dGhvciBqc2hvbGwKKyAqIAorICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKKyAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cworICovCitwdWJsaWMgaW50ZXJmYWNlIE1vZGlmaWVySGVscGVyRmFjdG9yeSB7CisKKworCS8qKgorCSAqIEBwYXJhbSBiYXNlSGVscGVyCisJICogQHBhcmFtIGFjdGlvbkZsYWcKKwkgKiBAcmV0dXJuCisJICovCisJTW9kaWZpZXJIZWxwZXIgZ2V0SGVscGVyKE1vZGlmaWVySGVscGVyIGJhc2VIZWxwZXIsIGludCBhY3Rpb25GbGFnKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Nb2RpZmllckhlbHBlclJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Nb2RpZmllckhlbHBlclJlZ2lzdHJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFkYThhZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL01vZGlmaWVySGVscGVyUmVnaXN0cnkuamF2YQpAQCAtMCwwICsxLDI3MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBDcmVhdGVkIG9uIEFwciAyNywgMjAwNAorICogCisgKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0KKyAqIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cworICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7CisKKy8qKgorICogQGF1dGhvciBqc2hvbGwKKyAqICAKKyAqLworcHVibGljIGNsYXNzIE1vZGlmaWVySGVscGVyUmVnaXN0cnkgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24iOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVCA9ICJNb2RpZmllckhlbHBlckZhY3RvcnkiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZBQ1RPUllfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0UgPSAicGFja2FnZSI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9VUkkgPSAidXJpIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEUgPSAidHlwZSI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRSA9ICJmZWF0dXJlIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX0FDVElPTiA9ICJhY3Rpb24iOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfQUNUSU9OX1NFVCA9ICJzZXQiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfQUNUSU9OX1VOU0VUID0gInVuc2V0IjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX0FDVElPTl9CT1RIID0gImJvdGgiOyAvL2RlZmF1bHQgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIE1vZGlmaWVySGVscGVyUmVnaXN0cnkgSU5TVEFOQ0UgPSBudWxsOworCS8vIEhhc2h0YWJsZSBtYXBwaW5nIGZlYXR1cmVzIHRvIGEgbGlzdCBvZiBGYWN0b3J5SG9sZGVycworCXByaXZhdGUgSGFzaHRhYmxlIGZlYXR1cmVIYXNoID0gbmV3IEhhc2h0YWJsZSgpOworCXByaXZhdGUgSGFzaHRhYmxlIGZhY3RvcnlIYXNoID0gbmV3IEhhc2h0YWJsZSgpOworCisJcHJpdmF0ZSBjbGFzcyBGYWN0b3J5SG9sZGVyIHsKKwkJcHJpdmF0ZSBpbnQgYWN0aW9uVHlwZTsKKwkJcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKKworCQlwdWJsaWMgRmFjdG9yeUhvbGRlcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgaW50IGFjdGlvblR5cGUpIHsKKwkJCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7CisJCQl0aGlzLmFjdGlvblR5cGUgPSBhY3Rpb25UeXBlOworCQl9CisKKwkJcHVibGljIE1vZGlmaWVySGVscGVyRmFjdG9yeSBnZXRGYWN0b3J5KGludCBhY3Rpb25UeXBlQXJnKSB7CisJCQlpZiAodGhpcy5hY3Rpb25UeXBlID09IGFjdGlvblR5cGVBcmcgfHwgdGhpcy5hY3Rpb25UeXBlID09IE1vZGlmaWVySGVscGVyLkFDVElPTl9CT1RIKSB7CisJCQkJU3RyaW5nIGhhc2hLZXkgPSBnZXRGYWN0b3J5SGFzaChlbGVtZW50KTsKKwkJCQlNb2RpZmllckhlbHBlckZhY3RvcnkgZmFjdG9yeSA9IChNb2RpZmllckhlbHBlckZhY3RvcnkpIGZhY3RvcnlIYXNoLmdldChoYXNoS2V5KTsKKwkJCQlpZiAobnVsbCA9PSBmYWN0b3J5KSB7CisJCQkJCXRyeSB7CisJCQkJCQlmYWN0b3J5ID0gKE1vZGlmaWVySGVscGVyRmFjdG9yeSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEZBQ1RPUllfQ0xBU1MpOworCQkJCQkJZmFjdG9yeUhhc2gucHV0KGhhc2hLZXksIGZhY3RvcnkpOworCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlyZXR1cm4gZmFjdG9yeTsKKwkJCX0KKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKwkJCWlmIChzdXBlci5lcXVhbHMob2JqKSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQkJRmFjdG9yeUhvbGRlciBob2xkZXIgPSAoRmFjdG9yeUhvbGRlcikgb2JqOworCQkJcmV0dXJuIGdldEZhY3RvcnlIYXNoKGVsZW1lbnQpLmVxdWFscyhnZXRGYWN0b3J5SGFzaChob2xkZXIuZWxlbWVudCkpOworCQl9CisJfQorCisJcHJpdmF0ZSBNb2RpZmllckhlbHBlclJlZ2lzdHJ5KCkgeworCQlyZWFkRXh0ZW5zaW9ucygpOworCX0KKworCXByaXZhdGUgdm9pZCByZWFkRXh0ZW5zaW9ucygpIHsKKwkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludChQTFVHSU5fSUQsIEVYVEVOU0lPTl9QT0lOVCk7CisJCWlmIChwb2ludCA9PSBudWxsKQorCQkJcmV0dXJuOworCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CisJCQlyZWFkRmFjdG9yeShlbGVtZW50c1tpXSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgcmVhZEZhY3RvcnkoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKKwkJU3RyaW5nIGZhY3RvcnlDbGFzc05hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShGQUNUT1JZX0NMQVNTKTsKKwkJaWYgKG51bGwgPT0gZmFjdG9yeUNsYXNzTmFtZSkgeworCQkJbG9nRXJyb3IoZWxlbWVudCwgIk5vICIgKyBGQUNUT1JZX0NMQVNTICsgIiBkZWZpbmVkLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJfQorCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBwYWNrYWdlcyA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oUEFDS0FHRSk7CisJCWlmIChwYWNrYWdlcy5sZW5ndGggPT0gMCkgeworCQkJbG9nRXJyb3IoZWxlbWVudCwgIk5vICIgKyBQQUNLQUdFICsgIiBkZWZpbmVkLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJfQorCQlmb3IgKGludCBqID0gMDsgaiA8IHBhY2thZ2VzLmxlbmd0aDsgaisrKSB7CisJCQlyZWFkUGFja2FnZShlbGVtZW50LCBwYWNrYWdlc1tqXSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgcmVhZFBhY2thZ2UoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGZhY3RvcnlFbGVtZW50LCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgeworCQlTdHJpbmcgcGFja2FnZVVSSSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFBBQ0tBR0VfVVJJKTsKKwkJaWYgKG51bGwgPT0gcGFja2FnZVVSSSkgeworCQkJbG9nRXJyb3IoZWxlbWVudCwgIk5vICIgKyBQQUNLQUdFX1VSSSArICIgZGVmaW5lZC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQlyZXR1cm47CisJCX0KKwkJRVBhY2thZ2UgZVBhY2thZ2UgPSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShwYWNrYWdlVVJJKTsKKwkJaWYgKG51bGwgPT0gZVBhY2thZ2UpIHsKKwkJCWxvZ0Vycm9yKGVsZW1lbnQsIFBBQ0tBR0UgKyAiICIgKyBwYWNrYWdlVVJJICsgIiBjYW4gbm90IGJlIGZvdW5kLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCXJldHVybjsKKwkJfQorCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSB0eXBlcyA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oVFlQRSk7CisJCWlmICh0eXBlcy5sZW5ndGggPT0gMCkgeworCQkJbG9nRXJyb3IoZWxlbWVudCwgIk5vICIgKyBUWVBFICsgIiBkZWZpbmVkLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJfQorCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7CisJCQlyZWFkVHlwZShmYWN0b3J5RWxlbWVudCwgZVBhY2thZ2UsIHR5cGVzW2ldKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCByZWFkVHlwZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZmFjdG9yeUVsZW1lbnQsIEVQYWNrYWdlIGVQYWNrYWdlLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgeworCQlTdHJpbmcgdHlwZU5hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShOQU1FKTsKKwkJaWYgKG51bGwgPT0gdHlwZU5hbWUpIHsKKwkJCWxvZ0Vycm9yKGVsZW1lbnQsICJObyAiICsgTkFNRSArICIgZGVmaW5lZC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQlyZXR1cm47CisJCX0KKwkJRUNsYXNzaWZpZXIgZUNsYXNzaWZpZXIgPSBlUGFja2FnZS5nZXRFQ2xhc3NpZmllcih0eXBlTmFtZSk7CisJCWlmIChudWxsID09IGVDbGFzc2lmaWVyKSB7CisJCQlsb2dFcnJvcihlbGVtZW50LCBUWVBFICsgIiAiICsgdHlwZU5hbWUgKyAiIGNhbiBub3QgYmUgZm91bmQgaW4gIiArIFBBQ0tBR0UgKyAiICIgKyBlUGFja2FnZS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJcmV0dXJuOworCQl9CisJCUVDbGFzcyBlQ2xhc3MgPSAoRUNsYXNzKSBlQ2xhc3NpZmllcjsKKwkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZmVhdHVyZXMgPSBlbGVtZW50LmdldENoaWxkcmVuKEZFQVRVUkUpOworCQlpZiAoZmVhdHVyZXMubGVuZ3RoID09IDApIHsKKwkJCWxvZ0Vycm9yKGVsZW1lbnQsICJObyAiICsgRkVBVFVSRSArICIgZGVmaW5lZC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQlyZXR1cm47CisJCX0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykgeworCQkJcmVhZEZlYXR1cmUoZmFjdG9yeUVsZW1lbnQsIGVDbGFzcywgZmVhdHVyZXNbaV0pOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHJlYWRGZWF0dXJlKElDb25maWd1cmF0aW9uRWxlbWVudCBmYWN0b3J5RWxlbWVudCwgRUNsYXNzIGVDbGFzcywgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKKwkJU3RyaW5nIGZlYXR1cmVOYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoTkFNRSk7CisJCWlmIChudWxsID09IGZlYXR1cmVOYW1lKSB7CisJCQlsb2dFcnJvcihlbGVtZW50LCAiTm8gIiArIE5BTUUgKyAiIGRlZmluZWQuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJcmV0dXJuOworCQl9CisJCVN0cmluZyBhY3Rpb24gPSBlbGVtZW50LmdldEF0dHJpYnV0ZShGRUFUVVJFX0FDVElPTik7CisJCWlmIChudWxsID09IGFjdGlvbikgeworCQkJYWN0aW9uID0gRkVBVFVSRV9BQ1RJT05fQk9USDsKKwkJfQorCQlpbnQgYWN0aW9uVHlwZSA9IC0xOworCQlpZiAoYWN0aW9uLmVxdWFsc0lnbm9yZUNhc2UoRkVBVFVSRV9BQ1RJT05fQk9USCkpIHsKKwkJCWFjdGlvblR5cGUgPSBNb2RpZmllckhlbHBlci5BQ1RJT05fQk9USDsKKwkJfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzSWdub3JlQ2FzZShGRUFUVVJFX0FDVElPTl9TRVQpKSB7CisJCQlhY3Rpb25UeXBlID0gTW9kaWZpZXJIZWxwZXIuQUNUSU9OX1NFVDsKKwkJfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzSWdub3JlQ2FzZShGRUFUVVJFX0FDVElPTl9VTlNFVCkpIHsKKwkJCWFjdGlvblR5cGUgPSBNb2RpZmllckhlbHBlci5BQ1RJT05fVU5TRVQ7CisJCX0KKwkJaWYgKGFjdGlvblR5cGUgPT0gLTEpIHsKKwkJCWxvZ0Vycm9yKGVsZW1lbnQsICJJbnZhbGlkICIgKyBGRUFUVVJFX0FDVElPTiArICI9IiArIGFjdGlvbiArICIgZGVmaW5lZC4gIFZhbGlkIHZhbHVlcyBhcmU6ICIgKyBGRUFUVVJFX0FDVElPTl9CT1RIICsgIiwgIiArIEZFQVRVUkVfQUNUSU9OX1NFVCArICIsIG9yICIgKyBGRUFUVVJFX0FDVElPTl9VTlNFVCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAorCQkJcmV0dXJuOworCQl9CisJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gbnVsbDsKKwkJRUxpc3QgYWxsRmVhdHVyZXMgPSBlQ2xhc3MuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOworCQlFU3RydWN0dXJhbEZlYXR1cmUgdGVtcEZlYXR1cmUgPSBudWxsOworCQlJdGVyYXRvciBpdGVyYXRvciA9IGFsbEZlYXR1cmVzLml0ZXJhdG9yKCk7CisJCXdoaWxlIChudWxsID09IGZlYXR1cmUgJiYgaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQl0ZW1wRmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCWlmICh0ZW1wRmVhdHVyZS5nZXROYW1lKCkuZXF1YWxzKGZlYXR1cmVOYW1lKSkgeworCQkJCWZlYXR1cmUgPSB0ZW1wRmVhdHVyZTsKKwkJCX0KKwkJfQorCQlpZiAoZmVhdHVyZSA9PSBudWxsKSB7CisJCQlsb2dFcnJvcihlbGVtZW50LCBGRUFUVVJFICsgIiAiICsgZmVhdHVyZU5hbWUgKyAiIGNhbiBub3QgYmUgZm91bmQgaW4gIiArIFRZUEUgKyAiICIgKyBlQ2xhc3MuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCXJldHVybjsKKwkJfQorCQlMaXN0IGZhY3RvcnlIb2xkZXJMaXN0ID0gKExpc3QpIGZlYXR1cmVIYXNoLmdldChmZWF0dXJlKTsKKwkJaWYgKG51bGwgPT0gZmFjdG9yeUhvbGRlckxpc3QpIHsKKwkJCWZhY3RvcnlIb2xkZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCQkJZmVhdHVyZUhhc2gucHV0KGZlYXR1cmUsIGZhY3RvcnlIb2xkZXJMaXN0KTsKKwkJfQorCQlGYWN0b3J5SG9sZGVyIGZhY3RvcnlIb2xkZXIgPSBuZXcgRmFjdG9yeUhvbGRlcihmYWN0b3J5RWxlbWVudCwgYWN0aW9uVHlwZSk7CisJCWlmIChmYWN0b3J5SG9sZGVyTGlzdC5jb250YWlucyhmYWN0b3J5SG9sZGVyKSkgeworCQkJbG9nRXJyb3IoZWxlbWVudCwgIkR1cGxpY2F0ZSIgKyBGRUFUVVJFICsgIjoiICsgZmVhdHVyZU5hbWUgKyAiIGRlZmluZWQgZm9yICIgKyBGQUNUT1JZX0NMQVNTICsgIjoiICsgZmFjdG9yeUVsZW1lbnQuZ2V0QXR0cmlidXRlKEZBQ1RPUllfQ0xBU1MpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAorCQkJcmV0dXJuOworCQl9CisJCWZhY3RvcnlIb2xkZXJMaXN0LmFkZChmYWN0b3J5SG9sZGVyKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXRGYWN0b3J5SGFzaChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZmFjdG9yeUVsZW1lbnQpIHsKKwkJcmV0dXJuIGZhY3RvcnlFbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZSgpICsgZmFjdG9yeUVsZW1lbnQuZ2V0QXR0cmlidXRlKEZBQ1RPUllfQ0xBU1MpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHRleHQpIHsKKwkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpOworCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlidWYuYXBwZW5kKCJQbHVnaW4gIiArIGV4dGVuc2lvbi5nZXROYW1lc3BhY2UoKSArICIsIGV4dGVuc2lvbiAiICsgZXh0ZW5zaW9uLmdldEV4dGVuc2lvblBvaW50VW5pcXVlSWRlbnRpZmllcigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWJ1Zi5hcHBlbmQoIlxuIiArIHRleHQpOyAvLyROT04tTkxTLTEkCisJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihidWYudG9TdHJpbmcoKSk7CisJfQorCisJcHVibGljIHN0YXRpYyBNb2RpZmllckhlbHBlclJlZ2lzdHJ5IGdldEluc3RhbmNlKCkgeworCQlpZiAobnVsbCA9PSBJTlNUQU5DRSkgeworCQkJSU5TVEFOQ0UgPSBuZXcgTW9kaWZpZXJIZWxwZXJSZWdpc3RyeSgpOworCQl9CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisKKwkvKioKKwkgKiByZXR1cm5zIGEgbGlzdCBvZiBNb2RpZmllckhlbHBlcnMKKwkgKiAKKwkgKiBAcGFyYW0gYmFzZUhlbHBlcgorCSAqIEBwYXJhbSBhY3Rpb25GbGFnCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBMaXN0IGdldEhlbHBlcnMoTW9kaWZpZXJIZWxwZXIgYmFzZUhlbHBlcikgeworCQlpbnQgYWN0aW9uRmxhZyA9IGJhc2VIZWxwZXIuc2hvdWxkVW5zZXRWYWx1ZSgpID8gTW9kaWZpZXJIZWxwZXIuQUNUSU9OX1VOU0VUIDogTW9kaWZpZXJIZWxwZXIuQUNUSU9OX1NFVDsKKwkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBiYXNlSGVscGVyLmdldEZlYXR1cmUoKTsKKwkJTGlzdCBmYWN0b3J5TGlzdCA9IGdldEZhY3RvcmllcyhmZWF0dXJlLCBhY3Rpb25GbGFnKTsKKwkJaWYgKG51bGwgPT0gZmFjdG9yeUxpc3QpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCUFycmF5TGlzdCBoZWxwZXJzID0gbmV3IEFycmF5TGlzdCgpOworCQlJdGVyYXRvciBpdCA9IGZhY3RvcnlMaXN0Lml0ZXJhdG9yKCk7CisJCU1vZGlmaWVySGVscGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKKwkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCQkJZmFjdG9yeSA9IChNb2RpZmllckhlbHBlckZhY3RvcnkpIGl0Lm5leHQoKTsKKwkJCU9iamVjdCBoZWxwZXIgPSBmYWN0b3J5LmdldEhlbHBlcihiYXNlSGVscGVyLCBhY3Rpb25GbGFnKTsKKwkJCWlmIChudWxsICE9IGhlbHBlcikgeworCQkJCWhlbHBlcnMuYWRkKGhlbHBlcik7CisJCQl9CisJCX0KKwkJcmV0dXJuIGhlbHBlcnM7CisJfQorCisJcHJpdmF0ZSBMaXN0IGdldEZhY3RvcmllcyhFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgaW50IGFjdGlvbkZsYWcpIHsKKwkJTGlzdCBmYWN0b3J5SG9sZGVyTGlzdCA9IChMaXN0KSBmZWF0dXJlSGFzaC5nZXQoZmVhdHVyZSk7CisJCWlmIChudWxsID09IGZhY3RvcnlIb2xkZXJMaXN0KSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlMaXN0IGZhY3RvcnlMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCQlNb2RpZmllckhlbHBlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZmFjdG9yeUhvbGRlckxpc3Quc2l6ZSgpOyBpKyspIHsKKwkJCWZhY3RvcnkgPSAoKEZhY3RvcnlIb2xkZXIpIGZhY3RvcnlIb2xkZXJMaXN0LmdldChpKSkuZ2V0RmFjdG9yeShhY3Rpb25GbGFnKTsKKwkJCWlmIChudWxsICE9IGZhY3RvcnkpIHsKKwkJCQlmYWN0b3J5TGlzdC5hZGQoZmFjdG9yeSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhY3RvcnlMaXN0OworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL093bmVyUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL093bmVyUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDgyNDM5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vT3duZXJQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworCisKKy8qKgorICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDYvMjAvMjAwMSAxMDoyNDo0NiBQTSkKKyAqIAorICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgorICovCitwdWJsaWMgaW50ZXJmYWNlIE93bmVyUHJvdmlkZXIgeworCS8qKgorCSAqIFJldHVybiB0aGUgRU9iamVjdCB0aGF0IHdpbGwgc2VydmUgYXMgdGhlIG93bmVyIG9mIGEgZ2l2ZW4gSjJFRU1vZGlmaWVySGVscGVyLgorCSAqLworCUVPYmplY3QgZ2V0T3duZXIoKTsKKworCS8qKgorCSAqIFJldHVybiBhIEoyRUVNb2RpZmllckhlbHBlciBmb3IgdGhlIG93bmVyIGlmIHRoZSBvd25lciBkb2VzIG5vdCB5ZXQgZXhpc3QuCisJICovCisJTW9kaWZpZXJIZWxwZXIgZ2V0T3duZXJIZWxwZXIoKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9Qcm9qZWN0UmVzb3VyY2VTZXRFZGl0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vUHJvamVjdFJlc291cmNlU2V0RWRpdEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2EzMjZlCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvaW50ZWdyYXRpb24vUHJvamVjdFJlc291cmNlU2V0RWRpdEltcGwuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIENyZWF0ZWQgb24gTWFyIDQsIDIwMDQKKyAqCisgKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCisgKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLkNvbnRlbnRIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RSZXNvdXJjZVNldEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVmZXJlbmNlZFJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOworCisvKioKKyAqIEBhdXRob3Igc2NoYWNoZXIKKyAqIAorICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCisgKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKKyAqLworcHVibGljIGNsYXNzIFByb2plY3RSZXNvdXJjZVNldEVkaXRJbXBsIGV4dGVuZHMgUHJvamVjdFJlc291cmNlU2V0SW1wbCB7CisKKwkvKioKKwkgKiBAcGFyYW0gYVByb2plY3QKKwkgKi8KKwlwdWJsaWMgUHJvamVjdFJlc291cmNlU2V0RWRpdEltcGwoSVByb2plY3QgYVByb2plY3QpIHsKKwkJc3VwZXIoYVByb2plY3QpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXRJbXBsI2NyZWF0ZVJlc291cmNlKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpCisJICovCisJcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFN0cmluZyBjb250ZW50VHlwZSkgeworCQlSZXNvdXJjZSByZXN1bHQgPSBzdXBlci5jcmVhdGVSZXNvdXJjZSh1cmksIGNvbnRlbnRUeXBlKTsKKwkJaWYgKHJlc3VsdCAhPSBudWxsICYmIFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmlzUmVmZXJlbmNlZFJlc291cmNlKHJlc3VsdCkpCisJCQlXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5jYWNoZVN5bmNocm9uaXphdGlvblN0YW1wKChSZWZlcmVuY2VkUmVzb3VyY2UpIHJlc3VsdCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKKwkJcmV0dXJuIGNyZWF0ZVJlc291cmNlKHVyaSwgQ29udGVudEhhbmRsZXIuVU5TUEVDSUZJRURfQ09OVEVOVF9UWVBFKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9SZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL2ludGVncmF0aW9uL1Jlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MThhZmUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC9pbnRlZ3JhdGlvbi9SZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIuamF2YQpAQCAtMCwwICsxLDYwOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBDcmVhdGVkIG9uIE1hciA0LCAyMDA0CisgKgorICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bworICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JTG9jazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnV0aWwuZW1mLndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RSZXNvdXJjZVNldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVmZXJlbmNlZFJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOworCisvKioKKyAqIEBhdXRob3Igc2NoYWNoZXIKKyAqIAorICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCisgKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplciBleHRlbmRzIFJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyIGltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfRVhURU5TSU9OID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0VYVEVOU0lPTiA9ICJqYXZhIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0FSQ0hJVkUgPSAiamFyIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgU2V0IHJlY2VudGx5U2F2ZWRGaWxlcyA9IG5ldyBIYXNoU2V0KCk7CisJcHJpdmF0ZSBNYXAgaWdub3JlZEZpbGVzQ2FjaGUgPSBuZXcgSGFzaE1hcCgpOworCXByaXZhdGUgY2xhc3MgU2F2ZWRGaWxlS2V5IHsKKwkJcHJpdmF0ZSBXZWFrUmVmZXJlbmNlIHJlczsKKwkJcHJpdmF0ZSBJRmlsZSBzYXZlZEZpbGU7CisJCXB1YmxpYyBTYXZlZEZpbGVLZXkoUmVzb3VyY2UgcmVzLCBJRmlsZSBzYXZlZEZpbGUpIHsKKwkJCXN1cGVyKCk7CisJCQl0aGlzLnJlcyA9IG5ldyBXZWFrUmVmZXJlbmNlKHJlcyk7CisJCQl0aGlzLnNhdmVkRmlsZSA9IHNhdmVkRmlsZTsKKwkJfQorCQlwdWJsaWMgUmVzb3VyY2UgZ2V0UmVzKCkgeworCQkJcmV0dXJuIHRoaXMucmVzID09IG51bGwgPyBudWxsIDogKFJlc291cmNlKXJlcy5nZXQoKTsKKwkJfQorCQlwdWJsaWMgdm9pZCBzZXRSZXMoUmVzb3VyY2UgcmVzKSB7CisJCQl0aGlzLnJlcyA9IG5ldyBXZWFrUmVmZXJlbmNlKHJlcyk7CisJCX0KKwkJcHVibGljIElGaWxlIGdldFNhdmVkRmlsZSgpIHsKKwkJCXJldHVybiBzYXZlZEZpbGU7CisJCX0KKwkJcHVibGljIHZvaWQgc2V0U2F2ZWRGaWxlKElGaWxlIHNhdmVkRmlsZSkgeworCQkJdGhpcy5zYXZlZEZpbGUgPSBzYXZlZEZpbGU7CisJCX0KKwkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJCWZpbmFsIGludCBwcmltZSA9IDMxOworCQkJaW50IHJlc3VsdCA9IDE7CisJCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIGdldE91dGVyVHlwZSgpLmhhc2hDb2RlKCk7CisJCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoZ2V0UmVzKCkgPT0gbnVsbCkgPyAwIDogZ2V0UmVzKCkuaGFzaENvZGUoKSk7CisJCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoc2F2ZWRGaWxlID09IG51bGwpID8gMCA6IHNhdmVkRmlsZS5oYXNoQ29kZSgpKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKwkJCWlmICh0aGlzID09IG9iaikKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCWlmIChvYmogPT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQlTYXZlZEZpbGVLZXkgb3RoZXIgPSAoU2F2ZWRGaWxlS2V5KSBvYmo7CisJCQlpZiAoIWdldE91dGVyVHlwZSgpLmVxdWFscyhvdGhlci5nZXRPdXRlclR5cGUoKSkpCisJCQkJcmV0dXJuIGZhbHNlOworCQkJaWYgKGdldFJlcygpID09IG51bGwpIHsKKwkJCQlpZiAob3RoZXIuZ2V0UmVzKCkgIT0gbnVsbCkKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJfSBlbHNlIGlmICghZ2V0UmVzKCkuZXF1YWxzKG90aGVyLmdldFJlcygpKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQlpZiAoc2F2ZWRGaWxlID09IG51bGwpIHsKKwkJCQlpZiAob3RoZXIuc2F2ZWRGaWxlICE9IG51bGwpCisJCQkJCXJldHVybiBmYWxzZTsKKwkJCX0gZWxzZSBpZiAoIXNhdmVkRmlsZS5lcXVhbHMob3RoZXIuc2F2ZWRGaWxlKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlwcml2YXRlIFJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplciBnZXRPdXRlclR5cGUoKSB7CisJCQlyZXR1cm4gUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyLnRoaXM7CisJCX0KKwl9CisKKwkvKiogVGhlIGVtZiByZXNvdXJjZXMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSByZXNvdXJjZSBzZXQgYXMgYSByZXN1bHQgb2YgYSBkZWx0YSAqLworCXByb3RlY3RlZCBMaXN0IGRlZmVycmVkUmVtb3ZlUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOworCXByb3RlY3RlZCBMaXN0IGRlZmVycmVkVW5sb2FkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOworCXByb3RlY3RlZCBMaXN0IGRlZmVycmVkTG9hZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKKworCXByb3RlY3RlZCBMaXN0IGF1dG9sb2FkUmVzb3VyY2VzVVJJcyA9IG5ldyBBcnJheUxpc3QoKTsKKwlwcm90ZWN0ZWQgTGlzdCBhdXRvbG9hZFJlc291cmNlc0V4dHMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKworCS8qKgorCSAqIEBwYXJhbSBhUmVzb3VyY2VTZXQKKwkgKiBAcGFyYW0gYVByb2plY3QKKwkgKi8KKwlwdWJsaWMgUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyKFJlc291cmNlU2V0IGFSZXNvdXJjZVNldCwgSVByb2plY3QgYVByb2plY3QpIHsKKwkJc3VwZXIoYVJlc291cmNlU2V0LCBhUHJvamVjdCk7CisJfQorCQkKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLlJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyI3Jlc291cmNlQ2hhbmdlZChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudCkKKwkgKi8KKwlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJc3VwZXIucmVzb3VyY2VDaGFuZ2VkKGV2ZW50KTsKKwkJdHJ5IHsKKwkJCWFjY2VwdERlbHRhKGV2ZW50KTsKKwkJCW5vdGlmeUV4dGVuZGVyc0lmTmVjZXNzYXJ5KCk7CisJCQlwcm9jZXNzRGVmZXJyZWRSZXNvdXJjZXMoKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0gZmluYWxseSB7CisJCQlkZWZlcnJlZFJlbW92ZVJlc291cmNlcy5jbGVhcigpOworCQkJZGVmZXJyZWRVbmxvYWRSZXNvdXJjZXMuY2xlYXIoKTsKKwkJCWRlZmVycmVkTG9hZFJlc291cmNlcy5jbGVhcigpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0RlZmVycmVkUmVtb3ZlZFJlc291cmNlcygpIHsKKwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOworCQlmb3IgKGludCBpID0gMDsgaSA8IGRlZmVycmVkUmVtb3ZlUmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7CisJCQlyZXNvdXJjZSA9IChSZXNvdXJjZSkgZGVmZXJyZWRSZW1vdmVSZXNvdXJjZXMuZ2V0KGkpOworCQkJcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKHJlc291cmNlKTsKKwkJCXJlc291cmNlLnVubG9hZCgpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0RlZmVycmVkVW5sb2FkZWRSZXNvdXJjZXMoKSB7CisJCVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWZlcnJlZFVubG9hZFJlc291cmNlcy5zaXplKCk7IGkrKykgeworCQkJcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGRlZmVycmVkVW5sb2FkUmVzb3VyY2VzLmdldChpKTsKKwkJCXJlc291cmNlLnVubG9hZCgpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHByb2Nlc3NEZWZlcnJlZExvYWRSZXNvdXJjZXMoKSB7CisJCVVSSSB1cmkgPSBudWxsOworCQlmb3IgKGludCBpID0gMDsgaSA8IGRlZmVycmVkTG9hZFJlc291cmNlcy5zaXplKCk7IGkrKykgeworCQkJdXJpID0gKFVSSSkgZGVmZXJyZWRMb2FkUmVzb3VyY2VzLmdldChpKTsKKwkJCXRyeSB7CisJCQkJcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsKKwkJCX0gY2F0Y2ggKFdyYXBwZWRFeGNlcHRpb24gZXgpIHsKKwkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOworCQkJfQorCisJCX0KKwl9CisKKwlwcml2YXRlIElMb2NrIGxvY2s7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBkZWxheSA9IDMwOworCQorICAgIHByaXZhdGUgSUxvY2sgZ2V0TG9jaygpIHsKKyAgICAgICAgaWYgKGxvY2sgPT0gbnVsbCkKKyAgICAgICAgICAgIGxvY2sgPSBQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkubmV3TG9jaygpOworICAgICAgICByZXR1cm4gbG9jazsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIHJlbGVhc2VMb2NrKCkgeworICAgICAgICBnZXRMb2NrKCkucmVsZWFzZSgpOworICAgIH0KKyAgICBwcml2YXRlIGJvb2xlYW4gYXF1aXJlTG9jaygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbnsKKyAgICAJcmV0dXJuIGdldExvY2soKS5hY3F1aXJlKGRlbGF5KTsKKyAgICB9CisgICAgCisJcHJvdGVjdGVkIHZvaWQgYWNjZXB0RGVsdGEoZmluYWwgSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKworCQlib29sZWFuIGhhc0xvY2tlZCA9IGZhbHNlOworCQl0cnkgeworCQkJaGFzTG9ja2VkID0gYXF1aXJlTG9jaygpOworCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkud3JpdGUoZSk7CisJCX0JCQorCQkKKwkJdHJ5eworCQkJZmluYWwgSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOworCQorCQkJaWYgKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5pc1RyZWVMb2NrZWQoKSkgeworCQkJCXByaW1BY2NlcHREZWx0YShkZWx0YSwgZXZlbnQpOworCQkJfQorCQkJZWxzZSB7CisJCQkJSVdvcmtzcGFjZVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKKwkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkJCQkJcHJpbUFjY2VwdERlbHRhKGRlbHRhLCBldmVudCk7CisJCQkJCX0KKwkJCQl9OworCQkJCXRyeSB7CisJCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4ocnVubmFibGUsIHByb2plY3QsIElXb3Jrc3BhY2UuQVZPSURfVVBEQVRFLCBudWxsKTsKKwkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCX0KKwkJCX0KKwkJfWZpbmFsbHl7CisJCQlpZiggaGFzTG9ja2VkICkKKwkJCQlyZWxlYXNlTG9jaygpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHByaW1BY2NlcHREZWx0YShJUmVzb3VyY2VEZWx0YSBkZWx0YSwgSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJaWYgKGRlbHRhICE9IG51bGwpIHsKKwkJCXRyeSB7CisJCQkJY3VycmVudFByb2plY3REZWx0YSA9IG51bGw7CisJCQkJZGVsdGEuYWNjZXB0KFJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplci50aGlzKTsKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogVGhlIHByb2plY3QgaXMgZ29pbmcgYXdheSBzbyB3ZSBuZWVkIHRvIGNsZWFudXAgb3Vyc2VsZiBhbmQgdGhlIFJlc291cmNlU2V0LiBUT0RPIE5lZWQgdG8KKwkgKiBwdXNoIHVwIHRoaXMgY29kZSB0byBSZXNvdXJjZVNldFdvcmtiZW5jaFN5bmNocm9uaXplciBpbiBuZXh0IHJlbGVhc2UuCisJICovCisJcHJvdGVjdGVkIHZvaWQgcmVsZWFzZSgpIHsKKwkJaWYgKEpFTVV0aWxQbHVnaW4uaXNBY3RpdmF0ZWQoKSkgeworCQkJdHJ5IHsKKwkJCQlpZiAocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBQcm9qZWN0UmVzb3VyY2VTZXQpCisJCQkJCSgoUHJvamVjdFJlc291cmNlU2V0KSByZXNvdXJjZVNldCkucmVsZWFzZSgpOworCQkJfSBmaW5hbGx5IHsKKwkJCQlFTUZXb3JrYmVuY2hDb250ZXh0RmFjdG9yeS5JTlNUQU5DRS5yZW1vdmVDYWNoZWRQcm9qZWN0KGdldFByb2plY3QoKSk7CisJCQkJZGlzcG9zZSgpOworCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHByb2Nlc3NEZWZlcnJlZFJlc291cmNlcygpIHsKKwkJcHJvY2Vzc0RlZmVycmVkUmVtb3ZlZFJlc291cmNlcygpOworCQlwcm9jZXNzRGVmZXJyZWRVbmxvYWRlZFJlc291cmNlcygpOworCQlwcm9jZXNzRGVmZXJyZWRMb2FkUmVzb3VyY2VzKCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKKwkJSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKKwkJLy8gb25seSByZXNwb25kIHRvIHByb2plY3QgY2hhbmdlcworCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgeworCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkgeworCQkJCUlQcm9qZWN0IHAgPSAoSVByb2plY3QpIHJlc291cmNlOworCQkJCWlmIChpc0ludGVycmVzdGVkSW5Qcm9qZWN0KHApKSB7CisJCQkJCWN1cnJlbnRQcm9qZWN0RGVsdGEgPSBkZWx0YTsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgJiYgaXNJbnRlcnJlc3RlZEluRmlsZSgoSUZpbGUpIHJlc291cmNlKSkgeworCQkJCXN3aXRjaCAoZGVsdGEuZ2V0S2luZCgpKSB7CisJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCA6CisJCQkJCQlyZW1vdmVkUmVzb3VyY2UoKElGaWxlKSByZXNvdXJjZSk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRCA6CisJCQkJCQlhZGRlZFJlc291cmNlKChJRmlsZSkgcmVzb3VyY2UpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRCA6CisJCQkJCQlpZiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5DT05URU5UKSAhPSAwKQorCQkJCQkJCWNoYW5nZWRSZXNvdXJjZSgoSUZpbGUpIHJlc291cmNlKTsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0IDoKKwkJCQkJCWlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk1PVkVEX0ZST00pICE9IDAgfHwgKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5NT1ZFRF9UTykgIT0gMCkKKwkJCQkJCQltb3ZlZFJlc291cmNlKChJRmlsZSkgcmVzb3VyY2UpOworCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiBRdWV1ZSB1cCB0aGUgPGNvZGU+UmVzb3VyY2U8L2NvZGU+IHRoYXQgY29ycmVzcG9uZHMgdG8gPGNvZGU+YUZpbGU8L2NvZGU+LCBmb3IgcmVtb3ZhbAorCSAqIGZyb20gdGhlIGNhY2hlIG9mIHJlc291cmNlcy4KKwkgKiAKKwkgKiBAcG9zdCBSZXR1cm4gdHJ1ZSBpZiBhIDxjb2RlPlJlc291cmNlPC9jb2RlPiB3YXMgcXVldWVkIHVwIHRvIGJlIHJlbW92ZWQuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlZFJlc291cmNlKElGaWxlIGFGaWxlKSB7CisJCXJldHVybiBwcm9jZXNzUmVzb3VyY2UoYUZpbGUsIHRydWUpOworCX0KKworCS8qKgorCSAqIFF1ZXVlIHVwIHRoZSA8Y29kZT5SZXNvdXJjZTwvY29kZT4gdGhhdCBjb3JyZXNwb25kcyB0byA8Y29kZT5hRmlsZTwvY29kZT4sIGZvciByZWxvYWQuCisJICogCisJICogQHBvc3QgUmV0dXJuIHRydWUgaWYgYSA8Y29kZT5SZXNvdXJjZTwvY29kZT4gd2FzIHF1ZXVlZCB1cCB0byBiZSByZWxvYWRlZC4KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRlZFJlc291cmNlKElGaWxlIGFGaWxlKSB7CisJCWJvb2xlYW4gZGlkUHJvY2VzcyA9IGZhbHNlOworCQlMaXN0IHJlc291cmNlcyA9IGdldFJlc291cmNlcyhhRmlsZSk7CisJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgeworCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXJhdG9yLm5leHQoKTsKKworCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKKwkJCQlpZiAocmVjZW50bHlTYXZlZEZpbGVzQ29udGFpbnMocmVzb3VyY2UpKSB7CisKKwkJCQkJLyoKKwkJCQkJICogVGhlIElGaWxlIHdhcyBqdXN0IGFkZGVkIHRvIHRoZSB3b3Jrc3BhY2UgYnV0IHdlIGhhdmUgYQorCQkJCQkgKiBjaGFuZ2VkIHJlc291cmNlIGluIG1lbW9yeS4gTmVlZCB0byBkZWNpZGUgaWYgaXQgc2hvdWxkCisJCQkJCSAqIGJlIHVubG9hZGVkLgorCQkJCQkgKi8KKwkJCQkJaWYgKHJlc291cmNlLmlzTW9kaWZpZWQoKSkgeworCQkJCQkJaWYgKFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmlzUmVmZXJlbmNlZFJlc291cmNlKHJlc291cmNlKSkgeworCQkJCQkJCVJlZmVyZW5jZWRSZXNvdXJjZSByZWZSZXMgPSAoUmVmZXJlbmNlZFJlc291cmNlKSByZXNvdXJjZTsKKwkJCQkJCQlpZiAocmVmUmVzLnNob3VsZEZvcmNlUmVmcmVzaCgpKSB7CisJCQkJCQkJCWRlZmVycmVkVW5sb2FkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisJCQkJCQkJCWRpZFByb2Nlc3MgPSB0cnVlOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCS8qIFVubG9hZCBpZiBmb3VuZCBhbmQgaXMgbm90IG1vZGlmaWVkIGJ1dCBpbmNvbnNpc3RlbnQuICovCisJCQkJCWlmIChyZXNvdXJjZS5pc0xvYWRlZCgpKSB7CisJCQkJCQlpZiAoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuaXNSZWZlcmVuY2VkUmVzb3VyY2UocmVzb3VyY2UpKSB7CisJCQkJCQkJaWYgKCFXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5pc0NvbnNpc3RlbnQoKFJlZmVyZW5jZWRSZXNvdXJjZSkgcmVzb3VyY2UpKSB7CisJCQkJCQkJCWRlZmVycmVkVW5sb2FkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisJCQkJCQkJCWRpZFByb2Nlc3MgPSB0cnVlOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJZGVmZXJyZWRVbmxvYWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKKwkJCQkJCQlkaWRQcm9jZXNzID0gdHJ1ZTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8qIFByb2Nlc3MgYXV0b2xvYWQgcmVzb3VyY2VzIG9uIGFkZGVkIGZpbGUgKi8KKwkJCQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShhRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOworCQkJCQkJaWYgKChhdXRvbG9hZFJlc291cmNlc1VSSXMuY29udGFpbnModXJpKSkgfHwgKGF1dG9sb2FkUmVzb3VyY2VzRXh0cy5jb250YWlucyhhRmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkpKSkgeworCQkJCQkJCWRlZmVycmVkTG9hZFJlc291cmNlcy5hZGQodXJpKTsKKwkJCQkJCQlkaWRQcm9jZXNzID0gdHJ1ZTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gZGlkUHJvY2VzczsKKwl9CisKKwlwcml2YXRlIHN5bmNocm9uaXplZCBib29sZWFuIHJlY2VudGx5U2F2ZWRGaWxlc0NvbnRhaW5zKFJlc291cmNlIHJlc291cmNlKSB7CisJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSByZWNlbnRseVNhdmVkRmlsZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgeworCQkJU2F2ZWRGaWxlS2V5IGtleSA9IChTYXZlZEZpbGVLZXkpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCWlmIChrZXkuZ2V0UmVzKCkgIT0gbnVsbCAmJiAoa2V5LmdldFJlcygpLmdldFVSSSgpLmVxdWFscyhyZXNvdXJjZS5nZXRVUkkoKSkgJiYga2V5LmdldFJlcygpLmdldENsYXNzKCkuZXF1YWxzKHJlc291cmNlLmdldENsYXNzKCkpKSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NSZXNvdXJjZShJRmlsZSBhRmlsZSwgYm9vbGVhbiBpc1JlbW92ZSkgeworCQlMaXN0IHJlc291cmNlcyA9IGdldFJlc291cmNlcyhhRmlsZSk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgeworCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCWlmICgocmVzb3VyY2UgIT0gbnVsbCkpIHsKKwkJCQlpZiAocmVjZW50bHlTYXZlZEZpbGVzQ29udGFpbnMocmVzb3VyY2UpKSB7CisJCQkJCWlmIChyZXNvdXJjZS5pc01vZGlmaWVkKCkpIHsKKwkJCQkJCWlmIChXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5pc1JlZmVyZW5jZWRSZXNvdXJjZShyZXNvdXJjZSkpIHsKKwkJCQkJCQlSZWZlcmVuY2VkUmVzb3VyY2UgcmVmUmVzID0gKFJlZmVyZW5jZWRSZXNvdXJjZSkgcmVzb3VyY2U7CisJCQkJCQkJaWYgKCFyZWZSZXMuc2hvdWxkRm9yY2VSZWZyZXNoKCkpCisJCQkJCQkJCWNvbnRpbnVlOyAvLyBEbyBub3QgZG8gYW55dGhpbmcKKwkJCQkJCX0gZWxzZQorCQkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJfQorCQkJCWlmIChpc1JlbW92ZSkKKwkJCQkJZGVmZXJyZWRSZW1vdmVSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKKwkJCQllbHNlIGlmIChyZXNvdXJjZS5pc0xvYWRlZCgpKSB7CisJCQkJCWlmIChXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5pc1JlZmVyZW5jZWRSZXNvdXJjZShyZXNvdXJjZSkpIHsKKwkJCQkJCWlmICghV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuaXNDb25zaXN0ZW50KChSZWZlcmVuY2VkUmVzb3VyY2UpIHJlc291cmNlKSkKKwkJCQkJCQlkZWZlcnJlZFVubG9hZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOworCQkJCQl9IGVsc2UKKwkJCQkJCWRlZmVycmVkVW5sb2FkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBGb3Igbm93LCBkbyB0aGUgc2FtZSBhcyBpZiB0aGUgPGNvZGU+YUZpbGU8L2NvZGU+IHdhcyByZW1vdmVkLgorCSAqLworCXByb3RlY3RlZCBib29sZWFuIG1vdmVkUmVzb3VyY2UoSUZpbGUgYUZpbGUpIHsKKwkJcmV0dXJuIHJlbW92ZWRSZXNvdXJjZShhRmlsZSk7CisJfQorCisJLyoqCisJICogVGhlIGNvbnRlbnRzIG9mIDxjb2RlPmFGaWxlPC9jb2RlPiBoYXZlIGNoYW5nZWQgaW4gdGhlIFdvcmtiZW5jaCBhbmQgd2UgbWF5IG5lZWQgdG8gdXBkYXRlCisJICogb3VyIGNhY2hlZCByZXNvdXJjZXMuCisJICogCisJICogV2Ugd2lsbCBwcm9jZXNzIHRoaXMgcmVzb3VyY2UgdG8gYmUgcmVmcmVzaGVkIGFuZCBub3QgcmVtb3ZlZC4KKwkgKiAKKwkgKiBAcG9zdCBSZXR1cm4gdHJ1ZSBpZiBhIDxjb2RlPlJlc291cmNlPC9jb2RlPiB3YXMgYWN0dWFsbHkgcmVtb3ZlZC4KKwkgKi8KKworCXByb3RlY3RlZCBib29sZWFuIGNoYW5nZWRSZXNvdXJjZShJRmlsZSBhRmlsZSkgeworCQkvL1Byb2Nlc3MgcmVzb3VyY2UgYXMgYSByZWZyZXNoLgorCQlyZXR1cm4gcHJvY2Vzc1Jlc291cmNlKGFGaWxlLCBmYWxzZSk7CisJfQorCisJcHJvdGVjdGVkIFJlc291cmNlIGdldFJlc291cmNlKElGaWxlIGFGaWxlKSB7CisJCQorCQlyZXR1cm4gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UoVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoYUZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKSwgZmFsc2UpOworCX0KKwkKKwlwcm90ZWN0ZWQgTGlzdCBnZXRSZXNvdXJjZXMoSUZpbGUgYUZpbGUpIHsKKworCQlMaXN0IHJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJTGlzdCBhbGxSZXNvdXJjZXMgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKTsKKwkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFsbFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7CisJCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCVVSSSByZXNVUkkgPSByZXMuZ2V0VVJJKCk7CisJCQlTdHJpbmcgcmVzVVJJU3RyaW5nID0gIiI7CisJCQlpZiAocmVzVVJJLnBhdGgoKSAhPSBudWxsKSB7CisJCQkJSVBhdGggcmVzVVJJUGF0aDsKKwkJCQlpZiAoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuaXNQbGF0Zm9ybVJlc291cmNlVVJJKHJlc1VSSSkpCisJCQkJCXJlc1VSSVBhdGggPSBuZXcgUGF0aChVUkkuZGVjb2RlKHJlc1VSSS5wYXRoKCkpKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDIpOworCQkJCWVsc2UKKwkJCQkJcmVzVVJJUGF0aCA9IG5ldyBQYXRoKFVSSS5kZWNvZGUocmVzVVJJLnBhdGgoKSkpLnJlbW92ZUZpcnN0U2VnbWVudHMoMSk7CisJCQkJcmVzVVJJU3RyaW5nID0gcmVzVVJJUGF0aC50b1N0cmluZygpOworCQkJfQorCQkJaWYgKCFyZXNVUklTdHJpbmcuZXF1YWxzKCIiKSAmJiBhRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkuaW5kZXhPZihyZXNVUklTdHJpbmcpICE9IC0xKQorCQkJCXJlc291cmNlcy5hZGQocmVzKTsKKwkJfQorCQlyZXR1cm4gcmVzb3VyY2VzOworCX0KKworCisJLyoqCisJICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBwcmlvciB0byB3cml0aW5nIHRvIGFuIElGaWxlIGZyb20gYSBNT0YgcmVzb3VyY2UuCisJICovCisJcHVibGljIHZvaWQgcHJlU2F2ZShJRmlsZSBhRmlsZSkgeworCQlpZiAoYUZpbGUgIT0gbnVsbCkgeworCQkJcmVjZW50bHlTYXZlZEZpbGVzQWRkKGFGaWxlLG51bGwpOworCQkJaWdub3JlZEZpbGVzQ2FjaGUucmVtb3ZlKGFGaWxlKTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHByaW9yIHRvIHdyaXRpbmcgdG8gYW4gSUZpbGUgZnJvbSBhIE1PRiByZXNvdXJjZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBwcmVTYXZlKElGaWxlIGFGaWxlLCBSZXNvdXJjZSByZXMpIHsKKwkJaWYgKGFGaWxlICE9IG51bGwpIHsKKwkJCXJlY2VudGx5U2F2ZWRGaWxlc0FkZChhRmlsZSwgcmVzKTsKKwkJCWlnbm9yZWRGaWxlc0NhY2hlLnJlbW92ZShhRmlsZSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHN5bmNocm9uaXplZCBib29sZWFuIHJlY2VudGx5U2F2ZWRGaWxlc0FkZChJRmlsZSBmaWxlLCBSZXNvdXJjZSByZXMpIHsKKwkJcmV0dXJuIHJlY2VudGx5U2F2ZWRGaWxlcy5hZGQobmV3IFNhdmVkRmlsZUtleShyZXMsIGZpbGUpKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIGEgcHJlU2F2ZSBpZiB0aGUgc2F2ZSBmYWlscworCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZUZyb21SZWNlbnRseVNhdmVkTGlzdChJRmlsZSBhRmlsZSkgeworCQlpZiAoYUZpbGUgIT0gbnVsbCkgeworCQkJcmVjZW50bHlTYXZlZEZpbGVzRm9yY2VSZW1vdmUoYUZpbGUpOworCQkJaWdub3JlZEZpbGVzQ2FjaGUucmVtb3ZlKGFGaWxlKTsKKwkJfQorCX0KKworCXByaXZhdGUgc3luY2hyb25pemVkIGJvb2xlYW4gcmVjZW50bHlTYXZlZEZpbGVzUmVtb3ZlKElGaWxlIGZpbGUpIHsKKwkJCisJCWJvb2xlYW4gcmVtb3ZlZEZyb21MaXN0ID0gZmFsc2U7CisJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSByZWNlbnRseVNhdmVkRmlsZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgeworCQkJU2F2ZWRGaWxlS2V5IGtleSA9IChTYXZlZEZpbGVLZXkpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCWlmIChrZXkuc2F2ZWRGaWxlICE9IG51bGwgJiYga2V5LnNhdmVkRmlsZS5lcXVhbHMoZmlsZSkpIHsKKwkJCQlMaXN0IHJlc291cmNlcyA9IGdldFJlc291cmNlcyhmaWxlKTsKKwkJCQlpZiAoa2V5LmdldFJlcygpID09IG51bGwgfHwgcmVzb3VyY2VzLmNvbnRhaW5zKGtleS5nZXRSZXMoKSkgKSB7CisJCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOworCQkJCQlyZW1vdmVkRnJvbUxpc3QgPSB0cnVlOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVtb3ZlZEZyb21MaXN0OworCX0KKwlwcml2YXRlIHN5bmNocm9uaXplZCBib29sZWFuIHJlY2VudGx5U2F2ZWRGaWxlc0ZvcmNlUmVtb3ZlKElGaWxlIGZpbGUpIHsKKwkJCisJCWJvb2xlYW4gcmVtb3ZlZEZyb21MaXN0ID0gZmFsc2U7CisJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSByZWNlbnRseVNhdmVkRmlsZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgeworCQkJU2F2ZWRGaWxlS2V5IGtleSA9IChTYXZlZEZpbGVLZXkpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCWlmIChrZXkuc2F2ZWRGaWxlICE9IG51bGwgJiYga2V5LnNhdmVkRmlsZS5lcXVhbHMoZmlsZSkpIHsKKwkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7CisJCQkJCXJlbW92ZWRGcm9tTGlzdCA9IHRydWU7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlbW92ZWRGcm9tTGlzdDsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGp1c3QgYWZ0ZXIgd3JpdGluZyB0byBhbiBJRmlsZSBmcm9tIGEgTU9GIHJlc291cmNlLgorCSAqIAorCSAqIEBkZXByZWNhdGVkIE5vIGxvbmdlciBuZWVkcyB0byBiZSBjYWxsZWQuCisJICovCisJcHVibGljIHZvaWQgcG9zdFNhdmUoSUZpbGUgYUZpbGUpIHsKKwkJLy9UT0RPIHJlbW92ZSB0aGlzIG1ldGhvZAorCX0KKworCS8qKgorCSAqIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiA8Y29kZT5hUHJvamVjdDwvY29kZT4gaGFzIHRoZSBwcm9qZWN0TmF0dXJlSUQuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNJbnRlcnJlc3RlZEluUHJvamVjdChJUHJvamVjdCBhUHJvamVjdCkgeworCQlyZXR1cm4gYVByb2plY3QuZXF1YWxzKGdldFByb2plY3QoKSk7CisJfQorCisJLyoqCisJICogT3B0aW1pemVkIG5vdCB0byBiZSBub3QgaW50ZXJyZXN0ZWQgaW4gZmlsZXMgd2l0aCBhbiBleHRlbnNpb24gb2YgLmphdmEgb3IgLmNsYXNzIG9yIGlmIHRoZQorCSAqIGZpbGUgaGFzIGp1c3QgYmVlbiBzYXZlZCBieSBvdXIgb3duIGludGVybmFsIG1lY2hhbmlzbS4KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0ludGVycmVzdGVkSW5GaWxlKElGaWxlIGFGaWxlKSB7CisJCVN0cmluZyBleHRlbnNpb24gPSBhRmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCk7CisJCWlmIChDTEFTU19FWFRFTlNJT04uZXF1YWxzKGV4dGVuc2lvbikgfHwgSkFWQV9FWFRFTlNJT04uZXF1YWxzKGV4dGVuc2lvbikgfHwgSkFWQV9BUkNISVZFLmVxdWFscyhleHRlbnNpb24pKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAocmVjZW50bHlTYXZlZEZpbGVzUmVtb3ZlKGFGaWxlKSkgeworCQkJCWNhY2hlSWdub3JlZChhRmlsZSk7CisJCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiAhaGFzSWdub3JlZChhRmlsZSk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRydWUgaWYgd2UgaGF2ZSBhbHJlYWR5IGlnbm9yZWQgdGhpcyA8Y29kZT5maWxlPC9jb2RlPiBhbmQgdGhhdCBpdHMgbW9kaWZpY2F0aW9uCisJICogc3RhbXAgaXMgdGhlIHNhbWUgYXMgd2hlbiB3ZSBwcm9jZXNzZWQgaXQuCisJICogCisJICogQHBhcmFtIGZpbGUKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBib29sZWFuIGhhc0lnbm9yZWQoSUZpbGUgZmlsZSkgeworCQlMb25nIGNhY2hlZFN0YW1wID0gKExvbmcpIGlnbm9yZWRGaWxlc0NhY2hlLmdldChmaWxlKTsKKwkJaWYgKGNhY2hlZFN0YW1wID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCWxvbmcgc3RhbXAgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5jb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoZmlsZSk7CisJCXJldHVybiBjYWNoZWRTdGFtcC5sb25nVmFsdWUoKSA9PSBzdGFtcDsKKwl9CisKKwkvKioKKwkgKiBDYWNoZSB0aGUgbW9kaWZpY2F0aW9uIHN0YW1wIG9mIHRoZSA8Y29kZT5maWxlPC9jb2RlPi4KKwkgKiAKKwkgKiBAcGFyYW0gZmlsZQorCSAqLworCXByaXZhdGUgdm9pZCBjYWNoZUlnbm9yZWQoSUZpbGUgZmlsZSkgeworCQlsb25nIHN0YW1wID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGZpbGUpOworCQlpZ25vcmVkRmlsZXNDYWNoZS5wdXQoZmlsZSwgbmV3IExvbmcoc3RhbXApKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBlbmFibGVBdXRvbG9hZChVUkkgdXJpKSB7CisJCVVSSSBub3JtYWxpemVkID0gcmVzb3VyY2VTZXQuZ2V0VVJJQ29udmVydGVyKCkubm9ybWFsaXplKHVyaSk7CisJCWF1dG9sb2FkUmVzb3VyY2VzVVJJcy5hZGQobm9ybWFsaXplZCk7CisJfQorCisJcHVibGljIHZvaWQgZGlzYWJsZUF1dG9sb2FkKFVSSSB1cmkpIHsKKwkJVVJJIG5vcm1hbGl6ZWQgPSByZXNvdXJjZVNldC5nZXRVUklDb252ZXJ0ZXIoKS5ub3JtYWxpemUodXJpKTsKKwkJYXV0b2xvYWRSZXNvdXJjZXNVUklzLnJlbW92ZShub3JtYWxpemVkKTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLlJlc291cmNlU2V0V29ya2JlbmNoU3luY2hyb25pemVyI2luaXRpYWxpemUoKQorCSAqLworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7CisJCWdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcywgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0NMT1NFIHwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURSB8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKKwl9CisJcHVibGljIHZvaWQgZW5hYmxlQXV0b2xvYWQoU3RyaW5nIGV4dGVuc2lvbikgeworCQlhdXRvbG9hZFJlc291cmNlc0V4dHMuYWRkKGV4dGVuc2lvbik7CisJCQorCX0KKwlwdWJsaWMgdm9pZCBkaXNhYmxlQXV0b2xvYWQoU3RyaW5nIGV4dGVuc2lvbikgeworCQlhdXRvbG9hZFJlc291cmNlc0V4dHMucmVtb3ZlKGV4dGVuc2lvbik7CisJfQorCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJc3VwZXIuZGlzcG9zZSgpOworCQljdXJyZW50UHJvamVjdERlbHRhID0gbnVsbDsKKwkJZXh0ZW5kZXJzID0gbnVsbDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9JVmFsaWRhdGVFZGl0Q29udGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvdmFsaWRhdGVlZGl0L0lWYWxpZGF0ZUVkaXRDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk2NTkwMAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9JVmFsaWRhdGVFZGl0Q29udGV4dC5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIENyZWF0ZWQgb24gTWF5IDE4LCAyMDA0CisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsOworCisKKy8qKgorICogQGF1dGhvciBqbGFudXRpIFRoaXMgaXMgdGhlIGFic3RyYWN0aW9uIGxheWVyIGZvciB2YWxpZGF0ZSBlZGl0CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVZhbGlkYXRlRWRpdENvbnRleHQgZXh0ZW5kcyBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyIHsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX0tFWSA9ICJWYWxpZGF0ZUVkaXRDb250ZXh0IjsgLy8kTk9OLU5MUy0xJAorCisJcHVibGljIHZvaWQgc2V0RWRpdE1vZGVsKEVkaXRNb2RlbCBmVmFsaWRhdG9yKTsKKworCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlU3RhdGUoRWRpdE1vZGVsIGZWYWxpZGF0b3IpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9SZXNvdXJjZVN0YXRlSW5wdXRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvdmFsaWRhdGVlZGl0L1Jlc291cmNlU3RhdGVJbnB1dFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI4YmM2MAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9SZXNvdXJjZVN0YXRlSW5wdXRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKKyAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0OworCisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGludGVyZmFjZSBSZXNvdXJjZVN0YXRlSW5wdXRQcm92aWRlciB7CisJLyoqCisJICogUmV0dXJuIHRydWUgaWYgYW55IG9mIHRoZSBjb250cm9sbGVkIHJlc291cmNlcyBvciBmaWxlcyBoYXMgYmVlbiBtb2RpZmllZC4KKwkgKiAKKwkgKiBAcmV0dXJuIGJvb2xlYW4KKwkgKi8KKwlib29sZWFuIGlzRGlydHkoKTsKKworCS8qKgorCSAqIFJldHVybiBhIDxjb2RlPkxpc3Q8L2NvZGU+IG9mIHRoZSBNT0YgUmVzb3VyY2VzIHRoYXQgYXJlIGJlaW5nIG1hbmFnZWQuIFN5bmNocm9uaXphdGlvbgorCSAqIGNoZWNraW5nIHdpbGwgb25seSB3b3JrIGlmIHlvdSBhcmUgdXNpbmcgdGhlIGVtZi53b3JrYmVuY2ggcGx1Z2luIGFwaXMgZm9yIGxvYWRpbmcgcmVzb3VyY2VzLgorCSAqIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCB5b3UgZ2V0IGFuIGluc3RhbmNlIG9mIGEgPGNvZGU+UmVmZXJlbmNlZFJlc291cmNlPC9jb2RlPi4gVGhpcworCSAqIHJlc291cmNlIHR5cGUgaXMgY2FwYWJsZSBvZiBjYWNoaW5nIGl0cyBsYXN0IGtub3duIHN5bmNocm9uaXphdGlvbiBzdGFtcCB0aGF0IG1heSBiZSB1c2VkIHRvCisJICogdGVzdCBpZiB0aGUgcmVzb3VyY2UgaXMgY29uc2l0ZW50IHdpdGggdGhlIHVuZGVybHlpbmcgSUZpbGUuCisJICogCisJICogQHJldHVybiBMaXN0CisJICovCisJTGlzdCBnZXRSZXNvdXJjZXMoKTsKKworCS8qKgorCSAqIFJldHVybiBhIDxjb2RlPkxpc3Q8L2NvZGU+IG9mIElGaWxlcyB0aGF0IGFyZSBub3QgTU9GIFJlc291cmNlcyB0aGF0IGFyZSBhbHNvIGJlaW5nCisJICogbW9kaWZpZWQuCisJICogCisJICogQHJldHVybiBMaXN0CisJICovCisJTGlzdCBnZXROb25SZXNvdXJjZUZpbGVzKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gYSBzdWJzZXQgb2YgdGhlIExpc3QgZnJvbSBnZXROb25SZXNvdXJjZUZpbGVzKCkgdGhhdCBhcmUgaW5jb25zaXN0ZW50IHdpdGggdGhlCisJICogdW5kZXJseWluZyBqYXZhLmlvLkZpbGUuCisJICogCisJICogQHJldHVybiBMaXN0CisJICogQHNlZSBSZXNvdXJjZVN0YXRlSW5wdXRQcm92aWRlciNnZXROb25SZXNvdXJjZUZpbGVzKCkKKwkgKi8KKwlMaXN0IGdldE5vblJlc291cmNlSW5jb25zaXN0ZW50RmlsZXMoKTsKKworCS8qKgorCSAqIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgcHJvdmlkZXIgdG8gY2FjaGUgdGhlIHN5bmNocm9uaXphdGlvbiBzdGFtcCBmb3IgdGhlIExpc3Qgb2YKKwkgKiA8Y29kZT5yb05vblJlc291cmNlRmlsZXM8L2NvZGU+LiBUaGlzIHN0YW1wIHdpbGwgYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGluY29uc2lzdGVudAorCSAqIGZpbGVzLiBUaGlzIGlzIG9ubHkgbmVjZXNzYXJ5IG9mIElGaWxlcyB0aGF0IGFyZSBub3QgTU9GIHJlc291cmNlcy4KKwkgKiAKKwkgKiBAcGFyYW0gcm9Ob25SZXNvdXJjZUZpbGVzCisJICogQHNlZSBSZXNvdXJjZVN0YXRlSW5wdXRQcm92aWRlciNnZXROb25SZXNvdXJjZUluY29uc2lzdGVudEZpbGVzKCkKKwkgKi8KKwl2b2lkIGNhY2hlTm9uUmVzb3VyY2VWYWxpZGF0ZVN0YXRlKExpc3Qgcm9Ob25SZXNvdXJjZUZpbGVzKTsKK30KKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvdmFsaWRhdGVlZGl0L1Jlc291cmNlU3RhdGVWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9SZXNvdXJjZVN0YXRlVmFsaWRhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYzMzdjNAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9SZXNvdXJjZVN0YXRlVmFsaWRhdG9yLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdDsKKworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbjsKKworcHVibGljIGludGVyZmFjZSBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yIHsKKwlzdGF0aWMgZmluYWwgSVN0YXR1cyBPS19TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIEpFTVV0aWxQbHVnaW4uSUQsIDAsICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCB3aGVuZXZlciBhIDxjb2RlPnByZXNlbnRlcjwvY29kZT4gaXMgYWN0aXZhdGVkIChiZWNvbWVzCisJICogYWN0aXZlKS4gVGhpcyB3aWxsIGNoZWNrIHRoZSB0aW1lc3RhbXBzIG9mIHRoZSB1bmRlcmx5aW5nIGZpbGVzIHRvIHNlZSBpZiB0aGV5IGFyZSBkaWZmZXJlbnQKKwkgKiBmcm9tIHRoZSBsYXN0IGNhY2hlZCBtb2RpZmllZCB2YWx1ZS4gVGhlIDxjb2RlPnByZXNlbnRlcjwvY29kZT4gc2hvdWxkIGJlIHByZXBhcmVkIHRvCisJICogcHJvbXB0IHRoZSB1c2VyIGlmIHRoZXkgd291bGQgbGlrZSB0byByZWZyZXNoIHdpdGggdGhlIGNvbnRlbnRzIG9uIGRpc2sgaWYgd2UgYXJlIGRpcnR5LgorCSAqLworCXZvaWQgY2hlY2tBY3RpdmF0aW9uKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIgcHJlc2VudGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgd2hlbmV2ZXIgYSA8Y29kZT5wcmVzZW50ZXI8L2NvZGU+IGxvb3NlcyBhY3RpdmF0aW9uLiBUaGlzIHdpbGwKKwkgKiBjaGVjayB0aGUgdGltZXN0YW1wcyBvZiB0aGUgdW5kZXJseWluZyBmaWxlcyB0byBzZWUgaWYgdGhleSBhcmUgZGlmZmVyZW50IGZyb20gdGhlIGxhc3QKKwkgKiBjYWNoZWQgbW9kaWZpZWQgdmFsdWUuIFRoZSA8Y29kZT5wcmVzZW50ZXI8L2NvZGU+IHNob3VsZCBiZSBwcmVwYXJlZCB0byBwcm9tcHQgdGhlIHVzZXIgaWYKKwkgKiB0aGV5IHdvdWxkIGxpa2UgdG8gcmVmcmVzaCB3aXRoIHRoZSBjb250ZW50cyBvbiBkaXNrIGlmIHdlIGFyZSBkaXJ0eS4KKwkgKi8KKwl2b2lkIGxvc3RBY3RpdmF0aW9uKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIgcHJlc2VudGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgdGhlIGZpcnN0IHRpbWUgdGhlIGZpbGVzIGFyZSBhYm91dCB0byBiZSBtb2RpZmllZCBhZnRlciBhCisJICogPGNvZGU+cHJlc2VudGVyPC9jb2RlPiBiZWNvbWVzIGFjdGl2ZS4gVGhlIHJldHVybmVkIElTdGF0dXMgbWF5IGhhdmUgYW4gRVJST1Igc3RhdHVzIHdoaWNoCisJICogc2hvdWxkIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlci4KKwkgKi8KKwlJU3RhdHVzIHZhbGlkYXRlU3RhdGUoUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciBwcmVzZW50ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uOworCisJLyoqCisJICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBwcmlvciB0byB0aGUgPGNvZGU+cHJlc2VudGVyPC9jb2RlPiBzYXZpbmcgdGhlIG1vZGlmaWVkCisJICogY29udGVudHMuIFRoaXMgd2lsbCBjaGVjayB0aGUgY29uc2lzdGVuY3kgb2YgdGhlIHVuZGVybHlpbmcgZmlsZXMgdG8gZW5zdXJlIHRoYXQgdGhleSBhcmUKKwkgKiBzeW5jaHJvbml6ZWQuIElmIHRydWUgaXMgcmV0dXJuZWQsIHRoZSBzYXZlIGNhbiBwcm9jZWVkLgorCSAqLworCWJvb2xlYW4gY2hlY2tTYXZlKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIgcHJlc2VudGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKKworCS8qKgorCSAqIFJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBhbnkgcmVhZCBvbmx5IGZpbGVzLgorCSAqLworCWJvb2xlYW4gY2hlY2tSZWFkT25seSgpOworfQorCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC92YWxpZGF0ZWVkaXQvUmVzb3VyY2VTdGF0ZVZhbGlkYXRvckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9SZXNvdXJjZVN0YXRlVmFsaWRhdG9ySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMGI2ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC92YWxpZGF0ZWVkaXQvUmVzb3VyY2VTdGF0ZVZhbGlkYXRvckltcGwuamF2YQpAQCAtMCwwICsxLDQ0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdDsKKworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZWZlcmVuY2VkUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7CisKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZVN0YXRlVmFsaWRhdG9ySW1wbCBpbXBsZW1lbnRzIFJlc291cmNlU3RhdGVWYWxpZGF0b3IgeworCXByb3RlY3RlZCBSZXNvdXJjZVN0YXRlSW5wdXRQcm92aWRlciBwcm92aWRlcjsKKwlwcm90ZWN0ZWQgTWFwIGxhc3ROb25SZWZyZXNoU3RhdGVNYXA7CisJcHJvdGVjdGVkIGJvb2xlYW4gaXNDaGVja2luZ0NvbnNpc3RlbmN5OworCisJY2xhc3MgUmVmcmVzaFJ1bm5hYmxlIGltcGxlbWVudHMgSVdvcmtzcGFjZVJ1bm5hYmxlIHsKKwkJQ29yZUV4Y2VwdGlvbiB0aHJvd25FeGNlcHRpb247CisJCUxpc3QgZmlsZXM7CisJCUxpc3QgcmVzb3VyY2VzOworCisJCVJlZnJlc2hSdW5uYWJsZShMaXN0IHNvbWVGaWxlcywgTGlzdCBpbmNvbnNpc3RlbnRSZXNvdXJjZXMpIHsKKwkJCWZpbGVzID0gc29tZUZpbGVzOworCQkJcmVzb3VyY2VzID0gaW5jb25zaXN0ZW50UmVzb3VyY2VzOworCQl9CisKKwkJcHVibGljIENvcmVFeGNlcHRpb24gZ2V0VGhyb3duRXhjZXB0aW9uKCkgeworCQkJcmV0dXJuIHRocm93bkV4Y2VwdGlvbjsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIGFNb25pdG9yKSB7CisJCQl0cnkgeworCQkJCXByZXBhcmVSZXNvdXJjZXNGb3JSZWZyZXNoKHJlc291cmNlcyk7CisJCQkJcHJpbVJlZnJlc2hGaWxlcyhmaWxlcyk7CisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQl0aHJvd25FeGNlcHRpb24gPSBlOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogQ29uc3RydWN0b3IgZm9yIFJlc291cmNlU3RhdGVWYWxpZGF0b3IuCisJICovCisJcHVibGljIFJlc291cmNlU3RhdGVWYWxpZGF0b3JJbXBsKFJlc291cmNlU3RhdGVJbnB1dFByb3ZpZGVyIGFQcm92aWRlcikgeworCQlwcm92aWRlciA9IGFQcm92aWRlcjsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHdoZW5ldmVyIDxjb2RlPmFMaXN0ZW5lcjwvY29kZT4gaXMgYWN0aXZhdGVkIChiZWNvbWVzIGFjdGl2ZSkuCisJICogVGhpcyB3aWxsIGNoZWNrIHRoZSB0aW1lc3RhbXBzIG9mIHRoZSB1bmRlcmx5aW5nIGZpbGVzIHRvIHNlZSBpZiB0aGV5IGFyZSBkaWZmZXJlbnQgZnJvbSB0aGUKKwkgKiBsYXN0IGNhY2hlZCBtb2RpZmllZCB2YWx1ZS4gPGNvZGU+YUxpc3RlbmVyPC9jb2RlPiBzaG91bGQgYmUgcHJlcGFyZWQgdG8gcHJvbXB0IHRoZSB1c2VyIGlmCisJICogdGhleSB3b3VsZCBsaWtlIHRvIHJlZnJlc2ggd2l0aCB0aGUgY29udGVudHMgb24gZGlzayBpZiB3ZSBhcmUgZGlydHkuCisJICovCisJcHVibGljIHZvaWQgY2hlY2tBY3RpdmF0aW9uKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIgcHJlc2VudGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCWNoZWNrQ29uc2lzdGVuY3kocHJlc2VudGVyKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBsb3N0QWN0aXZhdGlvbihSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyIHByZXNlbnRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQljaGVja0NvbnNpc3RlbmN5KHByZXNlbnRlcik7CisJfQorCisJcHVibGljIGJvb2xlYW4gY2hlY2tTYXZlKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIgcHJlc2VudGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCWlmIChwcmVzZW50ZXIgPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKCFwcm92aWRlci5pc0RpcnR5KCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCUxpc3QgaW5jb25zaXN0ZW50UmVzb3VyY2VzID0gZ2V0SW5jb25zaXN0ZW50UmVzb3VyY2VzKCk7CisJCUxpc3QgaW5jb25zaXN0ZW50RmlsZXMgPSBnZXRGaWxlcyhpbmNvbnNpc3RlbnRSZXNvdXJjZXMpOworCQlpbmNvbnNpc3RlbnRGaWxlcyA9IGFkZE90aGVySW5jb25zaXN0ZW50RmlsZXMoaW5jb25zaXN0ZW50RmlsZXMpOworCQlpZiAoaW5jb25zaXN0ZW50RmlsZXMgPT0gbnVsbCB8fCBpbmNvbnNpc3RlbnRGaWxlcy5pc0VtcHR5KCkpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJcmV0dXJuIHByZXNlbnRlci5wcm9tcHRGb3JJbmNvbnNpc3RlbnRGaWxlT3ZlcndyaXRlKGluY29uc2lzdGVudEZpbGVzKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIFJlc291cmNlU3RhdGVWYWxpZGF0b3IjY2hlY2tSZWFkT25seSgpCisJICovCisJcHVibGljIGJvb2xlYW4gY2hlY2tSZWFkT25seSgpIHsKKwkJYm9vbGVhbiByZXN1bHQgPSBjaGVja1JlYWRPbmx5UmVzb3VyY2VzKCk7CisJCWlmICghcmVzdWx0KQorCQkJcmVzdWx0ID0gY2hlY2tSZWFkT25seU5vblJlc291cmNlRmlsZXMoKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBNZXRob2QgY2hlY2tSZWFkT25seU5vblJlc291cmNlRmlsZXMuCisJICogCisJICogQHJldHVybiBib29sZWFuCisJICovCisJcHJpdmF0ZSBib29sZWFuIGNoZWNrUmVhZE9ubHlOb25SZXNvdXJjZUZpbGVzKCkgeworCQlMaXN0IGZpbGVzID0gcHJvdmlkZXIuZ2V0Tm9uUmVzb3VyY2VGaWxlcygpOworCQlpZiAoZmlsZXMgPT0gbnVsbCB8fCBmaWxlcy5pc0VtcHR5KCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWludCBzaXplID0gZmlsZXMuc2l6ZSgpOworCQlJRmlsZSBmaWxlID0gbnVsbDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCWZpbGUgPSAoSUZpbGUpIGZpbGVzLmdldChpKTsKKwkJCWlmIChmaWxlLmlzUmVhZE9ubHkoKSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogTWV0aG9kIGNoZWNrUmVhZE9ubHlSZXNvdXJjZXMuCisJICogCisJICogQHJldHVybiBib29sZWFuCisJICovCisJcHJpdmF0ZSBib29sZWFuIGNoZWNrUmVhZE9ubHlSZXNvdXJjZXMoKSB7CisJCUxpc3QgcmVzb3VyY2VzID0gcHJvdmlkZXIuZ2V0UmVzb3VyY2VzKCk7CisJCWlmIChyZXNvdXJjZXMgPT0gbnVsbCB8fCByZXNvdXJjZXMuaXNFbXB0eSgpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpbnQgc2l6ZSA9IHJlc291cmNlcy5zaXplKCk7CisJCVJlc291cmNlIHJlcyA9IG51bGw7CisJCUlGaWxlIGZpbGUgPSBudWxsOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJcmVzID0gKFJlc291cmNlKSByZXNvdXJjZXMuZ2V0KGkpOworCQkJZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUocmVzKTsKKwkJCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5pc1JlYWRPbmx5KCkpCisJCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXByb3RlY3RlZCB2b2lkIGNoZWNrQ29uc2lzdGVuY3koUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciBwcmVzZW50ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJaWYgKGlzQ2hlY2tpbmdDb25zaXN0ZW5jeSB8fCBwcmVzZW50ZXIgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJaXNDaGVja2luZ0NvbnNpc3RlbmN5ID0gdHJ1ZTsKKwkJdHJ5IHsKKwkJCUxpc3QgaW5jb25zaXN0ZW50UmVzb3VyY2VzID0gZ2V0SW5jb25zaXN0ZW50UmVzb3VyY2VzKCk7CisJCQlMaXN0IGluY29uc2lzdGVudEZpbGVzID0gZ2V0RmlsZXMoaW5jb25zaXN0ZW50UmVzb3VyY2VzKTsKKwkJCWluY29uc2lzdGVudEZpbGVzID0gYWRkT3RoZXJJbmNvbnNpc3RlbnRGaWxlcyhpbmNvbnNpc3RlbnRGaWxlcyk7CisJCQlpZiAoaW5jb25zaXN0ZW50RmlsZXMgPT0gbnVsbCB8fCBpbmNvbnNpc3RlbnRGaWxlcy5pc0VtcHR5KCkpCisJCQkJcmV0dXJuOworCQkJYm9vbGVhbiBzaG91bGRSZWZyZXNoRmlsZXMgPSB0cnVlOworCQkJLy9EZWZlY3QgMjA4NjU0ICYgMjA5NjMxIHdhbnQgcHJvbXB0IG5vIG1hdHRlciB3aGF0LgorCQkJaWYgKGFueUZpbGVDaGFuZ2VkU2luY2VMYXN0UmVmcmVzaFByb21wdChpbmNvbnNpc3RlbnRGaWxlcykpIHsKKwkJCQljbGVhckxhc3ROb25SZWZyZXNoU3RhdGVNYXAoKTsKKwkJCQlzaG91bGRSZWZyZXNoRmlsZXMgPSBwcmVzZW50ZXIucHJvbXB0Rm9ySW5jb25zaXN0ZW50RmlsZVJlZnJlc2goaW5jb25zaXN0ZW50RmlsZXMpOworCQkJfSBlbHNlCisJCQkJcmV0dXJuOworCQkJaWYgKHNob3VsZFJlZnJlc2hGaWxlcykKKwkJCQlyZWZyZXNoRmlsZXMoaW5jb25zaXN0ZW50RmlsZXMsIGluY29uc2lzdGVudFJlc291cmNlcyk7CisJCQllbHNlCisJCQkJY2FjaGVMYXN0Tm9uUmVmcmVzaEZpbGVTdGFtcHMoaW5jb25zaXN0ZW50RmlsZXMpOworCQl9IGZpbmFsbHkgeworCQkJaXNDaGVja2luZ0NvbnNpc3RlbmN5ID0gZmFsc2U7CisJCX0KKwl9CisKKwkvKioKKwkgKiBNZXRob2QgY2FjaGVMYXN0Tm9uUmVmcmVzaEZpbGVTdGFtcHMuCisJICogCisJICogQHBhcmFtIGluY29uc2lzdGVudEZpbGVzCisJICovCisJcHJpdmF0ZSB2b2lkIGNhY2hlTGFzdE5vblJlZnJlc2hGaWxlU3RhbXBzKExpc3QgaW5jb25zaXN0ZW50RmlsZXMpIHsKKwkJaWYgKGluY29uc2lzdGVudEZpbGVzICE9IG51bGwgJiYgIWluY29uc2lzdGVudEZpbGVzLmlzRW1wdHkoKSkgeworCQkJTWFwIG1hcCA9IGdldExhc3ROb25SZWZyZXNoU3RhdGVNYXAoKTsKKwkJCUlGaWxlIGZpbGUgPSBudWxsOworCQkJbG9uZyBzdGFtcCA9IDA7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGluY29uc2lzdGVudEZpbGVzLnNpemUoKTsgaSsrKSB7CisJCQkJZmlsZSA9IChJRmlsZSkgaW5jb25zaXN0ZW50RmlsZXMuZ2V0KGkpOworCQkJCXN0YW1wID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGZpbGUpOworCQkJCW1hcC5wdXQoZmlsZSwgbmV3IExvbmcoc3RhbXApKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIE1ldGhvZCBjYWNoZVZhbGlkYXRlU3RhdGUuCisJICogCisJICogQHBhcmFtIHJlc3VsdAorCSAqLworCXByaXZhdGUgdm9pZCBjYWNoZVZhbGlkYXRlU3RhdGUoSVN0YXR1cyBhU3RhdHVzLCBMaXN0IHJlYWRPbmx5UmVzb3VyY2VzLCBMaXN0IHJvTm9uUmVzb3VyY2VGaWxlcykgeworCQlpZiAoYVN0YXR1cy5pc09LKCkpIHsKKwkJCWlmIChyZWFkT25seVJlc291cmNlcyAhPSBudWxsICYmICFyZWFkT25seVJlc291cmNlcy5pc0VtcHR5KCkpIHsKKwkJCQlSZWZlcmVuY2VkUmVzb3VyY2UgcmVzID0gbnVsbDsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlYWRPbmx5UmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7CisJCQkJCXJlcyA9IChSZWZlcmVuY2VkUmVzb3VyY2UpIHJlYWRPbmx5UmVzb3VyY2VzLmdldChpKTsKKwkJCQkJV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuc2V0U3luaHJvbml6YXRpb25TdGFtcChyZXMsIGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChyZXMpKTsKKwkJCQl9CisJCQl9CisJCQlwcm92aWRlci5jYWNoZU5vblJlc291cmNlVmFsaWRhdGVTdGF0ZShyb05vblJlc291cmNlRmlsZXMpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGNsZWFyTGFzdE5vblJlZnJlc2hTdGF0ZU1hcCgpIHsKKwkJaWYgKGxhc3ROb25SZWZyZXNoU3RhdGVNYXAgIT0gbnVsbCkKKwkJCWxhc3ROb25SZWZyZXNoU3RhdGVNYXAuY2xlYXIoKTsKKwl9CisKKwkvKioKKwkgKiBNZXRob2QgYW55RmlsZUNoYW5nZWRTaW5jZUxhc3RSZWZyZXNoUHJvbXB0LgorCSAqIAorCSAqIEBwYXJhbSBpbmNvbnNpc3RlbnRGaWxlcworCSAqIEByZXR1cm4gYm9vbGVhbgorCSAqLworCXByaXZhdGUgYm9vbGVhbiBhbnlGaWxlQ2hhbmdlZFNpbmNlTGFzdFJlZnJlc2hQcm9tcHQoTGlzdCBpbmNvbnNpc3RlbnRGaWxlcykgeworCQlpZiAoaW5jb25zaXN0ZW50RmlsZXMgPT0gbnVsbCB8fCBpbmNvbnNpc3RlbnRGaWxlcy5pc0VtcHR5KCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChsYXN0Tm9uUmVmcmVzaFN0YXRlTWFwID09IG51bGwgfHwgbGFzdE5vblJlZnJlc2hTdGF0ZU1hcC5pc0VtcHR5KCkpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJaW50IHNpemUgPSBpbmNvbnNpc3RlbnRGaWxlcy5zaXplKCk7CisJCUlGaWxlIGZpbGUgPSBudWxsOworCQlMb25nIHN0YW1wID0gbnVsbDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCWZpbGUgPSAoSUZpbGUpIGluY29uc2lzdGVudEZpbGVzLmdldChpKTsKKwkJCXN0YW1wID0gKExvbmcpIGdldExhc3ROb25SZWZyZXNoU3RhdGVNYXAoKS5nZXQoZmlsZSk7CisJCQlpZiAoc3RhbXAgPT0gbnVsbCB8fCAoc3RhbXAubG9uZ1ZhbHVlKCkgIT0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGZpbGUpKSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHJvdGVjdGVkIExpc3QgYWRkT3RoZXJJbmNvbnNpc3RlbnRGaWxlcyhMaXN0IGluY29uc2lzdGVudEZpbGVzKSB7CisJCWlmIChpbmNvbnNpc3RlbnRGaWxlcyA9PSBudWxsIHx8IGluY29uc2lzdGVudEZpbGVzLmlzRW1wdHkoKSkKKwkJCXJldHVybiBnZXROb25SZXNvdXJjZUluY29uc2lzdGVudEZpbGVzKCk7CisJCUxpc3Qgbm9uUmVzRmlsZXMgPSBnZXROb25SZXNvdXJjZUluY29uc2lzdGVudEZpbGVzKCk7CisJCWlmIChub25SZXNGaWxlcyAhPSBudWxsKQorCQkJaW5jb25zaXN0ZW50RmlsZXMuYWRkQWxsKG5vblJlc0ZpbGVzKTsKKwkJcmV0dXJuIGluY29uc2lzdGVudEZpbGVzOworCX0KKworCS8qKgorCSAqIE1ldGhvZCBnZXROb25SZXNvdXJjZUluY29uc2lzdGVudEZpbGVzLgorCSAqIAorCSAqIEByZXR1cm4gTGlzdAorCSAqLworCXByaXZhdGUgTGlzdCBnZXROb25SZXNvdXJjZUluY29uc2lzdGVudEZpbGVzKCkgeworCQlMaXN0IGZpbGVzID0gcHJvdmlkZXIuZ2V0Tm9uUmVzb3VyY2VJbmNvbnNpc3RlbnRGaWxlcygpOworCQlpZiAoZmlsZXMgIT0gbnVsbCAmJiAhZmlsZXMuaXNFbXB0eSgpKQorCQkJcmV0dXJuIGZpbGVzOworCQkvL0RldGVybWluZSBjb25zaXN0ZW5jeSBiYXNlZCBvbiB0aGUgc3luY2hyb25pemF0aW9uIG9mIHRoZSBJRmlsZQorCQlmaWxlcyA9IHByb3ZpZGVyLmdldE5vblJlc291cmNlRmlsZXMoKTsKKwkJaWYgKGZpbGVzID09IG51bGwgfHwgZmlsZXMuaXNFbXB0eSgpKQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CisJCUxpc3QgaW5jb25zaXN0ZW50ID0gbnVsbDsKKwkJaW50IHNpemUgPSBmaWxlcy5zaXplKCk7CisJCUlGaWxlIGZpbGUgPSBudWxsOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJZmlsZSA9IChJRmlsZSkgZmlsZXMuZ2V0KGkpOworCQkJaWYgKGZpbGUuaXNBY2Nlc3NpYmxlKCkgJiYgIWZpbGUuaXNTeW5jaHJvbml6ZWQoSVJlc291cmNlLkRFUFRIX1pFUk8pKSB7CisJCQkJaWYgKGluY29uc2lzdGVudCA9PSBudWxsKQorCQkJCQlpbmNvbnNpc3RlbnQgPSBuZXcgQXJyYXlMaXN0KCk7CisJCQkJaW5jb25zaXN0ZW50LmFkZChmaWxlKTsKKwkJCX0KKwkJfQorCQlpZiAoaW5jb25zaXN0ZW50ID09IG51bGwpCisJCQlpbmNvbnNpc3RlbnQgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOworCQlyZXR1cm4gaW5jb25zaXN0ZW50OworCX0KKworCXByb3RlY3RlZCBMaXN0IGdldEluY29uc2lzdGVudFJlc291cmNlcygpIHsKKwkJTGlzdCBtb2ZSZXNvdXJjZXMgPSBwcm92aWRlci5nZXRSZXNvdXJjZXMoKTsKKwkJTGlzdCBpbmNvbnNpc3RlbnQgPSBudWxsOworCQlpbnQgc2l6ZSA9IG1vZlJlc291cmNlcy5zaXplKCk7CisJCVJlc291cmNlIHJlcyA9IG51bGw7CisJCVJlZmVyZW5jZWRSZXNvdXJjZSByZWZSZXMgPSBudWxsOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJcmVzID0gKFJlc291cmNlKSBtb2ZSZXNvdXJjZXMuZ2V0KGkpOworCQkJaWYgKFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmlzUmVmZXJlbmNlZFJlc291cmNlKHJlcykpIHsKKwkJCQlyZWZSZXMgPSAoUmVmZXJlbmNlZFJlc291cmNlKSByZXM7CisJCQkJaWYgKCFXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5pc0NvbnNpc3RlbnQocmVmUmVzKSAmJiAocmVmUmVzLmlzTG9hZGVkKCkgJiYgIXJlZlJlcy5pc05ldygpKSkgeworCQkJCQlpZiAoaW5jb25zaXN0ZW50ID09IG51bGwpCisJCQkJCQlpbmNvbnNpc3RlbnQgPSBuZXcgQXJyYXlMaXN0KCk7CisJCQkJCWluY29uc2lzdGVudC5hZGQocmVmUmVzKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKGluY29uc2lzdGVudCA9PSBudWxsKQorCQkJaW5jb25zaXN0ZW50ID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKKwkJcmV0dXJuIGluY29uc2lzdGVudDsKKwl9CisKKwlwcm90ZWN0ZWQgTGlzdCBnZXRGaWxlcyhMaXN0IHJlZlJlc291cmNlcykgeworCQlMaXN0IGZpbGVzID0gbmV3IEFycmF5TGlzdChyZWZSZXNvdXJjZXMuc2l6ZSgpKTsKKwkJSUZpbGUgZmlsZSA9IG51bGw7CisJCVJlZmVyZW5jZWRSZXNvdXJjZSByZWZSZXMgPSBudWxsOworCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZlJlc291cmNlcy5zaXplKCk7IGkrKykgeworCQkJcmVmUmVzID0gKFJlZmVyZW5jZWRSZXNvdXJjZSkgcmVmUmVzb3VyY2VzLmdldChpKTsKKwkJCWZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHJlZlJlcyk7CisJCQlpZiAoZmlsZSAhPSBudWxsKQorCQkJCWZpbGVzLmFkZChmaWxlKTsKKwkJfQorCQlyZXR1cm4gZmlsZXM7CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBhdCBsZWFzdCB0aGUgZmlyc3QgdGltZSBhIFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIKKwkgKiBiZWNvbWVzIGFjdGl2ZSBhbmQgaXMgYWJvdXQgdG8gZWRpdCBpdHMgY29udGVudHMuIFRoZSByZXR1cm5lZCBJU3RhdHVzIG1heSBoYXZlIGFuIEVSUk9SCisJICogc3RhdHVzIHdoaWNoIHNob3VsZCBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuCisJICovCisJcHVibGljIElTdGF0dXMgdmFsaWRhdGVTdGF0ZShSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyIHByZXNlbnRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlMaXN0IHJvUmVzb3VyY2VzLCBub25SZXNST0ZpbGVzLCByb0ZpbGVzID0gbnVsbDsKKwkJTGlzdFtdIHJlYWRPbmx5ID0gc2VsZWN0UmVhZE9ubHlSZXNvdXJjZXMocHJvdmlkZXIuZ2V0UmVzb3VyY2VzKCkpOworCQlyb1Jlc291cmNlcyA9IHJlYWRPbmx5WzBdOworCQlyb0ZpbGVzID0gcmVhZE9ubHlbMV07CisJCW5vblJlc1JPRmlsZXMgPSBzZWxlY3RSZWFkT25seUZpbGVzKHByb3ZpZGVyLmdldE5vblJlc291cmNlRmlsZXMoKSk7CisJCWlmIChub25SZXNST0ZpbGVzICE9IG51bGwpIHsKKwkJCWlmIChyb0ZpbGVzID09IG51bGwpCisJCQkJcm9GaWxlcyA9IG5vblJlc1JPRmlsZXM7CisJCQllbHNlCisJCQkJcm9GaWxlcy5hZGRBbGwobm9uUmVzUk9GaWxlcyk7CisJCX0KKwkJaWYgKHJvRmlsZXMgPT0gbnVsbCB8fCByb0ZpbGVzLmlzRW1wdHkoKSkKKwkJCXJldHVybiBPS19TVEFUVVM7CisJCUlGaWxlW10gZmlsZXMgPSBuZXcgSUZpbGVbcm9GaWxlcy5zaXplKCldOworCQlyb0ZpbGVzLnRvQXJyYXkoZmlsZXMpOworCQlPYmplY3QgY3R4ID0gcHJlc2VudGVyICE9IG51bGwgPyBwcmVzZW50ZXIuZ2V0VmFsaWRhdGVFZGl0Q29udGV4dCgpIDogbnVsbDsKKwkJSVN0YXR1cyByZXN1bHQgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVFZGl0KGZpbGVzLCBjdHgpOworCQljYWNoZVZhbGlkYXRlU3RhdGUocmVzdWx0LCByb1Jlc291cmNlcywgbm9uUmVzUk9GaWxlcyk7CisJCWlmICghcmVzdWx0LmlzT0soKSkKKwkJCWNoZWNrQ29uc2lzdGVuY3kocHJlc2VudGVyKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBNZXRob2Qgc2VsZWN0UmVhZE9ubHlGaWxlcy4KKwkgKiAKKwkgKiBAcGFyYW0gbGlzdAorCSAqIEBwYXJhbSByb0ZpbGVzCisJICovCisJcHJpdmF0ZSBMaXN0IHNlbGVjdFJlYWRPbmx5RmlsZXMoTGlzdCBmaWxlcykgeworCQlpZiAoZmlsZXMgPT0gbnVsbCB8fCBmaWxlcy5pc0VtcHR5KCkpCisJCQlyZXR1cm4gZmlsZXM7CisJCWludCBzaXplID0gZmlsZXMuc2l6ZSgpOworCQlMaXN0IHJlYWRPbmx5ID0gbnVsbDsKKwkJSUZpbGUgZmlsZSA9IG51bGw7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQlmaWxlID0gKElGaWxlKSBmaWxlcy5nZXQoaSk7CisJCQlpZiAoZmlsZS5pc1JlYWRPbmx5KCkpIHsKKwkJCQlpZiAocmVhZE9ubHkgPT0gbnVsbCkKKwkJCQkJcmVhZE9ubHkgPSBuZXcgQXJyYXlMaXN0KHNpemUpOworCQkJCXJlYWRPbmx5LmFkZChmaWxlKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVhZE9ubHk7CisJfQorCisJLyoqCisJICogTWV0aG9kIHNlbGVjdFJlYWRPbmx5UmVzb3VyY2VzLgorCSAqIAorCSAqIEBwYXJhbSBsaXN0CisJICogQHBhcmFtIHJvRmlsZXMKKwkgKiBAcmV0dXJuIExpc3QKKwkgKi8KKwlwcml2YXRlIExpc3RbXSBzZWxlY3RSZWFkT25seVJlc291cmNlcyhMaXN0IHJlc291cmNlcykgeworCQlpZiAocmVzb3VyY2VzID09IG51bGwgfHwgcmVzb3VyY2VzLmlzRW1wdHkoKSkKKwkJCXJldHVybiBuZXcgTGlzdFtde3Jlc291cmNlcywgbnVsbH07CisJCUlGaWxlIGZpbGUgPSBudWxsOworCQlpbnQgc2l6ZSA9IHJlc291cmNlcy5zaXplKCk7CisJCVJlc291cmNlIHJlcyA9IG51bGw7CisJCUxpc3QgcmVhZE9ubHkgPSBudWxsOworCQlMaXN0IHJvRmlsZXMgPSBudWxsOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJcmVzID0gKFJlc291cmNlKSByZXNvdXJjZXMuZ2V0KGkpOworCQkJZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUocmVzKTsKKwkJCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5pc1JlYWRPbmx5KCkpIHsKKwkJCQlpZiAocmVhZE9ubHkgPT0gbnVsbCkKKwkJCQkJcmVhZE9ubHkgPSBuZXcgQXJyYXlMaXN0KHNpemUpOworCQkJCXJlYWRPbmx5LmFkZChyZXMpOworCQkJCWlmIChyb0ZpbGVzID09IG51bGwpCisJCQkJCXJvRmlsZXMgPSBuZXcgQXJyYXlMaXN0KHNpemUpOworCQkJCXJvRmlsZXMuYWRkKGZpbGUpOworCQkJfQorCQl9CisJCXJldHVybiBuZXcgTGlzdFtde3JlYWRPbmx5LCByb0ZpbGVzfTsKKwl9CisKKwlwcm90ZWN0ZWQgbG9uZyBjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoUmVmZXJlbmNlZFJlc291cmNlIHJlc291cmNlKSB7CisJCXJldHVybiBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5jb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAocmVzb3VyY2UpOworCX0KKworCisJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZpbGVzKExpc3Qgc29tZUZpbGVzLCBMaXN0IGluY29uc2l0ZW50UmVzb3VyY2VzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCVJlZnJlc2hSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSZWZyZXNoUnVubmFibGUoc29tZUZpbGVzLCBpbmNvbnNpdGVudFJlc291cmNlcyk7CisJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4ocnVubmFibGUsIG51bGwpOworCQlpZiAocnVubmFibGUuZ2V0VGhyb3duRXhjZXB0aW9uKCkgIT0gbnVsbCkKKwkJCXRocm93IHJ1bm5hYmxlLmdldFRocm93bkV4Y2VwdGlvbigpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHByaW1SZWZyZXNoRmlsZXMoTGlzdCBzb21lRmlsZXMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJaW50IHNpemUgPSBzb21lRmlsZXMuc2l6ZSgpOworCQlJRmlsZSBmaWxlID0gbnVsbDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCWZpbGUgPSAoSUZpbGUpIHNvbWVGaWxlcy5nZXQoaSk7CisJCQlpZiAoIWZpbGUuaXNTeW5jaHJvbml6ZWQoSVJlc291cmNlLkRFUFRIX1pFUk8pKQorCQkJCWZpbGUucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9PTkUsIG51bGwpOworCQkJZWxzZQorCQkJCXJlZnJlc2hSZXNvdXJjZShmaWxlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBSZXNvdXJjZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5maWxlPC9jb2RlPiB0byBmb3JjZSBhCisJICogcmVmcmVzaC4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoUmVzb3VyY2UoSUZpbGUgZmlsZSkgeworCQlSZXNvdXJjZSByZXMgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UmVzb3VyY2UoZmlsZSk7CisJCWlmIChyZXMgIT0gbnVsbCkKKwkJCXJlcy51bmxvYWQoKTsKKwl9CisKKwkvKioKKwkgKiBGb3JjZSB0aGUgcmVzb3VyY2VzIHRvIG5vdCBiZSBkaXJ0eSB0byBlbnN1cmUgdGhhdCB0aGV5IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZWlyCisJICogUmVzb3VyY2VTZXQgd2hlbiB0aGVpciBmaWxlIGlzIHJlZnJlc2hlZC4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBwcmVwYXJlUmVzb3VyY2VzRm9yUmVmcmVzaChMaXN0IHJlZlJlc291cmNlcykgeworCQlSZWZlcmVuY2VkUmVzb3VyY2UgcmVzID0gbnVsbDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZSZXNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKKwkJCXJlcyA9IChSZWZlcmVuY2VkUmVzb3VyY2UpIHJlZlJlc291cmNlcy5nZXQoaSk7CisJCQlyZXMuc2V0Rm9yY2VSZWZyZXNoKHRydWUpOworCQl9CisJfQorCisJLyoqCisJICogR2V0cyB0aGUgbGFzdE5vblJlZnJlc2hTdGF0ZU1hcC4KKwkgKiAKKwkgKiBAcmV0dXJuIFJldHVybnMgYSBNYXAKKwkgKi8KKwlwcm90ZWN0ZWQgTWFwIGdldExhc3ROb25SZWZyZXNoU3RhdGVNYXAoKSB7CisJCWlmIChsYXN0Tm9uUmVmcmVzaFN0YXRlTWFwID09IG51bGwpCisJCQlsYXN0Tm9uUmVmcmVzaFN0YXRlTWFwID0gbmV3IEhhc2hNYXAoKTsKKwkJcmV0dXJuIGxhc3ROb25SZWZyZXNoU3RhdGVNYXA7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvdmFsaWRhdGVlZGl0L1Jlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9SZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc1NDVkMwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9SZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQorICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQ7CisKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CisKK3B1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciB7CisJLyoqCisJICogUHJlc2VudCB0byB0aGUgdXNlciB0aGF0IHRoZSA8Y29kZT5pbmNvbnNpc3RlbnRGaWxlczwvY29kZT4gd2lsbCBuZWVkIHRvIGJlIHJlZnJlc2hlZCBpbgorCSAqIHRoZSB3b3JrYmVuY2guIFJldHVybiB0cnVlIGlmIHRoZSByZWZyZXNoIHNob3VsZCBvY2N1ci4gVGhlIExpc3Qgd2lsbCBiZSBhIGxpc3Qgb2YgSUZpbGVzLgorCSAqIAorCSAqIEBwYXJhbSBpbmNvbnNpc3RlbnRGaWxlcworCSAqIEByZXR1cm4gYm9vbGVhbgorCSAqLworCWJvb2xlYW4gcHJvbXB0Rm9ySW5jb25zaXN0ZW50RmlsZVJlZnJlc2goTGlzdCBpbmNvbnNpc3RlbnRGaWxlcyk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGNvbnRleHQgKFNoZWxsKSB0aGF0IHdvdWxkIGJlIHBhc3NlZCB0byB0aGUgdmFsaWRhdGVFZGl0IG1ldGhvZC4gSWYgdGhpcyBtZXRob2QKKwkgKiByZXR1cm5zIG51bGwsIGEgcHJvbXB0IHRvIGNoZWNrIG91dCBjb2RlIHdpbGwgbm90IGJlIHByZXNlbnRlZCB0byB0aGUgdXNlci4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2UjdmFsaWRhdGVFZGl0KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlW10sCisJICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCU9iamVjdCBnZXRWYWxpZGF0ZUVkaXRDb250ZXh0KCk7CisKKwkvKioKKwkgKiBQcmVzZW50IGEgZGlhbG9nIHRvIHRoZSB1c2VyIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIHVzZXIgaXMgYWJvdXQgdG8gc2F2ZSBhbmQgb3ZlcndyaXRlIHRoZQorCSAqIGxpc3Qgb2YgPGNvZGU+aW5jb25zaXRlbnRGaWxlczwvY29kZXM+LiAgUmV0dXJuIHRydWUgaWYKKwkgKiB0aGUgb3ZlcndyaXRlIHNob3VsZCBwcm9jZWVkLiAgVGhlIGxpc3Qgb2YgPGNvZGU+aW5jb25zaXRlbnRGaWxlczwvY29kZXM+IHdpbGwKKwkgKiBiZSBhIGxpc3Qgb2YgSUZpbGVzLiAKKwkgKiBAcGFyYW0gaW5jb25zaXN0ZW50RmlsZXMKKwkgKiBAcmV0dXJuIGJvb2xlYW4KKwkgKi8KKwlib29sZWFuIHByb21wdEZvckluY29uc2lzdGVudEZpbGVPdmVyd3JpdGUoTGlzdCBpbmNvbnNpc3RlbnRGaWxlcyk7CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGJ5IGFueSBhY3Rpb24gdGhhdCBpcyBhYm91dCB0byBlZGl0IGFueSBjb250ZW50cyBvZiBhbnkgSUZpbGUuCisJICovCisJcHVibGljIElTdGF0dXMgdmFsaWRhdGVTdGF0ZSgpOworfQorCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC92YWxpZGF0ZWVkaXQvVmFsaWRhdGVFZGl0SGVhZGxlc3NDb250ZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ludGVybmFsL2VtZndvcmtiZW5jaC92YWxpZGF0ZWVkaXQvVmFsaWRhdGVFZGl0SGVhZGxlc3NDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFlZmUwMwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1md29ya2JlbmNoL3ZhbGlkYXRlZWRpdC9WYWxpZGF0ZUVkaXRIZWFkbGVzc0NvbnRleHQuamF2YQpAQCAtMCwwICsxLDk3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBDcmVhdGVkIG9uIE1heSAxOCwgMjAwNAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWw7CisKKworLyoqCisgKiBAYXV0aG9yIGpsYW51dGkgSGVhZGxlc3MgVmFsaWRhdGUgRWRpdCBDb250ZXh0IEltcGxlbWVudGF0aW9uCisgKi8KK3B1YmxpYyBjbGFzcyBWYWxpZGF0ZUVkaXRIZWFkbGVzc0NvbnRleHQgaW1wbGVtZW50cyBJVmFsaWRhdGVFZGl0Q29udGV4dCB7CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBmTmVlZHNTdGF0ZVZhbGlkYXRpb24gPSB0cnVlOworCXByb3RlY3RlZCBib29sZWFuIGZNZXNzYWdlVXAgPSBmYWxzZTsKKwlwcm90ZWN0ZWQgRWRpdE1vZGVsIGZWYWxpZGF0b3IgPSBudWxsOworCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuSVZhbGlkYXRlRWRpdENvbnRleHQjdmFsaWRhdGVTdGF0ZSgpCisJICovCisJcHVibGljIElTdGF0dXMgdmFsaWRhdGVTdGF0ZSgpIHsKKwkJLy8gRm9yIG5vdyBkbyBub3RoaW5nIGluIGhlYWRsZXNzIHN0YXRlCisJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0LlJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIjZ2V0VmFsaWRhdGVFZGl0Q29udGV4dCgpCisJICovCisJcHVibGljIE9iamVjdCBnZXRWYWxpZGF0ZUVkaXRDb250ZXh0KCkgeworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCXJldHVybiBudWxsOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0LlJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIjcHJvbXB0Rm9ySW5jb25zaXN0ZW50RmlsZU92ZXJ3cml0ZShqYXZhLnV0aWwuTGlzdCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBwcm9tcHRGb3JJbmNvbnNpc3RlbnRGaWxlT3ZlcndyaXRlKExpc3QgaW5jb25zaXN0ZW50RmlsZXMpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciNwcm9tcHRGb3JJbmNvbnNpc3RlbnRGaWxlUmVmcmVzaChqYXZhLnV0aWwuTGlzdCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBwcm9tcHRGb3JJbmNvbnNpc3RlbnRGaWxlUmVmcmVzaChMaXN0IGluY29uc2lzdGVudEZpbGVzKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIEBzZWUgSVZhbGlkYXRlRWRpdExpc3RlbmVyI3NldE5lZWRzU3RhdGVWYWxpZGF0aW9uKGJvb2xlYW4pCisJICovCisJcHVibGljIHZvaWQgc2V0TmVlZHNTdGF0ZVZhbGlkYXRpb24oYm9vbGVhbiBuZWVkc1N0YXRlVmFsaWRhdGlvbikgeworCQlmTmVlZHNTdGF0ZVZhbGlkYXRpb24gPSBuZWVkc1N0YXRlVmFsaWRhdGlvbjsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdC5JVmFsaWRhdGVFZGl0Q29udGV4dCNzZXRFZGl0TW9kZWwob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsKQorCSAqLworCXB1YmxpYyB2b2lkIHNldEVkaXRNb2RlbChFZGl0TW9kZWwgZlZhbGlkYXRvcikgeworCQl0aGlzLmZWYWxpZGF0b3IgPSBmVmFsaWRhdG9yOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0LklWYWxpZGF0ZUVkaXRDb250ZXh0I3ZhbGlkYXRlU3RhdGUob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsKQorCSAqLworCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlU3RhdGUoRWRpdE1vZGVsIGVkaXRNb2RlbCkgeworCQlzZXRFZGl0TW9kZWwoZWRpdE1vZGVsKTsKKwkJcmV0dXJuIHZhbGlkYXRlU3RhdGUoKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL01vZHVsZVN0cnVjdHVyYWxNb2RlbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL01vZHVsZVN0cnVjdHVyYWxNb2RlbC5qYXZhCmluZGV4IGI5NzQyNjguLjJiZGFjYjEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9Nb2R1bGVTdHJ1Y3R1cmFsTW9kZWwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvTW9kdWxlU3RydWN0dXJhbE1vZGVsLmphdmEKQEAgLTI3NCw2ICsyNzQsMjQgQEAKIAkJCXJldHVybiB0cnVlOwogCQllbHNlIHJldHVybiBjb21wb25lbnRGaWxlLmlzU3luY2hyb25pemVkKElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKIAl9CisJCisJcHVibGljIElGaWxlIGdldENvbXBvbmVudEZpbGUoKSB7CisJCUlGaWxlIGNvbXBGaWxlID0gZ2V0UHJvamVjdCgpLmdldEZpbGUoU3RydWN0dXJlRWRpdC5NT0RVTEVfTUVUQV9GSUxFX05BTUUpOworCQlpZiAoY29tcEZpbGUuaXNBY2Nlc3NpYmxlKCkpCisJCQlyZXR1cm4gY29tcEZpbGU7CisJCWVsc2UgeyAvL05lZWQgdG8gY2hlY2sgZm9yIGxlZ2FjeSBmaWxlIGxvY2F0aW9ucyBhbHNvLi4uLgorCQkJY29tcEZpbGUgPSBnZXRQcm9qZWN0KCkuZ2V0RmlsZShNb2R1bGVTdHJ1Y3R1cmFsTW9kZWwuUjFfTU9EVUxFX01FVEFfRklMRV9OQU1FKTsKKwkJCWlmIChjb21wRmlsZS5pc0FjY2Vzc2libGUoKSkKKwkJCQlyZXR1cm4gY29tcEZpbGU7CisJCQllbHNlIHsKKwkJCQljb21wRmlsZSA9IGdldFByb2plY3QoKS5nZXRGaWxlKE1vZHVsZVN0cnVjdHVyYWxNb2RlbC5SMF83X01PRFVMRV9NRVRBX0ZJTEVfTkFNRSk7CisJCQkJaWYgKGNvbXBGaWxlLmlzQWNjZXNzaWJsZSgpKQorCQkJCQlyZXR1cm4gY29tcEZpbGU7CisJCQl9CisJCX0KKwkJcmV0dXJuIGdldFByb2plY3QoKS5nZXRGaWxlKFN0cnVjdHVyZUVkaXQuTU9EVUxFX01FVEFfRklMRV9OQU1FKTsKKwl9CisJCiAJcHVibGljIFdUUE1vZHVsZXNSZXNvdXJjZSAgbWFrZVdUUE1vZHVsZXNSZXNvdXJjZSgpIHsKIAkJcmV0dXJuIChXVFBNb2R1bGVzUmVzb3VyY2UpIGNyZWF0ZVJlc291cmNlKFdUUE1vZHVsZXNSZXNvdXJjZUZhY3RvcnkuV1RQX01PRFVMRVNfVVJJX09CSik7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL1N0cnVjdHVyZUVkaXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9TdHJ1Y3R1cmVFZGl0LmphdmEKaW5kZXggMzg5MWNlNi4uOWIwNGIwMCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL1N0cnVjdHVyZUVkaXQuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvU3RydWN0dXJlRWRpdC5qYXZhCkBAIC0xMSw2ICsxMSw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsOwogCitpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKQEAgLTE4LDYgKzE5LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKQEAgLTQzNSwxMCArNDM3LDI1IEBACiAJICogdG8gYWRkIG9yIHJlbW92ZSB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9cy4gSWYgYSBjbGllbnQgbmVlZHMgdG8ganVzdCByZWFkIHRoZSBleGlzdGluZwogCSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH1zLCB1c2Uge0BzZWUgI2dldFdvcmtiZW5jaE1vZHVsZXMoKX0uCiAJICogPC9wPgorCSAqIDxwPgorCSAqIERlYWRsb2NrIFdhcm5pbmc6IENhbGxpbmcgdGhpcyBtZXRob2QgcmVxdWlyZXMgdHdvIGxvY2tzLiAgRmlyc3QgdGhlIGNvbXBvbmVudCBmaWxlJ3MgZmlsZSBsb2NrCisJICogaXMgcmVxdWlyZWQgYW5kIHRoZW4gdGhlIEVNRldvcmtiZW5jaEVkaXRDb250ZXh0RmFjdG9yeSdzIHByb2plY3RJTG9jayBpcyByZXF1aXJlZC4gIElmIGFub3RoZXIKKwkgKiB0aHJlYWQgYWNxdWlyZXMgdGhlc2Ugc2FtZSB0d28gbG9ja3MgaW4gdGhlIG9wcG9zaXRlIG9yZGVyLCBkZWFkbG9jayBjb3VsZCBvY2N1ci4KKwkgKiA8L3A+CiAJICogCiAJICogQHJldHVybiBUaGUgcm9vdCBvYmplY3Qgb2YgdGhlIHVuZGVybHlpbmcgbW9kZWwKIAkgKi8KIAlwdWJsaWMgUHJvamVjdENvbXBvbmVudHMgZ2V0Q29tcG9uZW50TW9kZWxSb290KCkgeworCQlJRmlsZSBmaWxlID0gc3RydWN0dXJhbE1vZGVsLmdldENvbXBvbmVudEZpbGUoKTsKKwkJaWYgKCFmaWxlLmlzU3luY2hyb25pemVkKElSZXNvdXJjZS5ERVBUSF9PTkUpKSB7CisJCQl0cnkgeworCQkJCUZpbGUgaW9maWxlID0gZmlsZS5nZXRGdWxsUGF0aCgpLnRvRmlsZSgpOworCQkJCWlmIChpb2ZpbGUuZXhpc3RzKCkgfHwgZmlsZS5leGlzdHMoKSkKKwkJCQkJZmlsZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX09ORSwgbnVsbCk7CisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQkJLy9pZ25vcmUKKwkJCX0KKwkJfQkKIAkJUHJvamVjdENvbXBvbmVudHMgY29tcHMgPSBudWxsOwogCQlJTG9jayBsb2NrID0gRU1GV29ya2JlbmNoRWRpdENvbnRleHRGYWN0b3J5LmdldFByb2plY3RMb2NrT2JqZWN0KHN0cnVjdHVyYWxNb2RlbC5nZXRQcm9qZWN0KCkpOwogCQl0cnl7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9XVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUvbW9kdWxlY29yZS1zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL2ltcGwvV1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuamF2YQppbmRleCA4YzExMzZkLi5lY2RiMTAwIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS9tb2R1bGVjb3JlLXNyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvaW1wbC9XVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlL21vZHVsZWNvcmUtc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC9pbXBsL1dUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LmphdmEKQEAgLTI3Miw3ICsyNzIsNyBAQAogCXByaXZhdGUgY2xhc3MgUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciBpbXBsZW1lbnRzIElSZXNvdXJjZUZhY3RvcnlFeHRQdENvbnN0YW50cyB7IAogIAkJCiAJCXB1YmxpYyBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeVJlYWRlcigpIHsKLQkJCXN1cGVyKFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCksIE1vZHVsZWNvcmVQbHVnaW4uUExVR0lOX0lELCBFWFRQVF9SRVNPVVJDRV9GQUNUT1JJRVMpOworCQkJc3VwZXIoTW9kdWxlY29yZVBsdWdpbi5QTFVHSU5fSUQsIEVYVFBUX1JFU09VUkNFX0ZBQ1RPUklFUyk7CiAJCX0KIAogCQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhY2RkYTYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLy5jbGFzc3BhdGgKQEAgLTAsMCArMSw5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGNsYXNzcGF0aD4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ2YWxpZGF0ZXVpIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZXMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ2ZjIiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvLmN2c2lnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzlmOGY0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS8uY3ZzaWdub3JlCkBAIC0wLDAgKzEsNyBAQAorYmluCit0ZW1wLmZvbGRlcgorYnVpbGQueG1sCitydW50aW1lCitAZG90CitzcmMuemlwCitqYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjQ3MWY2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS8ucHJvamVjdApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aTwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMDZhZGUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpAQCAtMCwwICsxLDMgQEAKKyNNb24gTWF5IDA4IDA5OjI0OjU2IEVEVCAyMDA2CitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YxZmUyNAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0wLDAgKzEsNzEgQEAKKyNUdWUgRmViIDEyIDEyOjMwOjQ2IEVTVCAyMDA4CitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50UHJlZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRTdWZmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFByZWZpeGVzPV8KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFN1ZmZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsUHJlZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxTdWZmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFByZWZpeGVzPV8KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFN1ZmZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjM4ZDZjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCkBAIC0wLDAgKzEsNiBAQAorI1R1ZSBGZWIgMTIgMTI6MzA6NDYgRVNUIDIwMDgKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitvcmcuZWNsaXBzZS5qZHQudWkuZXhjZXB0aW9uLm5hbWU9ZQorb3JnLmVjbGlwc2UuamR0LnVpLmdldHRlcnNldHRlci51c2UuaXM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LnVpLmtleXdvcmR0aGlzPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQudWkub3ZlcnJpZGVhbm5vdGF0aW9uPXRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMGRkMjYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0wLDAgKzEsMjEgQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMAorQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgorQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCitCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aTsgc2luZ2xldG9uOj10cnVlCitCdW5kbGUtVmVyc2lvbjogMS4yLjQucXVhbGlmaWVyCitCdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC51aS5wbHVnaW4uVmFsaWRhdGlvblVJUGx1Z2luCitCdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCitCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC51aTt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnVpLnBsdWdpbjt4LWludGVybmFsOj10cnVlCitSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKKyBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCisgb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAorIG9yZy5lY2xpcHNlLnN3dDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCisgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAorIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCisgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAorIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKKyBvcmcuZWNsaXBzZS51aS5mb3JtcztidW5kbGUtdmVyc2lvbj0iWzMuMy4xMDAsNC4wLjApIgorQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKK0J1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9hYm91dC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxOTlkZjMKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL2Fib3V0Lmh0bWwKQEAgLTAsMCArMSwzNCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgorPEhUTUw+CisKKzxoZWFkPgorPHRpdGxlPkFib3V0PC90aXRsZT4KKzxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKzwvaGVhZD4KKworPEJPRFkgbGFuZz0iRU4tVVMiPgorCis8SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KKworPFA+SnVuZSwgMjAwODwvUD4KKworPEgzPkxpY2Vuc2U8L0gzPgorCis8UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCisoIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKK3VuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKKygiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAorPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKK0ZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KKworPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCitDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAordGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCitDaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKK2xpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAordGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCithbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKKzxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgorCis8L0JPRFk+Cis8L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc0OWNjZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDIwIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMKKyMgQ29udHJpYnV0b3JzOgorIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2Jpbi5pbmNsdWRlcyA9IC4sXAorICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCisgICAgICAgICAgICAgICBNRVRBLUlORi8sXAorICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCisgICAgICAgICAgICAgICBpY29ucy8sXAorICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKK3NvdXJjZS4uID0gdmFsaWRhdGV1aS8sXAorICAgICAgICAgICBwcm9wZXJ0eV9maWxlcy8sXAorICAgICAgICAgICB2ZjIvCitvdXRwdXQuLiA9IGJpbi8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvaWNvbnMvZmFpbF90YmwuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9pY29ucy9mYWlsX3RibC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJkOWIwYwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvaWNvbnMvZmFpbF90YmwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvaWNvbnMvZmFpbF90YmxfZGlzYWJsZWQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9pY29ucy9mYWlsX3RibF9kaXNhYmxlZC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEzMzNhMQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvaWNvbnMvZmFpbF90YmxfZGlzYWJsZWQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvaWNvbnMvb2tfdGJsLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvaWNvbnMvb2tfdGJsLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2FjYjk2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9pY29ucy9va190YmwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvaWNvbnMvb2tfdGJsX2Rpc2FibGVkLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvaWNvbnMvb2tfdGJsX2Rpc2FibGVkLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDg5MDBiCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9pY29ucy9va190YmxfZGlzYWJsZWQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvaWNvbnMvc2V0dGluZ3MuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9pY29ucy9zZXR0aW5ncy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM5OWFhZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvaWNvbnMvc2V0dGluZ3MuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvaWNvbnMvc2V0dGluZ3NfZGlzYWJsZWQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9pY29ucy9zZXR0aW5nc19kaXNhYmxlZC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkxNjZkYQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvaWNvbnMvc2V0dGluZ3NfZGlzYWJsZWQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZDEyZjIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTkgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIworIyBDb250cmlidXRvcnM6CisjIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBWZXJzaW9uIDEuMworIworVkJGX1RJVExFX1BST1BFUlRJRVM9VmFsaWRhdGlvbgorVkJGX1VJX1BPUFVQX1JVTlZBTElEQVRJT049VmFsaWRhdGUKK1ZCRl9USVRMRV9QUkVGRVJFTkNFPVZhbGlkYXRpb24KKworQnVuZGxlLU5hbWUuMCA9IFZhbGlkYXRpb24gRnJhbWV3b3JrIFVJCitCdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9wbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNTAyYTQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3BsdWdpbi54bWwKQEAgLTAsMCArMSw1NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KKzxwbHVnaW4+CisKKyAgICAKKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKzwhLS0gUG9wdXAgQ29udHJpYnV0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKzwhLS0gQnkgc2F5aW5nICJhZGFwdGFibGU9dHJ1ZSIsIHRoaXMgaXRlbSB3aWxsIGFwcGVhciBvbiBib3RoIElQcm9qZWN0IGFuZCBJSmF2YVByb2plY3QgLS0+CisgICA8ZXh0ZW5zaW9uCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+CisgICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCisgICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCisgICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIgorICAgICAgICAgICAgaWQ9IlZhbGlkYXRpb25NZW51QWN0aW9uIj4KKyAgICAgICAgIDxhY3Rpb24KKyAgICAgICAgICAgICAgIGxhYmVsPSIlVkJGX1VJX1BPUFVQX1JVTlZBTElEQVRJT04iCisgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWkuVmFsaWRhdGlvbk1lbnVBY3Rpb24iCisgICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgorICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iKyIKKyAgICAgICAgICAgICAgIGlkPSJWYWxpZGF0aW9uQWN0aW9uIj4KKyAgICAgICAgIDwvYWN0aW9uPgorICAgICAgPC9vYmplY3RDb250cmlidXRpb24+ICAgICAgCisgICA8L2V4dGVuc2lvbj4KKyAgCisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorPCEtLSAgICAgICAgICAgVmFsaWRhdGlvbiBwcmVmZXJlbmNlIHBhZ2UgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgIDxleHRlbnNpb24KKyAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgorICAgICAgPHBhZ2UKKyAgICAgICAgICAgIG5hbWU9IiVWQkZfVElUTEVfUFJFRkVSRU5DRSIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5WYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2UiCisgICAgICAgICAgICBpZD0iVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlIj4KKyAgICAgIDwvcGFnZT4KKyAgIDwvZXh0ZW5zaW9uPgorICAgCis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKzwhLS0gICAgICAgICAgIFZhbGlkYXRpb24gcHJvcGVydGllcyBwYWdlICAgICAgICAgICAgICAgICAgIC0tPgorPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Cis8IS0tIEJ5IHNheWluZyAiYWRhcHRhYmxlPXRydWUiLCB0aGlzIGl0ZW0gd2lsbCBhcHBlYXIgb24gYm90aCBJUHJvamVjdCBhbmQgSUphdmFQcm9qZWN0IC0tPgorICAgPGV4dGVuc2lvbgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByb3BlcnR5UGFnZXMiPgorICAgICAgPHBhZ2UKKyAgICAgICAgICAgIG5hbWU9IiVWQkZfVElUTEVfUFJPUEVSVElFUyIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5WYWxpZGF0aW9uUHJvcGVydHlQYWdlIgorICAgICAgICAgICAgaWQ9IlZhbGlkYXRpb25Qcm9wZXJ0aWVzUGFnZSI+CisgICAgICAgICA8ZW5hYmxlZFdoZW4+CisJICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ii8+CisgICAgICAgICA8L2VuYWJsZWRXaGVuPgorICAgICAgPC9wYWdlPgorICAgPC9leHRlbnNpb24+CisKKzwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9wcm9wZXJ0eV9maWxlcy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS92YWxpZGF0aW9udWkucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvcHJvcGVydHlfZmlsZXMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvdmFsaWRhdGlvbnVpLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRiMTAyZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvcHJvcGVydHlfZmlsZXMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvdmFsaWRhdGlvbnVpLnByb3BlcnRpZXMKQEAgLTAsMCArMSwzOSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitTYXZlRmlsZXNEaWFsb2dfc2F2aW5nPVNhdmluZyBSZXNvdXJjZXMKK1NhdmVGaWxlc0RpYWxvZ19hbHdheXNfc2F2ZT0mQWx3YXlzIHNhdmUgYWxsIG1vZGlmaWVkIHJlc291cmNlcyBhdXRvbWF0aWNhbGx5IHByaW9yIHRvIHZhbGlkYXRpbmcKK1NhdmVGaWxlc0RpYWxvZ19zYXZlX2FsbF9yZXNvdXJjZXM9U2F2ZSBBbGwgTW9kaWZpZWQgUmVzb3VyY2VzCitTYXZlRmlsZXNEaWFsb2dfbXVzdF9zYXZlPUFsbCBtb2RpZmllZCByZXNvdXJjZXMgbXVzdCBiZSBzYXZlZCBiZWZvcmUgdGhpcyBvcGVyYXRpb24uCisKK1ByZWZQYWdlX2Fsd2F5c19zYXZlPSZTYXZlIGFsbCBtb2RpZmllZCByZXNvdXJjZXMgYXV0b21hdGljYWxseSBwcmlvciB0byB2YWxpZGF0aW5nCisKK1J1blZhbGlkYXRpb25EaWFsb2dUaXRsZT1SdW5uaW5nIFZhbGlkYXRpb24KK1VuYWJsZVRvU2F2ZT1VbmFibGUgdG8gc2V0IHNhdmUgYXV0b21hdGljYWxseSBwcmVmZXJlbmNlIGluIHNhdmUgZmlsZXMgZm9yIHZhbGlkYXRpb24gZGlhbG9nOgorVmFsaWRhdGU9VmFsaWRhdGUKKworVmFsUmVzdWx0cz1WYWxpZGF0aW9uIFJlc3VsdHMKKworVmFsRXJyb3IxUmVzb3VyY2UxPVRoZSB2YWxpZGF0aW9uIGNvbXBsZXRlZCwgb25lIGVycm9yIHdhcyBkaXNjb3ZlcmVkLiBPbmUgcmVzb3VyY2Ugd2FzIHZhbGlkYXRlZCBpbiB7MH0uCitWYWxFcnJvcnNSZXNvdXJjZTE9VGhlIHZhbGlkYXRpb24gY29tcGxldGVkLCB7MH0gZXJyb3JzIHdlcmUgZGlzY292ZXJlZC4gT25lIHJlc291cmNlIHdhcyB2YWxpZGF0ZWQgaW4gezF9LgorVmFsV2FybjFSZXNvdXJjZTE9VGhlIHZhbGlkYXRpb24gY29tcGxldGVkIHdpdGggb25lIHdhcm5pbmcuIE9uZSByZXNvdXJjZSB3YXMgdmFsaWRhdGVkIGluIHswfS4KK1ZhbFdhcm5SZXNvdXJjZTE9VGhlIHZhbGlkYXRpb24gY29tcGxldGVkIHdpdGggezB9IHdhcm5pbmdzLiBPbmUgcmVzb3VyY2Ugd2FzIHZhbGlkYXRlZCBpbiB7MX0uCitWYWxJbmZvMVJlc291cmNlMT1UaGUgdmFsaWRhdGlvbiBjb21wbGV0ZWQgd2l0aCBvbmUgaW5mb3JtYXRpb25hbCBtZXNzYWdlLiBPbmUgcmVzb3VyY2Ugd2FzIHZhbGlkYXRlZCBpbiB7MH0uCitWYWxJbmZvUmVzb3VyY2UxPVRoZSB2YWxpZGF0aW9uIGNvbXBsZXRlZCB3aXRoIHswfSBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLiBPbmUgcmVzb3VyY2Ugd2FzIHZhbGlkYXRlZCBpbiB7MX0uCisKK1ZhbEVycm9yMVJlc291cmNlcz1UaGUgdmFsaWRhdGlvbiBjb21wbGV0ZWQsIG9uZSBlcnJvciB3YXMgZGlzY292ZXJlZC4gezB9IHJlc291cmNlcyB3ZXJlIHZhbGlkYXRlZCBpbiB7MX0uCitWYWxFcnJvcnNSZXNvdXJjZXM9VGhlIHZhbGlkYXRpb24gY29tcGxldGVkLCB7MH0gZXJyb3JzIHdlcmUgZGlzY292ZXJlZC4gezF9IHJlc291cmNlcyB3ZXJlIHZhbGlkYXRlZCBpbiB7Mn0uCitWYWxXYXJuMVJlc291cmNlcz1UaGUgdmFsaWRhdGlvbiBjb21wbGV0ZWQgd2l0aCBvbmUgd2FybmluZy4gezB9IHJlc291cmNlcyB3ZXJlIHZhbGlkYXRlZCBpbiB7MX0uCitWYWxXYXJuUmVzb3VyY2VzPVRoZSB2YWxpZGF0aW9uIGNvbXBsZXRlZCB3aXRoIHswfSB3YXJuaW5ncy4gezF9IHJlc291cmNlcyB3ZXJlIHZhbGlkYXRlZCBpbiB7Mn0uCitWYWxJbmZvMVJlc291cmNlcz1UaGUgdmFsaWRhdGlvbiBjb21wbGV0ZWQgd2l0aCBvbmUgaW5mb3JtYXRpb25hbCBtZXNzYWdlLiB7MH0gcmVzb3VyY2VzIHdlcmUgdmFsaWRhdGVkIGluIHsxfS4KK1ZhbEluZm9SZXNvdXJjZXM9VGhlIHZhbGlkYXRpb24gY29tcGxldGVkIHdpdGggezB9IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuIHsxfSByZXNvdXJjZXMgd2VyZSB2YWxpZGF0ZWQgaW4gezJ9LgorCitWYWxTdWNjZXNzPVRoZSB2YWxpZGF0aW9uIGNvbXBsZXRlZCB3aXRoIG5vIGVycm9ycyBvciB3YXJuaW5ncy4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvcHJvcGVydHlfZmlsZXMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdWkvaW50ZXJuYWwvbWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvcHJvcGVydHlfZmlsZXMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdWkvaW50ZXJuYWwvbWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjhlODIzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS9wcm9wZXJ0eV9maWxlcy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi91aS9pbnRlcm5hbC9tZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTU4IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMgCisjIENvbnRyaWJ1dG9yczoKKyMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjICAgICAqIENvZGUgb3JpZW50ZWQgaW5zdHJ1Y3Rpb25zOgorIyAgICAgKgorIyAgICAgKiBJbiB0aGUgc3RyaW5nLCB5b3UgbWF5IHNlZSB0aGUgZm9sbG93aW5nIHNwZWNpYWwgc2VxdWVuY2VzOgorIyAgICAgKiBhKSB7bn0gIHdoZXJlIG4gaXMgYSBudW1iZXIuIFRoZXNlIGFyZSByZXBsYWNlYWJsZSBwYXJhbWV0ZXJzLgorIyAgICAgKiBiKSAnJyAgSW4gLnByb3BlcnRpZXMgZmlsZXMsIGluIG9yZGVyIHRvIHNlZSBvbmUgYXBvc3Ryb3BoZSAoJykgaW4gdGhlIGZpbmFsCisjICAgICAqICAgIHN0cmluZywgc29tZXRpbWVzIHR3byBhcG9zdHJvcGhlcyBtdXN0IGJlIGVudGVyZWQgaW4gdGhlIHN0cmluZy4gSW4gdGhlIHRyYW5zbGF0ZWQKKyMgICAgICogICAgc3RyaW5nLCBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUge259IGluIHRoZSBzdHJpbmcsIHRoZW4gdG8gc2hvdyBvbmUgYXBvc3Ryb3BoZQorIyAgICAgKiAgICB0byB0aGUgdXNlciwgcHV0IHR3byBhcG9zdHJvcGhlcyBpbiB0aGUgc3RyaW5nLiBJZiB0aGVyZSBhcmUgbm8ge259IGluIHRoZSBzdHJpbmcsCisjICAgICAqICAgIHRoZW4gcHV0IG9uZSBhcG9zdHJvcGhlLgorIyAgICAgKiAgICBGb3IgZXhhbXBsZSwgc2F5IHRoYXQgeW91IHdhbnQgdGhlIHVzZXIgdG8gcmVhZCAiR2VvcmdlJ3MgZmlsZSIuIAorIyAgICAgKiAgICAgICAgR0VPUkdFPUdlb3JnZSdzIGZpbGUgd2FzIG9uIHRoZSBkZXNrLgorIyAgICAgKiAgICAgICAgR0VPUkdFMj1HZW9yZ2UnJ3MgZmlsZSBhbmQgezB9IHdlcmUgb24gdGhlIGRlc2suCisjICAgICAqICAgIEdFT1JHRSB1c2VzIG9uZSBhcG9zdHJvcGhlIGJlY2F1c2UgdGhlcmUgYXJlIG5vIHtufSBhbmQgR0VPUkdFMgorIyAgICAgKiAgICB1c2VzIHR3byBhcG9zdHJvcGhlcyBiZWNhdXNlIHRoZXJlIGlzIGEge259LgorIyAgICAgKiBjKSAnJyB0ZXh0ICcnIHdoZXJlIHRleHQgY2FuIGJlIGFueSB3b3JkKHMpLiBUaGUgdGV4dCBiZXR3ZWVuIHRoZSBkb3VibGUKKyMgICAgICogICAgYXBvc3Ryb3BoZXMgc2hvdWxkIG5vdCBiZSB0cmFuc2xhdGVkLiAKKyMgICAgICogZCkgPHRleHQ+IHdoZXJlIHRleHQgY2FuIGJlIGFueSB3b3JkKHMpLiBUaGUgdGV4dCBiZXR3ZWVuIHRoZSBhbmdsZQorIyAgICAgKiAgICBicmFja2V0cyBzaG91bGQgTk9UIGJlIHRyYW5zbGF0ZWQuCisjICAgICAqIGUpICJ0ZXh0IiB3aGVyZSB0ZXh0IGNhbiBiZSBhbnkgd29yZChzKS4gVGhlIHRleHQgYmV0d2VlbiB0aGUgcXVvdGF0aW9uIAorIyAgICAgKiAgICBtYXJrcyBzaG91bGQgTk9UIGJlIHRyYW5zbGF0ZWQuCisjICAgICAqICAgIAorIyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyAgICAgKiBPdGhlciBpbnN0cnVjdGlvbnMKKyMgICAgICogYSkgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdGV4dCB0aGF0IGlzIG9uIGEgbGluZSB3aGljaCBiZWdpbnMgd2l0aCBhIGNvbW1lbnQgCisjICAgICAqICAgIHN5bWJvbCAoIykuCisjICAgICAqIGIpIERvIG5vdCB0cmFuc2xhdGUgdGhlc2Ugd29yZHM6IAorIyAgICAgKiAgICAgICAgc2NoZW1hLCBFSkIsIFJEQiwgSkFSLCBSTUksIEJNUCwgQ01QLCBPT1NRTAorIyAgICAgKiBjKSBQbGVhc2UgcmV0dXJuIHRoZSAucHJvcGVydGllcyBmaWxlcyB1c2luZyB0aGUgc2FtZSBkaXJlY3Rvcnkgc3RydWN0dXJlLgorIyAgICAgKiAgICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHR3byBvZiB0aGUgZmlsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lLgorIyAgICAgKgorIyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyBBbnkgb3RoZXIgY29tbWVudHMgdG8gdGhlIHRyYW5zbGF0b3JzIGFyZSBvbiBsaW5lcyB3aGljaCBzdGFydCBsaWtlIHRoaXM6ICAjIDJUQzoKKyMKKyMgVmVyc2lvbiAxLjEyCisjCisjCisjIElEOgorIyAgICBWQkYgLSBWYWxpZGF0aW9uIEJ1aWxkZXIgRnJhbWV3b3JrCisjCisKKyMgCisjIEJlZ2luIFZhbGlkYXRpb24gQnVpbGRlciBGcmFtZXdvcmsgVUkgU3RyaW5ncworIworIyBJRHM6CisjICAgIFZCRl9FWEM9RXhjZXB0aW9uIG9yIGVycm9yIHRleHQKKyMgICAgVkJGX1VJPVVJIGxhYmVsCisjCitQUkVGX0JVVFRPTl9PVkVSUklERT1BbGxvdyBwcm9qZWN0cyB0byBvdmVycmlkZSB0aGVzZSBwcmVmZXJlbmNlIHNldHRpbmdzCitQUkVGX0JVVFRPTl9FTkFCTEVBTEw9RW5hYmxlIEFsbAorUFJFRl9CVVRUT05fRElTQUJMRUFMTD1EaXNhYmxlIEFsbAorUFJFRl9WQUxMSVNUX1RJVExFPVRoZSBzZWxlY3RlZCB2YWxpZGF0b3JzIHdpbGwgcnVuIHdoZW4gdmFsaWRhdGlvbiBpcyBwZXJmb3JtZWQ6CitQUkVGX01OVV9NQU5VQUw9Jk1hbnVhbAorUFJFRl9NTlVfQlVJTEQ9JkJ1aWxkCitQUkVGX01OVV9TRVRUSU5HUz0mU2V0dGluZ3MuLi4KKworVkJGX0VYQ19JTlRFUk5BTF9USVRMRT1JbnRlcm5hbCBlcnJvcgorVkJGX0VYQ19JTlRFUk5BTF9QQUdFPUFuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQ7IGNsaWNrIENhbmNlbCB0byBjbG9zZSB0aGUgd2l6YXJkLgorCitWQkZfRVhDX0lOVkFMSURfUkVHSVNURVI9VmFsaWRhdG9ycyBjYW4gcnVuIG9ubHkgb24gb3BlbiByZXNvdXJjZXMuCitQcm9qZWN0T3ZlcnJpZGVzTm90QWxsb3dlZD1UaGUgd29ya3NwYWNlIHZhbGlkYXRpb24gcHJlZmVyZW5jZXMgZG8gbm90IGFsbG93IHByb2plY3RzIHRvIG92ZXJyaWRlIHRoZSB3b3Jrc3BhY2Ugc2V0dGluZ3MuIEluIG9yZGVyIHRvIGFsbG93IHByb2plY3Qgc2V0dGluZ3MgeW91IG5lZWQgdG8gY29uZmlndXJlIHRoZSB3b3Jrc3BhY2Ugc2V0dGluZ3MgdG8gYWxsb3cgcHJvamVjdCBvdmVycmlkZXMuICAKKyAKK1ZCRl9VSV9OT19WQUxJREFUT1JTX0lOU1RBTExFRD1ObyB2YWxpZGF0b3JzIGFyZSBpbnN0YWxsZWQuCisKK0RJU0FCTEVfVkFMSURBVElPTj1TdXNwZW5kIGFsbCB2YWxpZGF0b3JzCisKK0RlbGVnYXRlc0RpYWxvZ1RpdGxlPVZhbGlkYXRvciBQcmVmZXJlbmNlcworRGVsZWdhdGVzQ29tYm9MYWJlbD1JbXBsZW1lbnRhdGlvbjoKK0FERF9WQUxJREFUSU9OX0JVSUxERVI9QWRkIFZhbGlkYXRpb24gQnVpbGRlciB0byBwcm9qZWN0CitDb25maWdXc1NldHRpbmdzPUNvbmZpZ3VyZSBXb3Jrc3BhY2UgU2V0dGluZ3MuLi4KK1ZBTElEQVRPUj1WYWxpZGF0b3IKK01BTlVBTD1NYW51YWwKK0JVSUxEPUJ1aWxkCitTRVRUSU5HUz1TZXR0aW5ncworCitTYXZlRmlsZXNEaWFsb2dfc2F2aW5nPVNhdmluZyBSZXNvdXJjZXMKK1NhdmVGaWxlc0RpYWxvZ19hbHdheXNfc2F2ZT0mQWx3YXlzIHNhdmUgYWxsIG1vZGlmaWVkIHJlc291cmNlcyBhdXRvbWF0aWNhbGx5IHByaW9yIHRvIHZhbGlkYXRpbmcKK1NhdmVGaWxlc0RpYWxvZ19zYXZlX2FsbF9yZXNvdXJjZXM9U2F2ZSBBbGwgTW9kaWZpZWQgUmVzb3VyY2VzCitTYXZlRmlsZXNEaWFsb2dfbXVzdF9zYXZlPUFsbCBtb2RpZmllZCByZXNvdXJjZXMgbXVzdCBiZSBzYXZlZCBiZWZvcmUgdGhpcyBvcGVyYXRpb24uCisKK1ByZWZQYWdlX2Fsd2F5c19zYXZlPSZTYXZlIGFsbCBtb2RpZmllZCByZXNvdXJjZXMgYXV0b21hdGljYWxseSBwcmlvciB0byB2YWxpZGF0aW5nCitQcmVmUGFnZUNvbmZpcm1EaWFsb2c9U2hvdyBhIGNvbmZpcm1hdGlvbiBkaWFsb2cgd2hlbiBwZXJmb3JtaW5nIG1hbnVhbCB2YWxpZGF0aW9ucworCitSdW5WYWxpZGF0aW9uRGlhbG9nVGl0bGU9UnVubmluZyBWYWxpZGF0aW9uCisKK2ZkVGl0bGU9VmFsaWRhdGlvbiBGaWx0ZXJzIGZvciB7MH0KK2ZkTm9GaWx0ZXJzPVRoZSB2YWxpZGF0b3IgZG9lcyBub3QgaGF2ZSBjdXJyZW50bHkgaGF2ZSBhbnkgZmlsdGVycyBpbnN0YWxsZWQuCitFcnJDb25maWc9RXh0ZW5zaW9uIGNvbmZpZ3VyYXRpb24gZXJyb3IuIEFuIGludGVybmFsIGVycm9yIGhhcyBoYXBwZW5lZCwgdGhlIHZhbGlkYXRvciB7MH0gaGFzIGluY29ycmVjdGx5IGNvbmZpZ3VyZWQgdGhlIHZhbGlkYXRpb24gZXh0ZW5zaW9uIHBvaW50LgorCitGaWx0ZXJIZWxwPUZpbHRlciBydWxlcyBhcmUgZ3JvdXBlZCBpbnRvIGdyb3Vwcy4gSW5zaWRlIG9mIGFueSBvbmUgZ3JvdXAgdGhlIHJ1bGVzIGFyZSBjb21iaW5lZCBieSB1c2luZyB0aGUgbG9naWNhbCBPUiBvcGVyYXRvci4gVGhlcmUgYXJlIHR3byB0eXBlcyBvZiBncm91cHMgSW5jbHVkZSBhbmQgRXhjbHVkZS4gSWYgYW55IG9mIHRoZSBydWxlcyBpbiB0aGUgRXhjbHVkZSBncm91cCBtYXRjaCwgdGhlIHJlc291cmNlIGlzIG5vdCB2YWxpZGF0ZWQuIElmIHRoZXJlIGFyZSBJbmNsdWRlIGdyb3VwcywgYXQgbGVhc3Qgb25lIHJ1bGUgZnJvbSBlYWNoIGdyb3VwIG11c3QgbWF0Y2ggYmVmb3JlIHRoZSByZXNvdXJjZSBpcyB2YWxpZGF0ZWQuCitCdXR0b25BZGRHcm91cEluY2x1ZGU9QWRkIEluY2x1ZGUgR3JvdXAuLi4KK0J1dHRvbkFkZEdyb3VwRXhjbHVkZT1BZGQgRXhjbHVkZSBHcm91cC4uLgorQnV0dG9uQWRkUnVsZT1BZGQgUnVsZS4uLgorQnV0dG9uUmVtb3ZlPVJlbW92ZSAKKworTGFiZWxFbmFibGVQcm9qZWN0U3BlY2lmaWM9RW5hYmxlIHByb2plY3Qgc3BlY2lmaWMgc2V0dGluZ3MKKworTGFiZWxFeHRlbnNpb249RmlsZSBleHRlbnNpb24KK0xhYmVsRmlsZT1Gb2xkZXIgb3IgZmlsZSBuYW1lCitMYWJlbFByb2plY3RzPVByb2plY3QgbmF0dXJlCitMYWJlbEZhY2V0cz1GYWNldAorTGFiZWxDb250ZW50VHlwZT1Db250ZW50IFR5cGUKKworIyBOb3RlIHRvIHRyYW5zbGF0b3JzLCBrZWVwIHRoZSA8QT4gYW5kIDwvQT4gdGFncyBleGFjdGx5IGFzIHRoZXkgYXJlCitEb05vdFNob3dSZXN1bHRzPURvIG5vdCBzaG93IHRoaXMgZGlhbG9nIGluIHRoZSBmdXR1cmUuCisKK0Rlc2NFeHRlbnNpb249RmlsZSBleHRlbnNpb24sIGZvciBleGFtcGxlICJodG1sIiBmb3IgSFRNTCBmaWxlcy4KK0Rlc2NGaWxlPUVpdGhlciBhIGZvbGRlciwgYSByZWxhdGl2ZSBmaWxlLCBvciBhIGZ1bGx5IHF1YWxpZmllZCBmaWxlIG5hbWUuCitEZXNjUHJvamVjdHM9QSBwcm9qZWN0IG5hdHVyZS4KK0Rlc2NGYWNldHM9QSBmYWNldC4KK0Rlc2NDb250ZW50VHlwZT1BIGNvbnRlbnQgdHlwZSwgZm9yIGV4YW1wbGUgdGhlIFhNTCBjb250ZW50IHR5cGUuCisKK0Vycm9yc1dhcm5pbmdzPUVycm9ycy9XYXJuaW5ncworCitWYWxpZGF0aW9uPVZhbGlkYXRpb24KK1ZhbGlkYXRpb25TdGF0dXM9VmFsaWRhdGlvbiBTdGF0dXMKKworRXJyU3VtbWFyeT1WYWxpZGF0aW9uIHJlc3VsdHMuIEVycm9ycz17MH0sIFdhcm5pbmdzPXsxfSwgSW5mb3JtYXRpb249ezJ9CitWYWxpZGF0aW9uU3VjY2Vzc2Z1bD1WYWxpZGF0aW9uIHdhcyBzdWNjZXNzZnVsCisKK0ZyV2l6YXJkPU5ldyBGaWx0ZXIgUnVsZSBXaXphcmQKK0ZyU2VsZWN0RmlsdGVyVHlwZT1TZWxlY3QgRmlsdGVyIFR5cGUKK0ZyRmlsZUV4dGVuc2lvbj1GaWxlIEV4dGVuc2lvbgorRnJGaWxlRXh0ZW5zaW9uTGFiZWw9RmlsZSBleHRlbnNpb24sIGZvciBleGFtcGxlIGh0bWw6CitGckNhc2VTZW5zaXRpdmU9SXMgdGhlIGNvbXBhcmlzb24gY2FzZSBzZW5zaXRpdmU/CitGckV4YWN0TWF0Y2g9Q2hlY2sgdGhpcyBpZiB0aGUgY29udGVudCB0eXBlIG5lZWRzIHRvIG1hdGNoIGV4YWN0bHkuIERvIG5vdCBjaGVjayBpdCwgaWYgc3ViIHR5cGVzIG5lZWQgdG8gbWF0Y2ggYXMgd2VsbC4KK0ZyU2ltcGxlRmlsZU5hbWU9Rm9yIGZpbGUgYmFzZWQgY29tcGFyaXNvbnMsIHVzZSBvbmx5IHRoZSBzaW1wbGUgZmlsZSBuYW1lLgorRnJGb2xkZXJPckZpbGU9Rm9sZGVyIG9yIEZpbGUgTmFtZQorRnJGb2xkZXJPckZpbGVMYWJlbD1GaWxlIG9yIGZvbGRlcjoKK0ZyQnJvd3NlRmlsZT1Ccm93c2UgRmlsZS4uLgorRnJGaWxlRmlsdGVyPVNlbGVjdCB0aGUgZmlsZSB0aGF0IHdpbGwgc2VydmUgYXMgdGhlIGZpbHRlcgorRnJCcm93c2VGb2xkZXI9QnJvd3NlIEZvbGRlci4uLgorRnJGb2xkZXJGaWx0ZXI9U2VsZWN0IHRoZSBmb2xkZXIgdGhhdCB3aWxsIHNlcnZlIGFzIHRoZSBmaWx0ZXIKK0ZyUHJvamVjdE5hdHVyZT1Qcm9qZWN0IE5hdHVyZQorRnJQcm9qZWN0TmF0dXJlTGFiZWw9UHJvamVjdCBuYXR1cmU6CitGckZhY2l0PUZhY2V0CitGckZhY2l0TGFiZWw9RmFjZXQgaWQ6CitGckNvbnRlbnRUeXBlPUNvbnRlbnQgVHlwZQorRnJDb250ZW50VHlwZUxhYmVsPUNvbnRlbnQgVHlwZToKK0ZyTXNnU2V2PVNlbGVjdCB0aGUgc2V2ZXJpdHkgbGV2ZWwgZm9yIHRoZSBmb2xsb3dpbmcgcHJvYmxlbXMKKworUmVidWlsZFRpdGxlPVZhbGlkYXRpb24gU2V0dGluZ3MgQ2hhbmdlZAorUmVidWlsZE1zZz1UaGUgdmFsaWRhdGlvbiBzZXR0aW5ncyBoYXZlIGNoYW5nZWQuIEEgZnVsbCByZWJ1aWxkIGlzIHJlcXVpcmVkIGZvciB0aGUgY2hhbmdlcyB0byB0YWtlIGVmZmVjdC4gRG8gdGhlIGZ1bGwgYnVpbGQgbm93PworCisjCisjIEVuZCBWYWxpZGF0aW9uIEJ1aWxkZXIgRnJhbWV3b3JrIFVJIFN0cmluZ3MKKyMKKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL0NvbnRleHRJZHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9Db250ZXh0SWRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhjZTQ4NQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9Db250ZXh0SWRzLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuV1RQVUlQbHVnaW47CisKK3B1YmxpYyBpbnRlcmZhY2UgQ29udGV4dElkcyB7CisJc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSBXVFBVSVBsdWdpbi5QTFVHSU5fSUQ7CisKKwkvLyBjb250ZXh0IGlkcyBmb3IgdGhlIFZhbGlkYXRpb24gUHJvcGVydGllcyBQYWdlCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9QUk9QRVJUSUVTX1BBR0UgPSBQUkVGSVggKyAiLmp2cHAwMDAwIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fUFJPUEVSVElFU19QQUdFX0RJU0FCTEVEX09WRVJSSURFID0gUFJFRklYICsgIi5qdnBwMDAwMSI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1BST1BFUlRJRVNfUEFHRV9ESVNBQkxFRF9CVUlMRF9OT1ZBTFNFTEVDVEVEID0gUFJFRklYICsgIi5qdnBwMDAwMyI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1BST1BFUlRJRVNfUEFHRV9ESVNBQkxFRF9BVVRPX0FVVE9CVUlMRCA9IFBSRUZJWCArICIuanZwcDAwMDQiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9QUk9QRVJUSUVTX1BBR0VfRElTQUJMRURfQVVUT19OT0lOQ1ZBTFNFTEVDVEVEID0gUFJFRklYICsgIi5qdnBwMDAwNSI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1BST1BFUlRJRVNfUEFHRV9ESVNBQkxFRF9BVVRPX05PSU5DVkFMQ09ORklHID0gUFJFRklYICsgIi5qdnBwMDAwNiI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1BST1BFUlRJRVNfUEFHRV9BVVRPX0VOQUJMRUQgPSBQUkVGSVggKyAiLmp2cHAwMDIwIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fUFJPUEVSVElFU19QQUdFX09WRVJSSURFX0VOQUJMRUQgPSBQUkVGSVggKyAiLmp2cHAwMDMwIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fUFJPUEVSVElFU19QQUdFX09WRVJSSURFX0VOQUJMRURfQ0FOTk9UX0hPTk9VUl9CT1RIID0gUFJFRklYICsgIi5qdnBwMDAzMSI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1BST1BFUlRJRVNfUEFHRV9PVkVSUklERV9FTkFCTEVEX0NBTk5PVF9IT05PVVJfQVVUTyA9IFBSRUZJWCArICIuanZwcDAwMzIiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9QUk9QRVJUSUVTX1BBR0VfT1ZFUlJJREVfRU5BQkxFRF9DQU5OT1RfSE9OT1VSX01BTlVBTCA9IFBSRUZJWCArICIuanZwcDAwMzMiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9QUk9QRVJUSUVTX1BBR0VfUkVCVUlMRF9FTkFCTEVEID0gUFJFRklYICsgIi5qdnBwMDA0MCI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1BST1BFUlRJRVNfUEFHRV9NQVhfTUVTU0FHRVMgPSBQUkVGSVggKyAiLmp2cHAwMDUwIjsgLy8kTk9OLU5MUy0xJAorCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9QUkVGRVJFTkNFX1BBR0UgPSBQUkVGSVggKyAiLmp2Z3AwMDAwIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fUFJFRkVSRU5DRV9QQUdFX09WRVJSSURFID0gUFJFRklYICsgIi5qdmdwMDAwNSI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1BSRUZFUkVOQ0VfUEFHRV9ESVNBQkxFX0FMTF9FTkFCTEVEID0gUFJFRklYICsgIi5qdmdwMDAxMCI7IC8vJE5PTi1OTFMtMSQKKwkvLwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1BSRUZFUkVOQ0VfUEFHRV9SRUJVSUxEX0RJU0FCTEVEID0gUFJFRklYICsKKwkvLyAiLmp2Z3AwMDExIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fUFJFRkVSRU5DRV9QQUdFX0FVVE9fRU5BQkxFRCA9IFBSRUZJWCArICIuanZncDAwMjAiOyAvLyROT04tTkxTLTEkCisJLy8JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9QUkVGRVJFTkNFX1BBR0VfQVVUT19ESVNBQkxFRF9BVVRPQlVJTEQgPSBQUkVGSVggKworCS8vICIuanZncDAwMjEiOyAvLyROT04tTkxTLTEkCisJLy8JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9QUkVGRVJFTkNFX1BBR0VfQVVUT19ESVNBQkxFRF9OT0lOQ1ZBTFNFTEVDVEVEID0gUFJFRklYCisJLy8gKyAiLmp2Z3AwMDIyIjsgLy8kTk9OLU5MUy0xJAorCS8vCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fUFJFRkVSRU5DRV9QQUdFX0FVVE9fRElTQUJMRURfTk9JTkNWQUxDT05GSUcgPSBQUkVGSVggKworCS8vICIuanZncDAwMjMiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9QUkVGRVJFTkNFX1BBR0VfTUFYX01FU1NBR0VTID0gUFJFRklYICsgIi5qdmdwMDAzMCI7IC8vJE5PTi1OTFMtMSQKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9EZWxlZ2F0aW5nVmFsaWRhdG9yUHJlZmVyZW5jZXNEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9EZWxlZ2F0aW5nVmFsaWRhdG9yUHJlZmVyZW5jZXNEaWFsb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDA5MDBhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL0RlbGVnYXRpbmdWYWxpZGF0b3JQcmVmZXJlbmNlc0RpYWxvZy5qYXZhCkBAIC0wLDAgKzEsMjcwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqIERhdmlkIFNjaG5laWRlciwgZGF2aWQuc2NobmVpZGVyQHVuaXN5cy5jb20gLSBbMTQyNTAwXSBXVFAgcHJvcGVydGllcyBwYWdlcyBmb250cyBkb24ndCBmb2xsb3cgRWNsaXBzZSBwcmVmZXJlbmNlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWk7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5kZWxlZ2F0ZXMuVmFsaWRhdG9yRGVsZWdhdGVEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmRlbGVnYXRlcy5WYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS5pbnRlcm5hbC5WYWxVSU1lc3NhZ2VzOworCisvKioKKyAqIERpYWxvZyB1c2VkIHRvIGFsbG93IHRoZSB1c2VyIHRvIHNlbGVjdCBhIHZhbGlkYXRvciBkZWxlZ2F0ZSBmcm9tIHRoZSBsaXN0IG9mCisgKiByZWdpc3RlcmVkIGRlbGVnYXRlcyBmb3IgYSBnaXZlbiBkZWxlZ2F0aW5nIHZhbGlkYXRvci4KKyAqLworcHVibGljIGNsYXNzIERlbGVnYXRpbmdWYWxpZGF0b3JQcmVmZXJlbmNlc0RpYWxvZyBleHRlbmRzIERpYWxvZworeworICAvKioKKyAgICogVGhlIGRlbGVnYXRpbmcgdmFsaWRhdG9yJ3MgZGVzY3JpcHRvci4KKyAgICovCisgIHByaXZhdGUgVmFsaWRhdG9yTWV0YURhdGEgZGVsZWdhdGluZ1ZhbGlkYXRvckRlc2NyaXB0b3I7CisKKyAgLyoqCisgICAqIFRoZSBzZWxlY3RlZCB2YWxpZGF0b3IgZGVsZWdhdGUgSUQuCisgICAqLworICBwcml2YXRlIFN0cmluZyBkZWxlZ2F0ZUlEOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RzIHRoZSBkaWFsb2cgb24gdGhlIGdpdmVuIHNoZWxsLgorICAgKiAKKyAgICogQHBhcmFtIHBhcmVudFNoZWxsCisgICAqICAgICAgICAgIHRoZSBkaWFsb2cncyBwYXJlbnQuIE11c3Qgbm90IGJlIG51bGwuCisgICAqIEBwYXJhbSB0YXJnZXRJRAorICAgKiAgICAgICAgICB0aGUgZGVsZWdhdGluZyB2YWxpZGF0b3IncyBpZAorICAgKiAKKyAgICogQHBhcmFtIGRlbGVnYXRlSUQKKyAgICogICAgICAgICAgdGhlIElEIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdmFsaWRhdG9yIGRlbGVnYXRlLgorICAgKi8KKyAgcHVibGljIERlbGVnYXRpbmdWYWxpZGF0b3JQcmVmZXJlbmNlc0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBTdHJpbmcgZGVsZWdhdGVJRCkKKyAgeworICAgIHN1cGVyKHBhcmVudFNoZWxsKTsKKworICAgIGRlbGVnYXRpbmdWYWxpZGF0b3JEZXNjcmlwdG9yID0gdm1kOworICAgIHRoaXMuZGVsZWdhdGVJRCA9IGRlbGVnYXRlSUQ7CisgIH0KKworICAvKgorICAgKiAobm9uLUphdmFkb2MpCisgICAqIAorICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQorICAgKi8KKyAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQorICB7CisgICAgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOworCisgICAgZ2V0U2hlbGwoKS5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuRGVsZWdhdGVzRGlhbG9nVGl0bGUpOworCisgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworICAgIHBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKKworICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOworICAgIEdyaWREYXRhIGxhYmVsRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOworICAgIGxhYmVsRGF0YS53aWR0aEhpbnQgPSAyNTA7CisgICAgbGFiZWwuc2V0TGF5b3V0RGF0YShsYWJlbERhdGEpOworICAgIGxhYmVsLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCkuZ2V0Qm9sZChKRmFjZVJlc291cmNlcy5ESUFMT0dfRk9OVCkpOworICAgIFN0cmluZyBkZWxlZ2F0aW5nVmFsaWRhdG9yTmFtZSA9IGRlbGVnYXRpbmdWYWxpZGF0b3JEZXNjcmlwdG9yLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCk7CisgICAgbGFiZWwuc2V0VGV4dChkZWxlZ2F0aW5nVmFsaWRhdG9yTmFtZSk7CisKKyAgICBMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOworICAgIEdyaWREYXRhIHNlcGFyYXRvckRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKKyAgICBzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShzZXBhcmF0b3JEYXRhKTsKKworICAgIENvbXBvc2l0ZSBncm91cCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7CisgICAgR3JpZERhdGEgZ3JvdXBHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOworICAgIGdyb3VwLnNldExheW91dERhdGEoZ3JvdXBHcmlkRGF0YSk7CisgICAgR3JpZExheW91dCBncm91cExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKKyAgICBncm91cC5zZXRMYXlvdXQoZ3JvdXBMYXlvdXQpOworCisgICAgTGFiZWwgY29tYm9MYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOworICAgIGNvbWJvTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7CisgICAgY29tYm9MYWJlbC5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuRGVsZWdhdGVzQ29tYm9MYWJlbCk7CisgICAgCisgICAgQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8oZ3JvdXAsIFNXVC5SRUFEX09OTFkpOworICAgIEdyaWREYXRhIGNvbWJvR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKKyAgICBjb21iby5zZXRMYXlvdXREYXRhKGNvbWJvR3JpZERhdGEpOworCisgICAgZmluYWwgQ29tYm9WaWV3ZXIgY29tYm9WaWV3ZXIgPSBuZXcgQ29tYm9WaWV3ZXIoY29tYm8pOworICAgIGNvbWJvVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgRGVsZWdhdGVzQ29udGVudFByb3ZpZGVyKCkpOworICAgIGNvbWJvVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IERlbGVnYXRlc0xhYmVsUHJvdmlkZXIoKSk7CisgICAgU3RyaW5nIHRhcmdldElEID0gZGVsZWdhdGluZ1ZhbGlkYXRvckRlc2NyaXB0b3IuZ2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpOworCisgICAgY29tYm9WaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkKKyAgICB7CisKKyAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCisgICAgICB7CisgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY29tYm9WaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7CisgICAgICAgIHNldERlbGVnYXRlSUQoKChWYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3IpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSkuZ2V0SWQoKSk7CisgICAgICB9CisgICAgfSk7CisKKyAgICBjb21ib1ZpZXdlci5zZXRJbnB1dCh0YXJnZXRJRCk7CisKKyAgICBWYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3Igc2VsZWN0ZWQgPSBWYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldERlc2NyaXB0b3IodGFyZ2V0SUQsIGRlbGVnYXRlSUQpOworCisgICAgaWYgKHNlbGVjdGVkICE9IG51bGwpCisgICAgeworICAgICAgY29tYm9WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBPYmplY3RbXSB7IHNlbGVjdGVkIH0pKTsKKyAgICB9CisKKyAgICBMYWJlbCBlbmRTZXBhcmF0b3IgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOworICAgIEdyaWREYXRhIGVuZFNlcGFyYXRvckRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsgCisgICAgZW5kU2VwYXJhdG9yLnNldExheW91dERhdGEoZW5kU2VwYXJhdG9yRGF0YSk7CisgICAgRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOworICAgIAorICAgIHJldHVybiBwYXJlbnQ7CisgIH0KKworICAvKioKKyAgICogUHJvdmlkZXMgY29udGVudHMgZm9yIHRoZSBkZWxlZ2F0ZSB2YWxpZGF0b3JzIGNvbWJvIGJveC4KKyAgICovCisgIHByaXZhdGUgZmluYWwgY2xhc3MgRGVsZWdhdGVzQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIKKyAgeworICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQorICAgIHsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkKKyAgICB7CisgICAgICBTdHJpbmcgdGFyZ2V0SUQgPSAoU3RyaW5nKSBpbnB1dEVsZW1lbnQ7CisgICAgICBNYXAgZGVsZWdhdGVzQnlJRCA9IFZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RGVsZWdhdGVEZXNjcmlwdG9ycyh0YXJnZXRJRCk7CisgICAgICAKKyAgICAgIGlmIChkZWxlZ2F0ZXNCeUlEID09IG51bGwpCisgICAgICB7CisgICAgICAgIHJldHVybiBuZXcgT2JqZWN0W10ge307CisgICAgICB9CisKKyAgICAgIHJldHVybiBkZWxlZ2F0ZXNCeUlELnZhbHVlcygpLnRvQXJyYXkoKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsCisgICAgICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKKyAgICB7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFByb3ZpZGVzIHRoZSBsYWJlbHMvaW1hZ2VzIGZvciB0aGUgZGVsZWdhdGUgdmFsaWRhdG9yIGNvbWJvIGJveAorICAgKiAKKyAgICogQGF1dGhvciB2YmFjaXVsCisgICAqIAorICAgKi8KKyAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBEZWxlZ2F0ZXNMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUxhYmVsUHJvdmlkZXIKKyAgeworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpCisgICAgeworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpCisgICAgeworICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQorICAgICAqLworICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkKKyAgICB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkKKyAgICB7CisgICAgICByZXR1cm4gKChWYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3IpIGVsZW1lbnQpLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2lzTGFiZWxQcm9wZXJ0eShqYXZhLmxhbmcuT2JqZWN0LAorICAgICAqICAgICAgamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKKyAgICB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICogCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNyZW1vdmVMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikKKyAgICB7CisgICAgfQorICB9CisKKyAgLyoKKyAgICogUHJvdmlkZXMgdGhlIElEIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdmFsaWRhdG9yIGRlbGVnYXRlIElELgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXREZWxlZ2F0ZUlEKCkKKyAgeworICAgIHJldHVybiBkZWxlZ2F0ZUlEOworICB9CisKKyAgLyoqCisgICAqIFNldHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB2YWxpZGF0b3IgZGVsZWdhdGUgSUQuCisgICAqIAorICAgKiBAcGFyYW0gZGVsZWdhdGVJRAorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIHNldERlbGVnYXRlSUQoU3RyaW5nIGRlbGVnYXRlSUQpCisgIHsKKyAgICB0aGlzLmRlbGVnYXRlSUQgPSBkZWxlZ2F0ZUlEOworICB9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvTGlzdENvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL0xpc3RDb250ZW50UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGI2ZDAyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL0xpc3RDb250ZW50UHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWk7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CisKKy8qKiAKKyAqIEEgc3BlY2lhbGl6ZWQgY29udGVudCBwcm92aWRlciB0byBzaG93IGEgbGlzdCBvZiBlZGl0b3IgcGFydHMuCisgKiBUaGlzIGNsYXNzIGhhcyBiZWVuIGNvcGllZCBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS52aWV3c3VwcG9ydC5MaXN0Q29udGVudFByb3ZpZGVyCisgKiBUaGlzIGNsYXNzIHNob3VsZCBiZSByZW1vdmVkIG9uY2UgYSBnZW5lcmljIHNvbHV0aW9uIGlzIG1hZGUgYXZhaWxhYmxlLgorICovIAorcHVibGljIGNsYXNzIExpc3RDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7CisJTGlzdCBmQ29udGVudHM7CQorCisJcHVibGljIExpc3RDb250ZW50UHJvdmlkZXIoKSB7CisJfQorCQorCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXQpIHsKKwkJaWYgKGZDb250ZW50cyAhPSBudWxsICYmIGZDb250ZW50cyA9PSBpbnB1dCkKKwkJCXJldHVybiBmQ29udGVudHMudG9BcnJheSgpOworCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKKwl9CisKKwlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKKwkJaWYgKG5ld0lucHV0IGluc3RhbmNlb2YgTGlzdCkgCisJCQlmQ29udGVudHM9IChMaXN0KW5ld0lucHV0OworCQllbHNlCisJCQlmQ29udGVudHM9IG51bGw7CisJCS8vIHdlIHVzZSBhIGZpeGVkIHNldC4KKwl9CisKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoT2JqZWN0IG8pIHsKKwkJcmV0dXJuIGZDb250ZW50cyAhPSBudWxsICYmICFmQ29udGVudHMuY29udGFpbnMobyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL1NhdmVGaWxlc0RpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL1NhdmVGaWxlc0RpYWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZWI4NzIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvU2F2ZUZpbGVzRGlhbG9nLmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqIC8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC51aTsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdERpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Db25maWd1cmF0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5HbG9iYWxDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnVpLnBsdWdpbi5WYWxpZGF0aW9uVUlQbHVnaW47CisKKy8qKgorICogQSBnZW5lcmljIHNhdmUgZmlsZXMgZGlhbG9nLiBUaGUgYnVsayBvZiB0aGUgY29kZQorICogZm9yIHRoaXMgZGlhbG9nIHdhcyB0YWtlbiBmcm9tIHRoZSBKRFQgcmVmYWN0b3JpbmcKKyAqIHN1cHBvcnQgaW4gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU2F2ZUhlbHBlci4KKyAqIFRoaXMgY2xhc3MgaXMgYSBnb29kIGNhbmRpZGF0ZSBmb3IgcmV1c2UgYW1vdW5nIGNvbXBvbmVudHMuCisgKi8KK3B1YmxpYyBjbGFzcyBTYXZlRmlsZXNEaWFsb2cgZXh0ZW5kcyBMaXN0RGlhbG9nIHsKKwkKKwlwdWJsaWMgU2F2ZUZpbGVzRGlhbG9nKFNoZWxsIHBhcmVudCkKKwl7CisJICBzdXBlcihwYXJlbnQpOworCSAgc2V0VGl0bGUoVmFsaWRhdGlvblVJTWVzc2FnZXMuU2F2ZUZpbGVzRGlhbG9nX3NhdmVfYWxsX3Jlc291cmNlcyk7IAorCSAgc2V0QWRkQ2FuY2VsQnV0dG9uKHRydWUpOworCSAgc2V0TGFiZWxQcm92aWRlcihjcmVhdGVEaWFsb2dMYWJlbFByb3ZpZGVyKCkpOworCSAgc2V0TWVzc2FnZShWYWxpZGF0aW9uVUlNZXNzYWdlcy5TYXZlRmlsZXNEaWFsb2dfbXVzdF9zYXZlKTsgCisJICBzZXRDb250ZW50UHJvdmlkZXIobmV3IExpc3RDb250ZW50UHJvdmlkZXIoKSk7CisJfQorCisJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgY29udGFpbmVyKSAKKwl7CisJCUNvbXBvc2l0ZSByZXN1bHQ9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEoY29udGFpbmVyKTsKKwkJYm9vbGVhbiBmQWxsb3dTYXZlQWx3YXlzID0gdHJ1ZTsKKwkJaWYgKGZBbGxvd1NhdmVBbHdheXMpIHsKKwkJCWZpbmFsIEJ1dHRvbiBjaGVjaz0gbmV3IEJ1dHRvbihyZXN1bHQsIFNXVC5DSEVDSyk7CisJCQljaGVjay5zZXRUZXh0KFZhbGlkYXRpb25VSU1lc3NhZ2VzLlNhdmVGaWxlc0RpYWxvZ19hbHdheXNfc2F2ZSk7IAorCQkJLy9jaGVjay5zZXRTZWxlY3Rpb24oUmVmYWN0b3JpbmdTYXZlUHJlZmVyZW5jZXMuZ2V0U2F2ZUFsbEVkaXRvcnMoKSk7CisJCQljaGVjay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJICB0cnkKKwkJCQkgIHsKKwkJCQkgICAgR2xvYmFsQ29uZmlndXJhdGlvbiBjb25maWcgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpOworCQkJCSAgICBjb25maWcuc2V0U2F2ZUF1dG9tYXRpY2FsbHkoY2hlY2suZ2V0U2VsZWN0aW9uKCkpOworCQkJCSAgICBjb25maWcuc3RvcmUoKTsKKwkJCQkgIH0KKwkJCQkgIGNhdGNoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKQorCQkJCSAgeworCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKFZhbGlkYXRpb25VSVBsdWdpbi5nZXRCdW5kbGVOYW1lKCkpLmxvZyhMZXZlbC5XQVJOSU5HLCAKKwkJCQkJCVZhbGlkYXRpb25VSU1lc3NhZ2VzLlVuYWJsZVRvU2F2ZSArIGV4Yyk7CisJCQkJICB9CisJCQkJICAKKwkJCQl9CisJCQl9KTsKKwkJCWFwcGx5RGlhbG9nRm9udChyZXN1bHQpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCQorCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgY3JlYXRlRGlhbG9nTGFiZWxQcm92aWRlcigpIHsKKwkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgeworCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7CisJCQkJcmV0dXJuICgoSUVkaXRvclBhcnQpIGVsZW1lbnQpLmdldFRpdGxlSW1hZ2UoKTsKKwkJCX0KKwkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgeworCQkJCXJldHVybiAoKElFZGl0b3JQYXJ0KSBlbGVtZW50KS5nZXRUaXRsZSgpOworCQkJfQorCQl9OworCX0JCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvU2F2ZUZpbGVzSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvU2F2ZUZpbGVzSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMyMzMzMgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9TYXZlRmlsZXNIZWxwZXIuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnVpOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworCisvKioKKyAqIEEgaGVscGVyIGNsYXNzIGZvciB0aGUgc2F2ZSBkaXJ0eSBmaWxlcyBkaWFsb2cuCisgKi8KK3B1YmxpYyBjbGFzcyBTYXZlRmlsZXNIZWxwZXIgeworCisJLyoqCisJICogUmV0cmVpdmUgYW4gYXJyYXkgb2YgSUVkaXRvclBhcnRzIHJlcHJlc2VudGluZyBhbGwgdGhlIGRpcnR5CisJICogZWRpdG9ycyBvcGVuIGZvciB0aGUgZmlsZXMgcHJvdmlkZWQgaW4gdGhlIGxpc3QuCisJICogCisJICogQHBhcmFtIGZpbGVzCisJICogCQkJQSBsaXN0IG9mIElGaWxlcy4KKwkgKiBAcmV0dXJuCisJICogCQkJQW4gYXJyYXkgb2YgSUVkaXRvclBhcnRzIGNvbnRhaW5pbmcgYWxsIHRoZSBkaXJ0eSBlZGl0b3JzIGZvciB0aGUgZmlsZXMgaW4gdGhlIGxpc3QuCisJICovCisJcHVibGljIHN0YXRpYyBJRWRpdG9yUGFydFtdIGdldERpcnR5RWRpdG9ycyhMaXN0IGZpbGVzKSB7CisJCVNldDxJRWRpdG9ySW5wdXQ+IGlucHV0cyA9IG5ldyBIYXNoU2V0PElFZGl0b3JJbnB1dD4oKTsKKwkJTGlzdDxJRWRpdG9yUGFydD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8SUVkaXRvclBhcnQ+KCk7CisJCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKKwkJSVdvcmtiZW5jaFdpbmRvd1tdIHdpbmRvd3MgPSB3b3JrYmVuY2guZ2V0V29ya2JlbmNoV2luZG93cygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHdpbmRvd3MubGVuZ3RoOyBpKyspIHsKKwkJCUlXb3JrYmVuY2hQYWdlW10gcGFnZXMgPSB3aW5kb3dzW2ldLmdldFBhZ2VzKCk7CisJCQlmb3IgKGludCB4ID0gMDsgeCA8IHBhZ2VzLmxlbmd0aDsgeCsrKSB7CisJCQkJSUVkaXRvclBhcnRbXSBlZGl0b3JzID0gcGFnZXNbeF0uZ2V0RGlydHlFZGl0b3JzKCk7CisJCQkJZm9yIChpbnQgeiA9IDA7IHogPCBlZGl0b3JzLmxlbmd0aDsgeisrKSB7CisJCQkJCUlFZGl0b3JQYXJ0IGVwID0gZWRpdG9yc1t6XTsKKwkJCQkJSUVkaXRvcklucHV0IGlucHV0ID0gZXAuZ2V0RWRpdG9ySW5wdXQoKTsKKwkJCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkgeworCQkJCQkJSUZpbGVFZGl0b3JJbnB1dCBmaWxlSW5wdXQgPSAoSUZpbGVFZGl0b3JJbnB1dCkgaW5wdXQ7CisJCQkJCQlpZiAoZmlsZXMuY29udGFpbnMoZmlsZUlucHV0LmdldEZpbGUoKSkpIHsKKwkJCQkJCQlpZiAoIWlucHV0cy5jb250YWlucyhpbnB1dCkpIHsKKwkJCQkJCQkJaW5wdXRzLmFkZChpbnB1dCk7CisJCQkJCQkJCXJlc3VsdC5hZGQoZXApOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkobmV3IElFZGl0b3JQYXJ0W3Jlc3VsdC5zaXplKCldKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvVmFsaWRhdGVBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9WYWxpZGF0ZUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNGM4MjkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvVmFsaWRhdGVBY3Rpb24uamF2YQpAQCAtMCwwICsxLDY3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWk7CisKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb247CisKKworcHVibGljIGNsYXNzIFZhbGlkYXRlQWN0aW9uIGV4dGVuZHMgU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb24geworCXByb3RlY3RlZCBWYWxpZGF0aW9uTWVudUFjdGlvbiBkZWxlZ2F0ZTsKKworCXB1YmxpYyBWYWxpZGF0ZUFjdGlvbigpIHsKKwkJc3VwZXIoVmFsaWRhdGlvblVJTWVzc2FnZXMuVmFsaWRhdGUpOworCQlkZWxlZ2F0ZSA9IG5ldyBWYWxpZGF0aW9uTWVudUFjdGlvbigpOworCX0KKworCS8qKgorCSAqIEltcGxlbWVudGF0aW9uIG9mIG1ldGhvZCBkZWZpbmVkIG9uIDxjb2RlPklBY3Rpb248L2NvZGU+LgorCSAqLworCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJZGVsZWdhdGUucnVuKHRoaXMpOworCX0KKworCS8qKgorCSAqIFVwZGF0ZXMgdGhpcyBhY3Rpb24gaW4gcmVzcG9uc2UgdG8gdGhlIGdpdmVuIHNlbGVjdGlvbi4KKwkgKiA8cD4KKwkgKiBUaGUgPGNvZGU+U2VsZWN0aW9uTGlzdGVuZXJBY3Rpb248L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHJldHVybnMKKwkgKiA8Y29kZT50cnVlPC9jb2RlPi4gU3ViY2xhc3NlcyBtYXkgZXh0ZW5kIHRvIHJlYWN0IHRvIHNlbGVjdGlvbiBjaGFuZ2VzOyBob3dldmVyLCBpZiB0aGUKKwkgKiBzdXBlciBtZXRob2QgcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4sIHRoZSBvdmVycmlkaW5nIG1ldGhvZCBtdXN0IGFsc28gcmV0dXJuCisJICogPGNvZGU+ZmFsc2U8L2NvZGU+LgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAcGFyYW0gc2VsZWN0aW9uCisJICogICAgICAgICAgICB0aGUgbmV3IHNlbGVjdGlvbgorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFjdGlvbiBzaG91bGQgYmUgZW5hYmxlZCBmb3IgdGhpcyBzZWxlY3Rpb24sIGFuZAorCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorCSAqLworCXByb3RlY3RlZCBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJaWYgKCFzdXBlci51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKSkKKwkJCXJldHVybiBmYWxzZTsKKworCQlkZWxlZ2F0ZS5zZWxlY3Rpb25DaGFuZ2VkKHRoaXMsIHNlbGVjdGlvbik7CisKKwkJcmV0dXJuIGlzRW5hYmxlZCgpOyAvLyAiRW5hYmxlZCIgaXMgc2V0IGJ5IHRoZSBkZWxlZ2F0ZS4KKwl9CisKKwkvKioKKwkgKiBJZiBhIHN1YmNsYXNzIG9mIFZhbGlkYXRlQWN0aW9uIGVuYWJsZXMgdGhpcyBtZW51IGFjdGlvbiBvbiBhIHR5cGUgdGhhdCBpcyBub3QgYW4gSVJlc291cmNlLAorCSAqIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIElSZXNvdXJjZVtdIHRoYXQgcmVwcmVzZW50IHRoYXQgb2JqZWN0LiBJZiBudWxsIGlzIHJldHVybmVkLCB0aGUKKwkgKiBvYmplY3Qgd2lsbCBiZSBpZ25vcmVkIGFuZCB0aGUgdXNlciB3aWxsIG5vdCBiZSBub3RpZmllZCB0aGF0IHRoZSBvYmplY3Qgd2FzIG5vdCB2YWxpZGF0ZWQuCisJICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbiB1cGRhdGVTZWxlY3Rpb24gYW5kIHJ1biBhcmUgY2FsbGVkLiAoVGhlIHJlc3VsdCBvZiB0aGlzCisJICogbWV0aG9kIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIHJlc291cmNlcyB3aWxsIGJlIHZhbGlkYXRlZCkKKwkgKi8KKwlwcm90ZWN0ZWQgSVJlc291cmNlW10gZ2V0UmVzb3VyY2UoT2JqZWN0IHNlbGVjdGVkKSB7CisJCXJldHVybiBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9WYWxpZGF0aW9uSm9iLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvVmFsaWRhdGlvbkpvYi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMzdmNjQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvVmFsaWRhdGlvbkpvYi5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC51aTsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7CisKK3B1YmxpYyBjbGFzcyBWYWxpZGF0aW9uSm9iIGV4dGVuZHMgSm9iIHsKKworCisJcHJpdmF0ZSBNYXAgcHJvamVjdHM7CisJcHVibGljIFZhbGlkYXRpb25Kb2IoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCisKKwlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0c01hcChNYXAgcHJvamVjdHMpeworCQl0aGlzLnByb2plY3RzID0gcHJvamVjdHM7CisJfQorCisKKwlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXByb3RlY3RlZCBNYXAgZ2V0UHJvamVjdHMoKSB7CisJCXJldHVybiBwcm9qZWN0czsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvVmFsaWRhdGlvbk1lbnVBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9WYWxpZGF0aW9uTWVudUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNmM0MDcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvVmFsaWRhdGlvbk1lbnVBY3Rpb24uamF2YQpAQCAtMCwwICsxLDM5MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWk7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVZpc2l0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRnJhbWV3b3JrOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkRpc2FibGVkUmVzb3VyY2VNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyUmVnaXN0cnlSZWFkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWkucGx1Z2luLlZhbGlkYXRpb25VSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS5pbnRlcm5hbC5NYW51YWxWYWxpZGF0aW9uUnVubmVyOworCisvKioKKyAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgcG9wLXVwIG1lbnUgaXRlbSAiUnVuIFZhbGlkYXRpb24iIFdoZW4gdGhlIGl0ZW0gaXMgc2VsZWN0ZWQsIHRoaXMKKyAqIGFjdGlvbiB0cmlnZ2VycyBhIHZhbGlkYXRpb24gb2YgdGhlIHByb2plY3QsIHVzaW5nIGFsbCBjb25maWd1cmVkLCBlbmFibGVkIHZhbGlkYXRvcnMuCisgKi8KK3B1YmxpYyBjbGFzcyBWYWxpZGF0aW9uTWVudUFjdGlvbiBpbXBsZW1lbnRzIElWaWV3QWN0aW9uRGVsZWdhdGUgeworCXByaXZhdGUgSVNlbGVjdGlvbiAJCV9jdXJyZW50U2VsZWN0aW9uOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUCA9ICIvIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgRGlzcGxheSAJCV9jdXJyZW50RGlzcGxheTsKKwlwcml2YXRlIElSZXNvdXJjZVZpc2l0b3IgX2ZvbGRlclZpc2l0b3I7CisJcHJpdmF0ZSBJUmVzb3VyY2VWaXNpdG9yIF9wcm9qZWN0VmlzaXRvcjsKKwlwcml2YXRlIE1hcDxJUHJvamVjdCwgU2V0PElSZXNvdXJjZT4+IF9zZWxlY3RlZFJlc291cmNlczsKKworCXB1YmxpYyBWYWxpZGF0aW9uTWVudUFjdGlvbigpIHsKKwkJLy8gY2FjaGUgdGhlIGRpc3BsYXkgYmVmb3JlIHRoaXMgYWN0aW9uIGlzIGZvcmtlZC4gQWZ0ZXIgdGhlIGFjdGlvbiBpcyBmb3JrZWQsCisJCS8vIERpc3BsYXkuZ2V0Q3VycmVudCgpIHJldHVybnMgbnVsbC4KKwkJX2N1cnJlbnREaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7IAorCQlfc2VsZWN0ZWRSZXNvdXJjZXMgPSBuZXcgSGFzaE1hcDxJUHJvamVjdCwgU2V0PElSZXNvdXJjZT4+KCk7CisJfQorCisJcHJpdmF0ZSBEaXNwbGF5IGdldERpc3BsYXkoKSB7CisJCXJldHVybiAoX2N1cnJlbnREaXNwbGF5ID09IG51bGwpID8gRGlzcGxheS5nZXRDdXJyZW50KCkgOiBfY3VycmVudERpc3BsYXk7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSB3aXphcmQncyBzaGVsbC4KKwkgKi8KKwlTaGVsbCBnZXRTaGVsbCgpIHsKKwkJRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSgpOworCQlTaGVsbCBzaGVsbCA9IChkaXNwbGF5ID09IG51bGwpID8gbnVsbCA6IGRpc3BsYXkuZ2V0QWN0aXZlU2hlbGwoKTsKKwkJaWYgKHNoZWxsID09IG51bGwgJiYgZGlzcGxheSAhPSBudWxsKSB7CisJCQlTaGVsbFtdIHNoZWxscyA9IGRpc3BsYXkuZ2V0U2hlbGxzKCk7CisJCQlpZiAoc2hlbGxzLmxlbmd0aCA+IDApCisJCQkJc2hlbGwgPSBzaGVsbHNbMF07CisJCX0KKwkJcmV0dXJuIHNoZWxsOworCX0KKworCS8qKgorCSAqIFJldHVybiBhIG1hcCBvZiB0aGUgc2VsZWN0ZWQgZWxlbWVudHMuIEVhY2gga2V5IG9mIHRoZSBtYXAgaXMgYW4gSVByb2plY3QsIGFuZCB0aGUgdmFsdWUgaXMgYQorCSAqIFNldCBvZiB0aGUgc2VsZWN0ZWQgcmVzb3VyY2VzIGluIHRoYXQgcHJvamVjdC4gSWYgYSBwcm9qZWN0IGlzIHNlbGVjdGVkLCBhbmQgbm90aGluZyBlbHNlIGluCisJICogdGhlIHByb2plY3QgaXMgc2VsZWN0ZWQsIGEgZnVsbCB2YWxpZGF0aW9uIChudWxsIHZhbHVlKSB3aWxsIGJlIGRvbmUgb24gdGhlIHByb2plY3QuIElmIGEKKwkgKiBwcm9qZWN0IGlzIHNlbGVjdGVkLCBhbmQgc29tZSBmaWxlcy9mb2xkZXJzIGluIHRoZSBwcm9qZWN0IGFyZSBhbHNvIHNlbGVjdGVkLCBvbmx5IHRoZQorCSAqIGZpbGVzL2ZvbGRlcnMgd2lsbCBiZSB2YWxpZGF0ZWQuIElmIGEgZm9sZGVyIGlzIHNlbGVjdGVkLCBhbGwgb2YgaXRzIGNvbnRlbnRzIGFyZSBhbHNvCisJICogdmFsaWRhdGVkLgorCSAqIAorCSAqIEByZXR1cm4gbnVsbCBpZiB0aGVyZSBpcyBubyBzZWxlY3Rpb24uCisJICovCisJcHJpdmF0ZSBNYXA8SVByb2plY3QsIFNldDxJUmVzb3VyY2U+PiBsb2FkU2VsZWN0ZWQoVmFsaWRhdGVBY3Rpb24gYWN0aW9uKSB7CisJCS8vIEdSSyBwcmV2aW91c2x5IHRoaXMgZGlkIG5vdCBkbyBhIGNsZWFyLCBidXQgSSBjb3VsZG4ndCB1bmRlcnN0YW5kIHdoeSB0aGF0IHdvdWxkIGJlIHNvIEkgYW0gZm9yY2luZyBhIGNsZWFyCisJCS8vIEdSSyBJbiBteSB0ZXN0aW5nLCBub3QgZG9pbmcgYSBjbGVhciBjYXVzZWQgZHVwbGljYXRlIHZhbGlkYXRpb25zCisJCV9zZWxlY3RlZFJlc291cmNlcy5jbGVhcigpOworCQlpZiAoKF9jdXJyZW50U2VsZWN0aW9uID09IG51bGwpIHx8IF9jdXJyZW50U2VsZWN0aW9uLmlzRW1wdHkoKSB8fCAKKwkJCSEoX2N1cnJlbnRTZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpcmV0dXJuIG51bGw7CisJCQorCQlPYmplY3RbXSBlbGVtZW50cyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIF9jdXJyZW50U2VsZWN0aW9uKS50b0FycmF5KCk7CisJCWZvciAoT2JqZWN0IGVsZW1lbnQgOiBlbGVtZW50cykgeworCQkJaWYgKGVsZW1lbnQgIT0gbnVsbClhZGRTZWxlY3RlZChhY3Rpb24sIGVsZW1lbnQpOworCQl9CisJCXJldHVybiBfc2VsZWN0ZWRSZXNvdXJjZXM7CisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZFNlbGVjdGVkKFZhbGlkYXRlQWN0aW9uIGFjdGlvbiwgT2JqZWN0IHNlbGVjdGVkKSB7CisJCWlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIElQcm9qZWN0KSB7CisJCQlhZGRWaXNpdG9yKChJUHJvamVjdCkgc2VsZWN0ZWQpOworCQl9IGVsc2UgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgSUZpbGUpIHsKKwkJCWFkZFNlbGVjdGVkKChJRmlsZSkgc2VsZWN0ZWQpOworCQl9IGVsc2UgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgSUZvbGRlcikgeworCQkJYWRkVmlzaXRvcigoSUZvbGRlcikgc2VsZWN0ZWQpOworCQl9IGVsc2UgaWYgKGlzVmFsaWRUeXBlKGdldEV4dGVuZGVkVHlwZShzZWxlY3RlZCkpKSB7CisJCQlhZGRTZWxlY3RlZChhY3Rpb24sZ2V0RXh0ZW5kZWRUeXBlKHNlbGVjdGVkKSk7CisJCX0gZWxzZSB7CisJCQkvLyBOb3QgYSB2YWxpZCBpbnB1dCB0eXBlLiBNdXN0IGJlIElQcm9qZWN0LCBJSmF2YVByb2plY3QsIG9yIElSZXNvdXJjZS4KKwkJCS8vIElmIHRoaXMgVmFsaWRhdGlvbk1lbnVBY3Rpb24gaXMgYSBkZWxlZ2F0ZSBvZiBWYWxpZGF0ZUFjdGlvbiwgaXMKKwkJCS8vIHRoZSBpbnB1dCB0eXBlIHJlY29nbml6ZWQgYnkgdGhlIFZhbGlkYXRlQWN0aW9uPworCQkJYm9vbGVhbiB2YWxpZCA9IGZhbHNlOworCQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7CisJCQkJSVJlc291cmNlW10gcmVzb3VyY2VzID0gYWN0aW9uLmdldFJlc291cmNlKHNlbGVjdGVkKTsKKwkJCQlpZiAocmVzb3VyY2VzICE9IG51bGwpIHsKKwkJCQkJdmFsaWQgPSB0cnVlOworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgeworCQkJCQkJYWRkU2VsZWN0ZWQoYWN0aW9uLCByZXNvdXJjZXNbaV0pOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaWYgKCF2YWxpZCkgeworCQkJCS8vIFN0b3AgcHJvY2Vzc2luZy4gVGhpcyBhbGxvd3MgdGhlICJSdW4gVmFsaWRhdGlvbiIgbWVudSBpdGVtCisJCQkJLy8gdG8gZ3JheSBvdXQgb25jZSBhbiBlbGVtZW50IHRoYXQgY2FuIG5vdCBiZSB2YWxpZGF0ZWQgaXMgc2VsZWN0ZWQuCisJCQkJX3NlbGVjdGVkUmVzb3VyY2VzLmNsZWFyKCk7CisJCQl9CisJCX0KKwl9CisJCisJcHJpdmF0ZSBPYmplY3QgZ2V0RXh0ZW5kZWRUeXBlKE9iamVjdCBzZWxlY3RlZCkgeworCQlPYmplY3QgcmVzdWx0ID0gVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXJSZWdpc3RyeVJlYWRlci5nZXRJbnN0YW5jZSgpLmdldEV4dGVuZGVkVHlwZShzZWxlY3RlZCk7CisJCXJldHVybiByZXN1bHQgPT0gbnVsbCA/IHNlbGVjdGVkIDogcmVzdWx0OworCX0KKwkKKwlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFR5cGUoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgSVByb2plY3QgfHwgb2JqZWN0IGluc3RhbmNlb2YgSUZpbGUgfHwgb2JqZWN0IGluc3RhbmNlb2YgSUZvbGRlcjsKKwl9CisKKworCXZvaWQgYWRkU2VsZWN0ZWQoSVJlc291cmNlIHNlbGVjdGVkKSB7CisJCUlQcm9qZWN0IHByb2plY3QgPSBzZWxlY3RlZC5nZXRQcm9qZWN0KCk7CisJCWJvb2xlYW4gYWRkZWQgPSBfc2VsZWN0ZWRSZXNvdXJjZXMuY29udGFpbnNLZXkocHJvamVjdCk7CisJCVNldDxJUmVzb3VyY2U+IGNoYW5nZWRSZXMgPSBudWxsOworCQlpZiAoYWRkZWQpIHsKKwkJCS8vIElmIHRoZSB2YWx1ZSBpcyBudWxsLCB0aGUgZW50aXJlIHByb2plY3QgbmVlZHMgdG8gYmUgdmFsaWRhdGVkIGFueXdheS4KKwkJCWNoYW5nZWRSZXMgPSBfc2VsZWN0ZWRSZXNvdXJjZXMuZ2V0KHByb2plY3QpOworCQkJaWYgKGNoYW5nZWRSZXMgPT0gbnVsbClyZXR1cm47CisJCQkKKwkJfSBlbHNlIHsKKwkJCWNoYW5nZWRSZXMgPSBuZXcgSGFzaFNldDxJUmVzb3VyY2U+KCk7CisJCX0KKwkJaWYgKGNoYW5nZWRSZXMuYWRkKHNlbGVjdGVkKSkgeworCQkJX3NlbGVjdGVkUmVzb3VyY2VzLnB1dChwcm9qZWN0LCBjaGFuZ2VkUmVzKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBhZGRWaXNpdG9yKElGb2xkZXIgc2VsZWN0ZWQpIHsKKwkJLy8gYWRkIHRoZSBmb2xkZXIgYW5kIGl0cyBjaGlsZHJlbgorCQl0cnkgeworCQkJc2VsZWN0ZWQuYWNjZXB0KGdldEZvbGRlclZpc2l0b3IoKSk7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7CisJCQlWYWxpZGF0aW9uVUlQbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGV4Yyk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlwcml2YXRlIElSZXNvdXJjZVZpc2l0b3IgZ2V0Rm9sZGVyVmlzaXRvcigpIHsKKwkJaWYgKF9mb2xkZXJWaXNpdG9yID09IG51bGwpIHsKKwkJCV9mb2xkZXJWaXNpdG9yID0gbmV3IElSZXNvdXJjZVZpc2l0b3IoKSB7CisJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlIHJlcykgeworCQkJCQlpZiAocmVzIGluc3RhbmNlb2YgSUZpbGUpIHsKKwkJCQkJCWFkZFNlbGVjdGVkKHJlcyk7CisJCQkJCX0gZWxzZSBpZiAocmVzIGluc3RhbmNlb2YgSUZvbGRlcikgeworCQkJCQkJYWRkU2VsZWN0ZWQocmVzKTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gdHJ1ZTsgLy8gdmlzaXQgdGhlIHJlc291cmNlJ3MgY2hpbGRyZW4KKwkJCQl9CisJCQl9OworCQl9CisJCXJldHVybiBfZm9sZGVyVmlzaXRvcjsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGFkZFZpc2l0b3IoSVByb2plY3Qgc2VsZWN0ZWQpIHsKKwkJLy8gYWRkIHRoZSBmb2xkZXIgYW5kIGl0cyBjaGlsZHJlbgorCQlpZighc2VsZWN0ZWQuaXNBY2Nlc3NpYmxlKCkpcmV0dXJuOworCQl0cnkgeworCQkJc2VsZWN0ZWQuYWNjZXB0KGdldFByb2plY3RWaXNpdG9yKCkpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4YykgeworCQkJVmFsaWRhdGlvblVJUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihleGMpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJcHJpdmF0ZSBJUmVzb3VyY2VWaXNpdG9yIGdldFByb2plY3RWaXNpdG9yKCkgeworCQlpZiAoX3Byb2plY3RWaXNpdG9yID09IG51bGwpIHsKKwkJCV9wcm9qZWN0VmlzaXRvciA9IG5ldyBJUmVzb3VyY2VWaXNpdG9yKCkgeworCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZSByZXMpIHsKKwkJCQkJaWYgKERpc2FibGVkUmVzb3VyY2VNYW5hZ2VyLmdldERlZmF1bHQoKS5pc0Rpc2FibGVkKHJlcykpcmV0dXJuIGZhbHNlOworCQkJCQlpZiAocmVzIGluc3RhbmNlb2YgSUZpbGUpYWRkU2VsZWN0ZWQocmVzKTsKKwkJCQkJZWxzZSBpZiAocmVzIGluc3RhbmNlb2YgSUZvbGRlcilhZGRTZWxlY3RlZChyZXMpOworCQkJCQllbHNlIGlmIChyZXMgaW5zdGFuY2VvZiBJUHJvamVjdClhZGRTZWxlY3RlZChyZXMpOworCQkJCQkKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfTsKKwkJfQorCQlyZXR1cm4gX3Byb2plY3RWaXNpdG9yOworCX0KKworCS8qKgorCSAqIFRoZSBkZWxlZ2F0aW5nIGFjdGlvbiBoYXMgYmVlbiBpbnZva2VkLiBUaGlzIG1ldGhvZCBkb2VzIHRoZSBhY3R1YWwgd29yay4KKwkgKiAKKwkgKiBAcGFyYW0gYWN0aW9uCisJICogICAgICAgICAgICBBY3Rpb24gcHJveHkgdGhhdCBoYW5kbGVzIHRoZSBwcmVzZW50YXRpb24gcG9ydGlvbiBvZiB0aGUgcGx1Zy1pbiBhY3Rpb24uCisJICovCisJcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7CisJCVZhbGlkYXRlQWN0aW9uIHZhY3Rpb24gPSBudWxsOworCQlpZiAoYWN0aW9uIGluc3RhbmNlb2YgVmFsaWRhdGVBY3Rpb24pIHsKKwkJCXZhY3Rpb24gPSAoVmFsaWRhdGVBY3Rpb24pIGFjdGlvbjsKKwkJfQorCQlmaW5hbCBNYXA8SVByb2plY3QsIFNldDxJUmVzb3VyY2U+PiBwcm9qZWN0cyA9IGxvYWRTZWxlY3RlZCh2YWN0aW9uKTsKKwkJaWYgKChwcm9qZWN0cyA9PSBudWxsKSB8fCAocHJvamVjdHMuc2l6ZSgpID09IDApKSB7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCS8vIElmIHRoZSBmaWxlcyBhcmVuJ3Qgc2F2ZWQgZG8gbm90IHJ1biB2YWxpZGF0aW9uLgorCQlpZighaGFuZGxlRmlsZXNUb1NhdmUocHJvamVjdHMpKXJldHVybjsKKworCQlib29sZWFuIGNvbmZpcm0gPSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxNYW5hZ2VyLmdldERlZmF1bHQoKS5nZXRHbG9iYWxQcmVmZXJlbmNlcygpCisJCQkuZ2V0Q29uZmlybURpYWxvZygpOworCQlNYW51YWxWYWxpZGF0aW9uUnVubmVyLnZhbGlkYXRlKHByb2plY3RzLCBWYWxUeXBlLk1hbnVhbCwgY29uZmlybSk7CisJfQorCQorCS8qKgorCSAqIFNlbGVjdGlvbiBpbiB0aGUgZGVza3RvcCBoYXMgY2hhbmdlZC4gUGx1Zy1pbiBwcm92aWRlciBjYW4gdXNlIGl0IHRvIGNoYW5nZSB0aGUgYXZhaWxhYmlsaXR5CisJICogb2YgdGhlIGFjdGlvbiBvciB0byBtb2RpZnkgb3RoZXIgcHJlc2VudGF0aW9uIHByb3BlcnRpZXMuCisJICogCisJICogPHA+CisJICogQWN0aW9uIGRlbGVnYXRlIGNhbm5vdCBiZSBub3RpZmllZCBhYm91dCBzZWxlY3Rpb24gY2hhbmdlcyBiZWZvcmUgaXQgaXMgbG9hZGVkLiBGb3IgdGhhdAorCSAqIHJlYXNvbiwgY29udHJvbCBvZiBhY3Rpb24ncyBlbmFibGUgc3RhdGUgc2hvdWxkIGFsc28gYmUgcGVyZm9ybWVkIHRocm91Z2ggc2ltcGxlIFhNTCBydWxlcworCSAqIGRlZmluZWQgZm9yIHRoZSBleHRlbnNpb24gcG9pbnQuIFRoZXNlIHJ1bGVzIGFsbG93IGVuYWJsZSBzdGF0ZSBjb250cm9sIGJlZm9yZSB0aGUgZGVsZWdhdGUKKwkgKiBoYXMgYmVlbiBsb2FkZWQuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBhY3Rpb24KKwkgKiAgICAgICAgICAgIGFjdGlvbiBwcm94eSB0aGF0IGhhbmRsZXMgcHJlc2VudGF0aW9uIHBvcnRpb24gb2YgdGhlIHBsdWctaW4gYWN0aW9uCisJICogQHBhcmFtIHNlbGVjdGlvbgorCSAqICAgICAgICAgICAgY3VycmVudCBzZWxlY3Rpb24gaW4gdGhlIGRlc2t0b3AKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQlfY3VycmVudFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKKwkJYm9vbGVhbiBlbmFibGVkID0gcXVpY2tDaGVjayhzZWxlY3Rpb24pOworCQkKKwkJLy8gRG9uJ3QgZm9yY2UgdGhlIHBsdWctaW4gdG8gYmUgYWN0aXZhdGVkIGp1c3QgdG8gY2hlY2sgdGhpcyBzZXR0aW5nLgorCQlpZiAoZW5hYmxlZCAmJiBWYWxpZGF0aW9uUGx1Z2luLmlzQWN0aXZhdGVkKCkgJiYgVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmlzQWN0aXZhdGVkKCkpeworCQkJZW5hYmxlZCA9IGhhc01hbnVhbFZhbGlkYXRvcnMoc2VsZWN0aW9uKTsKKwkJfQorCQlhY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKKwl9CisJCisJLyoqCisJICogRG8gYSBxdWljayBjaGVjayBvbiB0aGUgc2VsZWN0aW9uLCBzbyBzZWUgaWYgd2Uga25vdyB0aGF0IHdlIGRvbid0IHdhbnQgdG8gdmFsaWRhdGUgdGhlIHNlbGVjdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gc2VsZWN0aW9uCisJICogQHJldHVybiBmYWxzZSBpZiB3ZSBhcmUgc3VyZSB0aGF0IHdlIGRvbid0IHdhbnQgdG8gdmFsaWRhdGUgaXQuIFJldHVybiB0cnVlIGlmIHdlIGFyZSBzdGlsbCBub3Qgc3VyZS4KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gcXVpY2tDaGVjayhJU2VsZWN0aW9uIHNlbGVjdGlvbil7CisJCWlmIChzZWxlY3Rpb24gPT0gbnVsbCB8fCBzZWxlY3Rpb24uaXNFbXB0eSgpKXJldHVybiBmYWxzZTsKKwkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXsKKwkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKKwkJCU9iamVjdCBzZWwgPSBzcy5nZXRGaXJzdEVsZW1lbnQoKTsKKwkJCWlmIChzZWwgIT0gbnVsbCl7CisJCQkJaWYgKHNlbCBpbnN0YW5jZW9mIElQcm9qZWN0KXsKKwkJCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdClzZWw7CisJCQkJCWlmICghcHJvamVjdC5pc09wZW4oKSlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCQorCS8qKgorCSAqIEFuc3dlciB0cnVlIGlmIGFueSBvZiB0aGUgc2VsZWN0ZWQgaXRlbXMgaGF2ZSBtYW51YWwgdmFsaWRhdG9ycyBlbmFibGVkLgorCSAqIEBwYXJhbSBzZWxlY3Rpb24KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaGFzTWFudWFsVmFsaWRhdG9ycyhJU2VsZWN0aW9uIHNlbGVjdGlvbil7CisJCQkJCisJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbil7CisJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzcyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247CisJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gc3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyl7CisJCQkJT2JqZWN0IHNlbCA9IGl0Lm5leHQoKTsKKwkJCQlpZiAoc2VsIGluc3RhbmNlb2YgSVJlc291cmNlKXsKKwkJCQkJSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSlzZWw7CisJCQkJCWlmIChWYWxpZGF0aW9uRnJhbWV3b3JrLmdldERlZmF1bHQoKS5oYXNWYWxpZGF0b3JzKHJlc291cmNlLCB0cnVlLCBmYWxzZSkpcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfQkJCisJCX0KKwkJCisJCXJldHVybiBmYWxzZTsKKwkJCisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZSNpbml0KG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0KElWaWV3UGFydCB2aWV3KSB7IAorCX0KKwkKKwkvKioKKwkgKiBIYW5kbGUgYW55IGZpbGVzIHRoYXQgbXVzdCBiZSBzYXZlZCBwcmlvciB0byBydW5uaW5nCisJICogdmFsaWRhdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gcHJvamVjdHMKKwkgKiAJCQlUaGUgbGlzdCBvZiBwcm9qZWN0cyB0aGF0IHdpbGwgYmUgdmFsaWRhdGVkLgorCSAqIEByZXR1cm4KKwkgKiAJCQlUcnVlIGlmIGFsbCBmaWxlcyBoYXZlIGJlZW4gc2F2ZWQsIGZhbHNlIG90aGVyd2lzZS4KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVGaWxlc1RvU2F2ZShNYXA8SVByb2plY3QsIFNldDxJUmVzb3VyY2U+PiBwcm9qZWN0cykKKwl7CisJICBMaXN0IGZpbGVMaXN0ID0gZ2V0SUZpbGVzKHByb2plY3RzKTsKKyAgICAgIGZpbmFsIElFZGl0b3JQYXJ0W10gZGlydHlFZGl0b3JzID0gU2F2ZUZpbGVzSGVscGVyLmdldERpcnR5RWRpdG9ycyhmaWxlTGlzdCk7CisgICAgICBpZihkaXJ0eUVkaXRvcnMgPT0gbnVsbCB8fCBkaXJ0eUVkaXRvcnMubGVuZ3RoID09IDApcmV0dXJuIHRydWU7CisgICAgICBib29sZWFuIHNhdmVBdXRvbWF0aWNhbGx5ID0gZmFsc2U7CisgICAgICB0cnkKKyAgICAgIHsKKyAgICAgICAgc2F2ZUF1dG9tYXRpY2FsbHkgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpLmdldFNhdmVBdXRvbWF0aWNhbGx5KCk7CisgICAgICB9CisgICAgICBjYXRjaChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpCisgICAgICB7CisgICAgCS8vIEluIHRoaXMgY2FzZSBzaW1wbHkgZGVmYXVsdCB0byBmYWxzZS4KKyAgICAgIH0KKyAgICAgIFNhdmVGaWxlc0RpYWxvZyBzZkRpYWxvZyA9IG51bGw7CisgICAgICBpZighc2F2ZUF1dG9tYXRpY2FsbHkpCisgICAgICB7CisJICAgIHNmRGlhbG9nID0gbmV3IFNhdmVGaWxlc0RpYWxvZyhWYWxpZGF0aW9uVUlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSk7CisJICAgIHNmRGlhbG9nLnNldElucHV0KEFycmF5cy5hc0xpc3QoZGlydHlFZGl0b3JzKSk7CisgICAgICB9CisgICAgICAKKyAgICAgIGlmKHNhdmVBdXRvbWF0aWNhbGx5IHx8IHNmRGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0speworICAgIAkgIFByb2dyZXNzTW9uaXRvckRpYWxvZyBjdHggPSBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKGdldFNoZWxsKCkpOworICAgICAgICAgIAorICAgICAgICAgIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKXsKKyAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9ueworICAgICAgICAgICAgCSAgdHJ5IHsKKyAgICAgICAgICAgIAkJICBtb25pdG9yLmJlZ2luVGFzayhWYWxpZGF0aW9uVUlNZXNzYWdlcy5TYXZlRmlsZXNEaWFsb2dfc2F2aW5nLCBkaXJ0eUVkaXRvcnMubGVuZ3RoKTsKKyAgICAgICAgICAgIAkJICBpbnQgbnVtRGlydHlFZGl0b3JzID0gZGlydHlFZGl0b3JzLmxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbnVtRGlydHlFZGl0b3JzOyBpKyspeworICAgICAgICAgICAgICAgICAgICAJICBkaXJ0eUVkaXRvcnNbaV0uZG9TYXZlKG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAkgIH0gZmluYWxseSB7CisgICAgICAgICAgICAJCSAgbW9uaXRvci5kb25lKCk7CisgICAgICAgICAgICAJICB9CisgICAgICAgICAgICAgfQorICAgICAgICAgIH07CisgICAgICAgICAgCisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjdHgucnVuKGZhbHNlLCB0cnVlLCBydW5uYWJsZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgVmFsaWRhdGlvblVJUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIAkgIFZhbGlkYXRpb25VSVBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7CisgICAgICAgICAgfQorICAgICAgfQorCSAgcmV0dXJuIGZhbHNlOworCX0KKwkKKwlwcm90ZWN0ZWQgTGlzdDxJRmlsZT4gZ2V0SUZpbGVzKE1hcDxJUHJvamVjdCwgU2V0PElSZXNvdXJjZT4+IHByb2plY3RzKSB7CisJCUxpc3Q8SUZpbGU+IGZpbGVMaXN0ID0gbmV3IExpbmtlZExpc3Q8SUZpbGU+KCk7CisJCWZvcihJUHJvamVjdCBwcm9qZWN0IDogcHJvamVjdHMua2V5U2V0KCkpIHsKKwkJICBmb3IoSVJlc291cmNlIHJlc291cmNlIDogcHJvamVjdHMuZ2V0KHByb2plY3QpKSB7CisJCQlpZihyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKWZpbGVMaXN0LmFkZCgoSUZpbGUpcmVzb3VyY2UpOworCQkgIH0KKwkJfQorCQlyZXR1cm4gZmlsZUxpc3Q7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL1ZhbGlkYXRpb25VSU1lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvVmFsaWRhdGlvblVJTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjk2M2IzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL1ZhbGlkYXRpb25VSU1lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqIC8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC51aTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CisKKy8qKgorICogU3RyaW5ncyB1c2VkIGJ5IFZhbGlkYXRpb24gVUkuCisgKi8KK3B1YmxpYyBjbGFzcyBWYWxpZGF0aW9uVUlNZXNzYWdlcyBleHRlbmRzIE5MUyB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnVpLnZhbGlkYXRpb251aSI7Ly8kTk9OLU5MUy0xJAorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2F2ZUZpbGVzRGlhbG9nX3NhdmluZzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTYXZlRmlsZXNEaWFsb2dfYWx3YXlzX3NhdmU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2F2ZUZpbGVzRGlhbG9nX3NhdmVfYWxsX3Jlc291cmNlczsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTYXZlRmlsZXNEaWFsb2dfbXVzdF9zYXZlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZQYWdlX2Fsd2F5c19zYXZlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJ1blZhbGlkYXRpb25EaWFsb2dUaXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBVbmFibGVUb1NhdmU7CisJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgVmFsaWRhdGU7CisJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgVmFsUmVzdWx0czsKKworCS8vIHJlc3VsdHMgdmFsaWRhdGluZyBvbmUgcmVzb3VyY2UKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxFcnJvcjFSZXNvdXJjZTE7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVmFsRXJyb3JzUmVzb3VyY2UxOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbFdhcm4xUmVzb3VyY2UxOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbFdhcm5SZXNvdXJjZTE7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVmFsSW5mbzFSZXNvdXJjZTE7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVmFsSW5mb1Jlc291cmNlMTsKKworCS8vIHJlc3VsdHMgdmFsaWRhdGluZyBtdWx0aXBsZSByZXNvdXJjZXMKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxFcnJvcjFSZXNvdXJjZXM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVmFsRXJyb3JzUmVzb3VyY2VzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbFdhcm4xUmVzb3VyY2VzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbFdhcm5SZXNvdXJjZXM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVmFsSW5mbzFSZXNvdXJjZXM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVmFsSW5mb1Jlc291cmNlczsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbFN1Y2Nlc3M7CisJCisKKwlzdGF0aWMgeworCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKKwkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgVmFsaWRhdGlvblVJTWVzc2FnZXMuY2xhc3MpOworCX0KKworCXByaXZhdGUgVmFsaWRhdGlvblVJTWVzc2FnZXMoKSB7CisJCS8vIGNhbm5vdCBjcmVhdGUgbmV3IGluc3RhbmNlCisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL3BsdWdpbi9SdW5uYWJsZVdpdGhQcm9ncmVzc1dyYXBwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9wbHVnaW4vUnVubmFibGVXaXRoUHJvZ3Jlc3NXcmFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE4YWNiOAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9wbHVnaW4vUnVubmFibGVXaXRoUHJvZ3Jlc3NXcmFwcGVyLmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWkucGx1Z2luOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9ucy5JSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlZhbGlkYXRpb25PcGVyYXRpb247CisKKworLyoqCisgKiBUaGlzIGlzIGEgd3JhcHBlciBmb3IgYW4gSVdvcmtzcGFjZVJ1bm5hYmxlIHRvIHRoZSBJUnVubmFibGVXaXRoUHJvZ3Jlc3MuIFRoaXMgY2xhc3MgbmVlZHMgdG8gYmUKKyAqIHVzZWQgd2hlbiBydW5uaW5nIHRoZSBvcGVyYXRpb24gZnJvbSBhIElSdW5uYWJsZUNvbnRleHQuCisgKiAKKyAqIEBzZWUgSVJ1bm5hYmxlQ29udGV4dAorICogQHNlZSBWYWxpZGF0aW9uVUlQbHVnaW4jZ2V0UnVubmFibGVXaXRoUHJvZ3Jlc3MgQ3JlYXRpb24gZGF0ZTogKDUvOC8yMDAxIDE6Mjg6NDUgUE0pCisgKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCisgKi8KK3B1YmxpYyBjbGFzcyBSdW5uYWJsZVdpdGhQcm9ncmVzc1dyYXBwZXIgaW1wbGVtZW50cyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgeworCXByaXZhdGUgSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MgaGVhZGxlc3NSdW5uYWJsZSA9IG51bGw7CisJcHJpdmF0ZSBJV29ya3NwYWNlUnVubmFibGUgd29ya3NwYWNlUnVubmFibGUgPSBudWxsOworCXByaXZhdGUgVmFsaWRhdGlvbk9wZXJhdGlvbiB2YWxpZGF0aW9uT3BlcmF0aW9uID0gbnVsbDsKKworCS8qKgorCSAqIEBkZXByZWNhdGVkIFdpbGwgYmUgcmVtb3ZlZCBpbiBNaWxlc3RvbmUgMy4gVXNlCisJICogICAgICAgICAgICAgUnVubmFibGVXaXRoUHJvZ3Jlc3NXcmFwcGVyKElXb3Jrc3BhY2VSdW5uYWJsZSkKKwkgKi8KKwlwdWJsaWMgUnVubmFibGVXaXRoUHJvZ3Jlc3NXcmFwcGVyKElIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzIGFIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzKSB7CisJCXNldEhlYWRsZXNzUnVubmFibGUoYUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MpOworCX0KKworCXB1YmxpYyBSdW5uYWJsZVdpdGhQcm9ncmVzc1dyYXBwZXIoSVdvcmtzcGFjZVJ1bm5hYmxlIGFIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzKSB7CisJCXNldFdvcmtzcGFjZVJ1bm5hYmxlKGFIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzKTsKKwl9CisKKwlwdWJsaWMgUnVubmFibGVXaXRoUHJvZ3Jlc3NXcmFwcGVyKFZhbGlkYXRpb25PcGVyYXRpb24gb3ApIHsKKwkJc2V0VmFsaWRhdGlvbk9wZXJhdGlvbihvcCk7CisJfQorCisJLyoqCisJICogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGluIE1pbGVzdG9uZSAzLiBVc2UgZ2V0V29ya3NwYWNlUnVubmFibGUoKQorCSAqLworCXByb3RlY3RlZCBJSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcyBnZXRIZWFkbGVzc1J1bm5hYmxlKCkgeworCQlyZXR1cm4gaGVhZGxlc3NSdW5uYWJsZTsKKwl9CisKKwlwcm90ZWN0ZWQgSVdvcmtzcGFjZVJ1bm5hYmxlIGdldFdvcmtzcGFjZVJ1bm5hYmxlKCkgeworCQlyZXR1cm4gd29ya3NwYWNlUnVubmFibGU7CisJfQorCisJLyoqCisJICogQHNlZSBJUnVubmFibGVXaXRoUHJvZ3Jlc3MKKwkgKi8KKwlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworCQl0cnkgeworCQkJaWYgKGdldEhlYWRsZXNzUnVubmFibGUoKSAhPSBudWxsKSB7CisJCQkJZ2V0SGVhZGxlc3NSdW5uYWJsZSgpLnJ1bihtb25pdG9yKTsKKwkJCX0gZWxzZSB7CisJCQkJSVdvcmtzcGFjZVJ1bm5hYmxlIHJ1bm5hYmxlID0gKGdldFdvcmtzcGFjZVJ1bm5hYmxlKCkgPT0gbnVsbCkgPyB2YWxpZGF0aW9uT3BlcmF0aW9uIDogZ2V0V29ya3NwYWNlUnVubmFibGUoKTsKKwkJCQlpZiAocnVubmFibGUgPT0gbnVsbCkgeworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4ocnVubmFibGUsIG1vbml0b3IpOworCQkJfQorCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4YykgeworCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZXhjKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEBkZXByZWNhdGVkIFdpbGwgYmUgcmVtb3ZlZCBpbiBNaWxlc3RvbmUgMy4gVXNlIHNldFdvcmtzcGFjZVJ1bm5hYmxlKElXb3Jrc3BhY2VSdW5uYWJsZSkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRIZWFkbGVzc1J1bm5hYmxlKElIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzIG5ld0hlYWRsZXNzUnVubmFibGUpIHsKKwkJaGVhZGxlc3NSdW5uYWJsZSA9IG5ld0hlYWRsZXNzUnVubmFibGU7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0V29ya3NwYWNlUnVubmFibGUoSVdvcmtzcGFjZVJ1bm5hYmxlIG5ld1dvcmtzcGFjZVJ1bm5hYmxlKSB7CisJCXdvcmtzcGFjZVJ1bm5hYmxlID0gbmV3V29ya3NwYWNlUnVubmFibGU7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0VmFsaWRhdGlvbk9wZXJhdGlvbihWYWxpZGF0aW9uT3BlcmF0aW9uIG9wKSB7CisJCXZhbGlkYXRpb25PcGVyYXRpb24gPSBvcDsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvcGx1Z2luL1ZhbGlkYXRpb25VSVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL3BsdWdpbi9WYWxpZGF0aW9uVUlQbHVnaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjA0OTZiCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3VpL3BsdWdpbi9WYWxpZGF0aW9uVUlQbHVnaW4uamF2YQpAQCAtMCwwICsxLDE3MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnVpLnBsdWdpbjsKKworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5XVFBVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlZhbGlkYXRpb25PcGVyYXRpb247CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKKworCisKK3B1YmxpYyBjbGFzcyBWYWxpZGF0aW9uVUlQbHVnaW4gZXh0ZW5kcyBXVFBVSVBsdWdpbiB7CisJcHJpdmF0ZSBzdGF0aWMgVmFsaWRhdGlvblVJUGx1Z2luIF9wbHVnaW4gPSBudWxsOworCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9QUk9QX0ZJTEVfTkFNRSA9ICJ2YWxpZGF0ZV91aSI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1BMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aSI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIElDT05fRElSUyA9IG5ldyBTdHJpbmdbXXsiaWNvbnMifTsgLy8kTk9OLU5MUy0xJAorCisJcHVibGljIFZhbGlkYXRpb25VSVBsdWdpbigpIHsKKwkJc3VwZXIoKTsKKwkJaWYgKF9wbHVnaW4gPT0gbnVsbCkgeworCQkJX3BsdWdpbiA9IHRoaXM7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRCdW5kbGVOYW1lKCkgeworCQlyZXR1cm4gVkFMSURBVElPTl9QUk9QX0ZJTEVfTkFNRTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFZhbGlkYXRpb25VSVBsdWdpbiBnZXRQbHVnaW4oKSB7CisJCXJldHVybiBfcGx1Z2luOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHRyYW5zbGF0ZWQgU3RyaW5nIGZvdW5kIHdpdGggdGhlIGdpdmVuIGtleS4KKwkgKiAKKwkgKiBAcGFyYW0ga2V5CisJICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCisJICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgeworCQl0cnkgeworCQkJcmV0dXJuIFBsYXRmb3JtLmdldFJlc291cmNlU3RyaW5nKFBsYXRmb3JtLmdldEJ1bmRsZShWQUxJREFUSU9OX1BMVUdJTl9JRCksIGtleSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlWYWxpZGF0aW9uVUlQbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOworCQkJcmV0dXJuIGtleTsKKwkJfQorCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgd2hlbmV2ZXIgeW91IG5lZWQgdG8gcnVuIG9uZSBvZiBvdXIgaGVhZGxlc3Mgb3BlcmF0aW9ucyBpbiB0aGUKKwkgKiBVSS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBnZXRSdW5uYWJsZVdpdGhQcm9ncmVzcyhJV29ya3NwYWNlUnVubmFibGUgYVdvcmtzcGFjZVJ1bm5hYmxlKSB7CisJCXJldHVybiBuZXcgUnVubmFibGVXaXRoUHJvZ3Jlc3NXcmFwcGVyKGFXb3Jrc3BhY2VSdW5uYWJsZSk7CisJfQorCisvLwlwdWJsaWMgc3RhdGljIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBnZXRSdW5uYWJsZVdpdGhQcm9ncmVzcyhJSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcyBhSGVhZGxlc3NSdW5uYWJsZVdpdGhQcm9ncmVzcykgeworLy8JCXJldHVybiBuZXcgUnVubmFibGVXaXRoUHJvZ3Jlc3NXcmFwcGVyKGFIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzKTsKKy8vCX0KKworCS8vIE5lZWQgYSB0aGlyZCwgVmFsaWRhdGlvbk9wZXJhdGlvbiB2ZXJzaW9uIG9mIHRoaXMgbWV0aG9kLCBiZWNhdXNlIFZhbGlkYXRpb25PcGVyYXRpb24KKwkvLyBpcyBib3RoIGFuIElXb3Jrc3BhY2VSdW5uYWJsZSBhbmQgYW4gSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3MuIFRoaXMgbWV0aG9kIHdpbGwKKwkvLyBleGlzdCBvbmx5IHdoaWxlIElIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzIGV4aXN0cy4KKwlwdWJsaWMgc3RhdGljIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBnZXRSdW5uYWJsZVdpdGhQcm9ncmVzcyhWYWxpZGF0aW9uT3BlcmF0aW9uIG9wKSB7CisJCXJldHVybiBuZXcgUnVubmFibGVXaXRoUHJvZ3Jlc3NXcmFwcGVyKG9wKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zdGFydChjb250ZXh0KTsKKwkJLy8Jb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5WYWxpZGF0b3JNYW5hZ2VyLnNldFJlc291cmNlVXRpbENsYXNzKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMudWkuVUlSZXNvdXJjZVV0aWwuY2xhc3MpOworCX0KKwkKKwkvKioKKwkgKiBHZXQgYSAuZ2lmIGZyb20gdGhlIGltYWdlIHJlZ2lzdHJ5LgorCSAqLworCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcga2V5KSB7CisJCUltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeSA9IGdldEltYWdlUmVnaXN0cnkoKTsKKwkJSW1hZ2UgaW1hZ2UgPSBpbWFnZVJlZ2lzdHJ5LmdldChrZXkpOworCQlpZiAoaW1hZ2UgPT0gbnVsbCB8fCBpbWFnZS5pc0Rpc3Bvc2VkKCkpIHsKKwkJCUltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKGtleSk7CisJCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7CisJCQkJaW1hZ2UgPSBkZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7CisJCQkJaW1hZ2VSZWdpc3RyeS5wdXQoa2V5LCBpbWFnZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGltYWdlOworCX0KKwkKKwkvKioKKwkgKiBUaGlzIGdldHMgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlci4KKwkgKi8KKwlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcga2V5KSB7CisJCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBudWxsOworCQlVUkwgZ2lmSW1hZ2VVUkwgPSBnZXRJbWFnZVVSTChrZXkpOworCQlpZiAoZ2lmSW1hZ2VVUkwgIT0gbnVsbCkKKwkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKGdpZkltYWdlVVJMKTsKKwkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKKwl9CisJCisJLyoqCisJICogQHBhcmFtIGtleQorCSAqIEByZXR1cm4KKwkgKi8KKwlwcml2YXRlIFVSTCBnZXRJbWFnZVVSTChTdHJpbmcga2V5KSB7CisJCXJldHVybiBWYWxpZGF0aW9uVUlQbHVnaW4uZ2V0SW1hZ2VVUkwoa2V5LCBnZXRCdW5kbGUoKSk7CisJfQorCQorCS8qKgorCSAqIFRoaXMgZ2V0cyBhIC5naWYgZnJvbSB0aGUgaWNvbnMgZm9sZGVyLgorCSAqLworCXB1YmxpYyBzdGF0aWMgVVJMIGdldEltYWdlVVJMKFN0cmluZyBrZXksIEJ1bmRsZSBidW5kbGUpIHsKKwkJU3RyaW5nIGdpZiA9ICIvIiArIGtleSArICIuZ2lmIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCUlQYXRoIHBhdGggPSBudWxsOworCQlmb3IgKGludCBpID0gMDsgaSA8IElDT05fRElSUy5sZW5ndGg7IGkrKykgeworCQkJcGF0aCA9IG5ldyBQYXRoKElDT05fRElSU1tpXSkuYXBwZW5kKGdpZik7CisJCQlpZiAoUGxhdGZvcm0uZmluZChidW5kbGUscGF0aCkgPT0gbnVsbCkKKwkJCQljb250aW51ZTsKKwkJCXRyeSB7CisJCQkJcmV0dXJuIG5ldyBVUkwoIGJ1bmRsZS5nZXRFbnRyeSgiLyIpLCBwYXRoLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkIAorCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJCisJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBlKXsKKwkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZSk7CisJCWdldExvZygpLmxvZyhzdGF0dXMpOworCX0KKwkKKwkvKiogCisJICogV3JpdGUgYSBtZXNzYWdlIGludG8gdGhlIGxvZy4gCisJICogCisJICogV2UgYXJlIGluIHRoZSB0cmFuc2l0aW9uIG9mIG1vdmluZyB0byBhIG5ldyBhcHByb2FjaCBmb3IgbG9jYWxpemVkIG1lc3NhZ2VzLiBUaGlzIGlzIHRoZSBuZXcgCisJICogYXBwcm9hY2ggZm9yIGV4Y2VwdGlvbnMuCisJICogCisJICogQHBhcmFtIHNldmVyaXR5IG1lc3NhZ2Ugc2V2ZXJpdHksIHNlZSBJU3RhdXMKKwkgKiBAcGFyYW0gbWVzc2FnZSBhIGxvY2FsaXplZCBtZXNzYWdlCisJICovCisJcHVibGljIHZvaWQgbG9nTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlKXsKKwkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgbWVzc2FnZSk7CisJCWdldExvZygpLmxvZyhzdGF0dXMpOworCQkKKwl9CQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi91aS9pbnRlcm5hbC9BZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdWkvaW50ZXJuYWwvQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTBjNmZkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdWkvaW50ZXJuYWwvQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLmludGVybmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvck11dGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuRmlsdGVyR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuRmlsdGVyUnVsZTsKKworcHVibGljIGNsYXNzIEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5IHsKKworCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBDbGFzcyBhZGFwdGVyVHlwZSkgeworCQlpZiAoYWRhcHRlclR5cGUgPT0gSVdvcmtiZW5jaEFkYXB0ZXIuY2xhc3MgJiYgYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgVmFsaWRhdG9yLlYyKXJldHVybiBfdmFsQWRhcHRvcjsKKwkJaWYgKGFkYXB0ZXJUeXBlID09IElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzICYmIGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIEZpbHRlckdyb3VwKXJldHVybiBfZmdBZGFwdG9yOworCQlpZiAoYWRhcHRlclR5cGUgPT0gSVdvcmtiZW5jaEFkYXB0ZXIuY2xhc3MgJiYgYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgRmlsdGVyUnVsZSlyZXR1cm4gX3J1bGVBZGFwdG9yOworCQlpZiAoYWRhcHRlclR5cGUgPT0gSVdvcmtiZW5jaEFkYXB0ZXIuY2xhc3MgJiYgYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgVmFsaWRhdG9yTXV0YWJsZSlyZXR1cm4gX3ZhbE11dGFibGVBZGFwdG9yOworCisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgeworCQlyZXR1cm4gbmV3IENsYXNzW10geyBJV29ya2JlbmNoQWRhcHRlci5jbGFzcyB9OworCX0KKworCXByaXZhdGUgSVdvcmtiZW5jaEFkYXB0ZXIgX3ZhbEFkYXB0b3IgPSBuZXcgSVdvcmtiZW5jaEFkYXB0ZXIoKSB7CisKKwkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvKSB7CisJCQlyZXR1cm4gKChWYWxpZGF0b3IuVjIpIG8pLmdldEdyb3VwcygpOworCQl9CisKKwkJcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoT2JqZWN0IG8pIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRMYWJlbChPYmplY3QgbykgeworCQkJcmV0dXJuICgoVmFsaWRhdG9yLlYyKSBvKS5nZXROYW1lKCk7CisJCX0KKworCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgbykgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCX07CisJcHJpdmF0ZSBJV29ya2JlbmNoQWRhcHRlciBfdmFsTXV0YWJsZUFkYXB0b3IgPSBuZXcgSVdvcmtiZW5jaEFkYXB0ZXIoKSB7CisKKwkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvKSB7CisJCQlyZXR1cm4gKChWYWxpZGF0b3JNdXRhYmxlKSBvKS5nZXRHcm91cHMoKTsKKwkJfQorCisJCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKE9iamVjdCBvKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoT2JqZWN0IG8pIHsKKwkJCXJldHVybiAoKFZhbGlkYXRvck11dGFibGUpIG8pLmdldE5hbWUoKTsKKwkJfQorCisJCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJfTsKKworCXByaXZhdGUgSVdvcmtiZW5jaEFkYXB0ZXIgX2ZnQWRhcHRvciA9IG5ldyBJV29ya2JlbmNoQWRhcHRlcigpIHsKKworCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8pIHsKKwkJCXJldHVybiAoKEZpbHRlckdyb3VwKSBvKS5nZXRSdWxlcygpOworCQl9CisKKwkJcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoT2JqZWN0IG8pIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRMYWJlbChPYmplY3QgbykgeworCQkJRmlsdGVyR3JvdXAgZmcgPSAoRmlsdGVyR3JvdXApIG87CisJCQlyZXR1cm4gZmcuZ2V0RGlzcGxheWFibGVUeXBlKCk7CisJCX0KKworCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgbykgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9OworCisJcHJpdmF0ZSBJV29ya2JlbmNoQWRhcHRlciBfcnVsZUFkYXB0b3IgPSBuZXcgSVdvcmtiZW5jaEFkYXB0ZXIoKSB7CisKKwkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvKSB7CisJCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKKwkJfQorCisJCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKE9iamVjdCBvKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoT2JqZWN0IG8pIHsKKwkJCUZpbHRlclJ1bGUgcnVsZSA9IChGaWx0ZXJSdWxlKSBvOworCQkJcmV0dXJuIHJ1bGUuZ2V0TmFtZSgpOworCQl9CisKKwkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG8pIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwl9OworCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi91aS9pbnRlcm5hbC9IZWxwQ29udGV4dElkcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdWkvaW50ZXJuYWwvSGVscENvbnRleHRJZHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWY3YWViCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdWkvaW50ZXJuYWwvSGVscENvbnRleHRJZHMuamF2YQpAQCAtMCwwICsxLDE4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLmludGVybmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWkucGx1Z2luLlZhbGlkYXRpb25VSVBsdWdpbjsKKworcHVibGljIGludGVyZmFjZSBIZWxwQ29udGV4dElkcyB7CisJU3RyaW5nIFByZWZlcmVuY2VQYWdlID0gVmFsaWRhdGlvblVJUGx1Z2luLlZBTElEQVRJT05fUExVR0lOX0lEICsgIi5qdmdwMDAwMCI7IC8vJE5PTi1OTFMtMSQKKwkKKwlTdHJpbmcgRmlsdGVyUnVsZSA9IFZhbGlkYXRpb25VSVBsdWdpbi5WQUxJREFUSU9OX1BMVUdJTl9JRCArICIuanZncDAxMDAiOyAgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBGUkZpbGVFeHQgPSBWYWxpZGF0aW9uVUlQbHVnaW4uVkFMSURBVElPTl9QTFVHSU5fSUQgKyAiLmp2Z3AwMTAxIjsgIC8vJE5PTi1OTFMtMSQKKwlTdHJpbmcgRlJOYW1lID0gVmFsaWRhdGlvblVJUGx1Z2luLlZBTElEQVRJT05fUExVR0lOX0lEICsgIi5qdmdwMDEwMiI7ICAvLyROT04tTkxTLTEkCisJU3RyaW5nIEZSUHJvamVjdE5hdHVyZSA9IFZhbGlkYXRpb25VSVBsdWdpbi5WQUxJREFUSU9OX1BMVUdJTl9JRCArICIuanZncDAxMDMiOyAgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBGUkZhY2V0ID0gVmFsaWRhdGlvblVJUGx1Z2luLlZBTElEQVRJT05fUExVR0lOX0lEICsgIi5qdmdwMDEwNCI7ICAvLyROT04tTkxTLTEkCisJU3RyaW5nIEZSQ29udGVudFR5cGUgPSBWYWxpZGF0aW9uVUlQbHVnaW4uVkFMSURBVElPTl9QTFVHSU5fSUQgKyAiLmp2Z3AwMTA1IjsgIC8vJE5PTi1OTFMtMSQKKwkKKwlTdHJpbmcgUHJvamVjdFBhZ2UgPSBWYWxpZGF0aW9uVUlQbHVnaW4uVkFMSURBVElPTl9QTFVHSU5fSUQgKyAiLmp2cHAwMDAwIjsgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBQcm9qZWN0RmlsdGVyUnVsZSA9IFZhbGlkYXRpb25VSVBsdWdpbi5WQUxJREFUSU9OX1BMVUdJTl9JRCArICIuanZwcDAxMDAiOyAgLy8kTk9OLU5MUy0xJAorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi91aS9pbnRlcm5hbC9JbWFnZU5hbWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi91aS9pbnRlcm5hbC9JbWFnZU5hbWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg3MzE3MAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3VpL2ludGVybmFsL0ltYWdlTmFtZXMuamF2YQpAQCAtMCwwICsxLDI0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkuaW50ZXJuYWw7CisKKy8qKgorICogTmFtZXMgb2YgdGhlIGltYWdlcy4KKyAqIEBhdXRob3Iga2FyYXNpdWsKKyAqCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSW1hZ2VOYW1lcyB7CisJCisJU3RyaW5nIG9rVGFibGUgCQk9ICJva190YmwiOyAvLyROT04tTkxTLTEkCisJU3RyaW5nIGZhaWxUYWJsZSAJPSAiZmFpbF90YmwiOyAvLyROT04tTkxTLTEkCQorCVN0cmluZyBzZXR0aW5ncyAJPSAic2V0dGluZ3MiOyAvLyROT04tTkxTLTEkCisJU3RyaW5nIGRpc2FibGVkIAk9ICJfZGlzYWJsZWQiOyAvLyROT04tTkxTLTEkCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi91aS9pbnRlcm5hbC9NYW51YWxWYWxpZGF0aW9uUnVubmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi91aS9pbnRlcm5hbC9NYW51YWxWYWxpZGF0aW9uUnVubmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcwYmNjZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3VpL2ludGVybmFsL01hbnVhbFZhbGlkYXRpb25SdW5uZXIuamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLldvcmtzcGFjZUpvYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLk11bHRpUnVsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25SZXN1bHRTdW1tYXJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25SdW5uZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkuaW50ZXJuYWwuZGlhbG9nLlJlc3VsdHNEaWFsb2c7CisKKy8qKgorICogUnVuIGEgbWFudWFsIHZhbGlkYXRpb24uIAorICogQGF1dGhvciBrYXJhc2l1aworICoKKyAqLworcHVibGljIGNsYXNzIE1hbnVhbFZhbGlkYXRpb25SdW5uZXIgZXh0ZW5kcyBXb3Jrc3BhY2VKb2IgeworCQorCXByaXZhdGUgTWFwPElQcm9qZWN0LCBTZXQ8SVJlc291cmNlPj4gCV9wcm9qZWN0czsKKwlwcml2YXRlIFZhbFR5cGUgX3ZhbFR5cGU7CisJcHJpdmF0ZSBib29sZWFuCV9zaG93UmVzdWx0czsKKwkKKwkvKioKKwkgKiBWYWxpZGF0ZSB0aGUgc2VsZWN0ZWQgcHJvamVjdHMgYW5kL29yIHJlc291cmNlcy4KKwkgKiAKKwkgKiBAcGFyYW0gcHJvamVjdHMKKwkgKiAgICAgICAgICAgIFRoZSBzZWxlY3RlZCBwcm9qZWN0cy4gVGhlIGtleSBpcyBhbiBJUHJvamVjdCBhbmQgdGhlIHZhbHVlIGlzCisJICogICAgICAgICAgICB0aGUgU2V0IG9mIElSZXNvdXJjZXMgdGhhdCB3ZXJlIHNlbGVjdGVkLiBPZnRlbiB0aGlzIHdpbGwgYmUKKwkgKiAgICAgICAgICAgIGV2ZXJ5IHJlc291cmNlIGluIHRoZSBwcm9qZWN0LgorCSAqIAorCSAqIEBwYXJhbSBpc01hbnVhbAorCSAqICAgICAgICAgICAgSXMgdGhpcyBhIG1hbnVhbCB2YWxpZGF0aW9uPworCSAqIAorCSAqIEBwYXJhbSBpc0J1aWxkCisJICogICAgICAgICAgICBJcyB0aGlzIGEgYnVpbGQgYmFzZWQgdmFsaWRhdGlvbj8KKwkgKiAKKwkgKiBAcGFyYW0gc2hvd1Jlc3VsdHMKKwkgKiAgICAgICAgICAgIFdoZW4gdGhlIHZhbGlkYXRpb24gaXMgZmluaXNoZWQsIHNob3cgdGhlIHJlc3VsdHMgaW4gYSBkaWFsb2cgYm94LgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZShNYXA8SVByb2plY3QsIFNldDxJUmVzb3VyY2U+PiBwcm9qZWN0cywgVmFsVHlwZSB2YWxUeXBlLCBib29sZWFuIHNob3dSZXN1bHRzKXsKKwkJTWFudWFsVmFsaWRhdGlvblJ1bm5lciBtZSA9IG5ldyBNYW51YWxWYWxpZGF0aW9uUnVubmVyKHByb2plY3RzLCB2YWxUeXBlLCBzaG93UmVzdWx0cyk7CisJCQorCQkvL1RPRE8gb3B0aW1pemUgdGhpcywgSSBkb24ndCBsaWtlIHRoZSBpZGVhIG9mIHZhbGlkYXRvcnMgaGF2aW5nIHRvIGxvY2sgdGhlIGVudGlyZSBwcm9qZWN0CisJCVNldDxJUHJvamVjdD4ga2V5cyA9IHByb2plY3RzLmtleVNldCgpOworCQlJUHJvamVjdFtdIHByb2plY3RBcnJheSA9IG5ldyBJUHJvamVjdFtrZXlzLnNpemUoKV07CisJCWtleXMudG9BcnJheShwcm9qZWN0QXJyYXkpOworCQlpZiAocHJvamVjdEFycmF5Lmxlbmd0aCA9PSAxKW1lLnNldFJ1bGUocHJvamVjdEFycmF5WzBdKTsKKwkJZWxzZSB7CisJCQltZS5zZXRSdWxlKE11bHRpUnVsZS5jb21iaW5lKHByb2plY3RBcnJheSkpOworCQl9CisJCW1lLnNjaGVkdWxlKCk7CisJfQorCQorCXByaXZhdGUgTWFudWFsVmFsaWRhdGlvblJ1bm5lcihNYXA8SVByb2plY3QsIFNldDxJUmVzb3VyY2U+PiBwcm9qZWN0cywgVmFsVHlwZSB2YWxUeXBlLCBib29sZWFuIHNob3dSZXN1bHRzKXsKKwkJc3VwZXIoVmFsVUlNZXNzYWdlcy5WYWxpZGF0aW9uKTsKKwkJX3Byb2plY3RzID0gcHJvamVjdHM7CisJCV92YWxUeXBlID0gdmFsVHlwZTsKKwkJX3Nob3dSZXN1bHRzID0gc2hvd1Jlc3VsdHM7CisJfQorCisJcHVibGljIElTdGF0dXMgcnVuSW5Xb3Jrc3BhY2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCQorCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCWZpbmFsIFZhbE9wZXJhdGlvbiB2byA9IFZhbGlkYXRpb25SdW5uZXIudmFsaWRhdGUoX3Byb2plY3RzLCBfdmFsVHlwZSwgbW9uaXRvciwgZmFsc2UpOworCQlmaW5hbCBsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OworCQlpbnQgcmVzb3VyY2VDb3VudCA9IDA7CisJCWZvciAoU2V0IHMgOiBfcHJvamVjdHMudmFsdWVzKCkpcmVzb3VyY2VDb3VudCArPSBzLnNpemUoKTsKKwkJZmluYWwgaW50IGZpbmFsUmVzb3VyY2VDb3VudCA9IHJlc291cmNlQ291bnQ7CisJCWlmICh2by5pc0NhbmNlbGVkKCkpcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOworCQkKKwkJaWYgKF9zaG93UmVzdWx0cyl7CisJCQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKKwkJCVJ1bm5hYmxlIHJ1biA9IG5ldyBSdW5uYWJsZSgpeworCisJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQlWYWxpZGF0aW9uUmVzdWx0U3VtbWFyeSB2ciA9IHZvLmdldFJlc3VsdCgpOworCQkJCQlSZXN1bHRzRGlhbG9nIHJkID0gbmV3IFJlc3VsdHNEaWFsb2cobnVsbCwgdnIsIHRpbWUsIGZpbmFsUmVzb3VyY2VDb3VudCk7CisJCQkJCXJkLm9wZW4oKTsKKwkJCQl9CisJCQkJCisJCQl9OworCQkJZGlzcGxheS5hc3luY0V4ZWMocnVuKTsJCQkKKwkJfQorCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi91aS9pbnRlcm5hbC9WYWxVSU1lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi91aS9pbnRlcm5hbC9WYWxVSU1lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlkYTliOQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3VpL2ludGVybmFsL1ZhbFVJTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDExOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLmludGVybmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKKworcHVibGljIGNsYXNzIFZhbFVJTWVzc2FnZXMgZXh0ZW5kcyBOTFMgeworCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS5pbnRlcm5hbC5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKKwkgICAKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBRERfVkFMSURBVElPTl9CVUlMREVSOworCQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBSRUZfQlVUVE9OX09WRVJSSURFOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBSRUZfVkFMTElTVF9USVRMRTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQUkVGX0JVVFRPTl9FTkFCTEVBTEw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUFJFRl9CVVRUT05fRElTQUJMRUFMTDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQUkVGX01OVV9NQU5VQUw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUFJFRl9NTlVfQlVJTEQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUFJFRl9NTlVfU0VUVElOR1M7CisJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlnV3NTZXR0aW5nczsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBEb05vdFNob3dSZXN1bHRzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlbGVnYXRlc0RpYWxvZ1RpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlbGVnYXRlc0NvbWJvTGFiZWw7CisJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgRXJyb3JzV2FybmluZ3M7CisJCQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZCRl9FWENfSU5URVJOQUxfVElUTEU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVkJGX0VYQ19JTlRFUk5BTF9QQUdFOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZCRl9FWENfSU5WQUxJRF9SRUdJU1RFUjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBESVNBQkxFX1ZBTElEQVRJT047CisJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgTUFOVUFMOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJVSUxEOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFVFRJTkdTOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRPUjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBWQkZfVUlfTk9fVkFMSURBVE9SU19JTlNUQUxMRUQ7CisJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2F2ZUZpbGVzRGlhbG9nX3NhdmluZzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTYXZlRmlsZXNEaWFsb2dfYWx3YXlzX3NhdmU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2F2ZUZpbGVzRGlhbG9nX3NhdmVfYWxsX3Jlc291cmNlczsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTYXZlRmlsZXNEaWFsb2dfbXVzdF9zYXZlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZQYWdlX2Fsd2F5c19zYXZlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZQYWdlQ29uZmlybURpYWxvZzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0T3ZlcnJpZGVzTm90QWxsb3dlZDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBSdW5WYWxpZGF0aW9uRGlhbG9nVGl0bGU7CisJCisJLyogVmFsaWRhdG9yIEZpbHRlcnMgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBmZFRpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZkTm9GaWx0ZXJzOworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgRXJyQ29uZmlnOworCQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckhlbHA7CisJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQnV0dG9uQWRkR3JvdXBJbmNsdWRlOwkKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBCdXR0b25BZGRHcm91cEV4Y2x1ZGU7CQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1dHRvbkFkZFJ1bGU7CQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1dHRvblJlbW92ZTsKKwkKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBMYWJlbEV4dGVuc2lvbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBMYWJlbEZpbGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTGFiZWxQcm9qZWN0czsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBMYWJlbEZhY2V0czsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBMYWJlbENvbnRlbnRUeXBlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExhYmVsRW5hYmxlUHJvamVjdFNwZWNpZmljOworCQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NFeHRlbnNpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY0ZpbGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY1Byb2plY3RzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NGYWNldHM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY0NvbnRlbnRUeXBlOworCQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbGlkYXRpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVmFsaWRhdGlvblN0YXR1czsKKwkKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFcnJTdW1tYXJ5OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbGlkYXRpb25TdWNjZXNzZnVsOworCQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZyV2l6YXJkOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZyU2VsZWN0RmlsdGVyVHlwZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBGckZpbGVFeHRlbnNpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRnJGaWxlRXh0ZW5zaW9uTGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRnJDYXNlU2Vuc2l0aXZlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZyRXhhY3RNYXRjaDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBGckZvbGRlck9yRmlsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBGckZvbGRlck9yRmlsZUxhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZyQnJvd3NlRmlsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBGckZpbGVGaWx0ZXI7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRnJCcm93c2VGb2xkZXI7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRnJGb2xkZXJGaWx0ZXI7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRnJQcm9qZWN0TmF0dXJlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZyUHJvamVjdE5hdHVyZUxhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZyU2ltcGxlRmlsZU5hbWU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRnJGYWNpdDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBGckZhY2l0TGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRnJDb250ZW50VHlwZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBGckNvbnRlbnRUeXBlTGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRnJNc2dTZXY7CisJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgUmVidWlsZFRpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlYnVpbGRNc2c7CisJCisJCQorCXN0YXRpYyB7CisJCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFZhbFVJTWVzc2FnZXMuY2xhc3MpOworCSAgfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi91aS9pbnRlcm5hbC9kaWFsb2cvRmlsdGVyRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi91aS9pbnRlcm5hbC9kaWFsb2cvRmlsdGVyRGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg2ZWFhZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3VpL2ludGVybmFsL2RpYWxvZy9GaWx0ZXJEaWFsb2cuamF2YQpAQCAtMCwwICsxLDQ2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLmludGVybmFsLmRpYWxvZzsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LlJvd0xheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuQmFzZVdvcmtiZW5jaENvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLk1lc3NhZ2VTZXZlcml0eVNldHRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTXV0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5kZWxlZ2F0ZXMuVmFsaWRhdG9yRGVsZWdhdGVEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmRlbGVnYXRlcy5WYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbC5GaWx0ZXJHcm91cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbC5GaWx0ZXJSdWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLlZhbGlkYXRvckhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS5pbnRlcm5hbC5BZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS5pbnRlcm5hbC5WYWxVSU1lc3NhZ2VzOworCisvKioKKyAqIERpc3BsYXkgYSBmaWx0ZXIgZGlhbG9nIGZvciBhIHBhcnRpY3VsYXIgVmFsaWRhdG9yLCB0aGF0IGlzIGEgbGlzdCBvZiBhbGwgdGhlIGZpbHRlcnMgdGhhdCBhcmUgYWN0aXZlIGZvcgorICogdGhlIHZhbGlkYXRvci4KKyAqIAorICogQGF1dGhvciBrYXJhc2l1aworICoKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEZpbHRlckRpYWxvZyBleHRlbmRzIERpYWxvZyB7CisJCisJLyoqIAorCSAqIElmIHdlIGFyZSBkb2luZyBwcm9qZWN0IGxldmVsIGZpbHRlcnMgdGhpcyB3aWxsIHBvaW50IHRvIHRoZSBwcm9qZWN0LiBUaGlzIGlzIG51bGwgaWYgd2UgYXJlIGRvaW5nCisJICogd29ya3NwYWNlIGxldmVsIGZpbHRlcnMuIAorCSAqLworCXByaXZhdGUgSVByb2plY3QJX3Byb2plY3Q7CisJCisJcHJpdmF0ZSBWYWxpZGF0b3JNdXRhYmxlIAlfdmFsaWRhdG9yOworCQorCXByaXZhdGUgVHJlZVZpZXdlcgkJX3RyZWU7CisJcHJpdmF0ZSBDb21ibwkJCV9kZWxlZ2F0aW5nOworCXByaXZhdGUgSUFkYXB0ZXJGYWN0b3J5IF9hZGFwdG9yRmFjdG9yeSA9IG5ldyBBZGFwdGVyRmFjdG9yeSgpOworCQorCXByaXZhdGUgQnV0dG9uCQlfYWRkR3JvdXBJbmNsdWRlOworCXByaXZhdGUgQnV0dG9uCQlfYWRkR3JvdXBFeGNsdWRlOworCXByaXZhdGUgQnV0dG9uCQlfYWRkUnVsZTsKKwlwcml2YXRlIEJ1dHRvbgkJX3JlbW92ZTsKKwlwcml2YXRlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIJX25vZGVDaGFuZ2VkTGlzdGVuZXI7CisJCisJLyoqIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZ3JvdXAuIElmIGEgcnVsZSBpcyBzZWxlY3RlZCBpbnN0ZWFkLCB0aGVuIHRoaXMgd2lsbCBiZSBudWxsLiAqLworCXByaXZhdGUgRmlsdGVyR3JvdXAJX3NlbGVjdGVkR3JvdXA7CisJCisJLyoqIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcnVsZS4gSWYgYSBncm91cCBpcyBzZWxlY3RlZCBpbnN0ZWFkLCB0aGVuIHRoaXMgd2lsbCBiZSBudWxsLiAqLworCXByaXZhdGUgRmlsdGVyUnVsZQlfc2VsZWN0ZWRSdWxlOworCQorCXByaXZhdGUgQ29tYm9bXQkJX21lc3NhZ2VTZXY7CisJCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gX21lc3NhZ2VzID0gbmV3IFN0cmluZ1tdeworCQlWYWxNZXNzYWdlcy5TZXZFcnJvciwgVmFsTWVzc2FnZXMuU2V2V2FybmluZywgVmFsTWVzc2FnZXMuU2V2SWdub3JlfTsKKwkKKwlwcml2YXRlIFNoZWxsCQlfc2hlbGw7CisJCisJLyoqCisJICogQ3JlYXRlIGEgZGlhbG9nIHRoYXQga25vd3MgaG93IHRvIGNoYW5nZSBhIHZhbGlkYXRvcidzIGZpbHRlcnMuCisJICogCisJICogQHBhcmFtIHNoZWxsCisJICogCisJICogQHBhcmFtIHZhbGlkYXRvciB0aGUgdmFsaWRhdG9yIHRoYXQgaXMgYmVpbmcgdXBkYXRlZC4KKwkgKiAKKwkgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdCB0aGF0IHRoZSBmaWx0ZXJzIGFyZSBiZWluZyBhZGRlZCB0by4gSWYgdGhlc2UgYXJlIHdvcmtzcGFjZQorCSAqIGxldmVsIGZpbHRlcnMsIHRoZW4gdGhpcyBtdXN0IGJlIG51bGwuIAorCSAqLworCXB1YmxpYyBGaWx0ZXJEaWFsb2coU2hlbGwgc2hlbGwsIFZhbGlkYXRvck11dGFibGUgdmFsaWRhdG9yLCBJUHJvamVjdCBwcm9qZWN0KXsKKwkJc3VwZXIoc2hlbGwpOworCQlfc2hlbGwgPSBzaGVsbDsKKwkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuQ0xPU0V8U1dULk1JTnxTV1QuTUFYfFNXVC5SRVNJWkUpOworCQlfdmFsaWRhdG9yID0gdmFsaWRhdG9yOworCQlfcHJvamVjdCA9IHByb2plY3Q7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIG5ld1NoZWxsKSB7CisJCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKKwkJbmV3U2hlbGwuc2V0VGV4dChOTFMuYmluZChWYWxVSU1lc3NhZ2VzLmZkVGl0bGUsIF92YWxpZGF0b3IuZ2V0TmFtZSgpKSk7CisJfQorCQorCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgeworCQlDb21wb3NpdGUgYyA9IChDb21wb3NpdGUpc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOworCQljLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOworCQlpZiAoIV92YWxpZGF0b3IuaXNWMlZhbGlkYXRvcigpKXsKKwkJCW5ldyBMYWJlbChjLCBTV1QuTk9ORSkuc2V0VGV4dChWYWxVSU1lc3NhZ2VzLmZkTm9GaWx0ZXJzKTsKKwkJfQorCQllbHNlIHsKKwkJCUxhYmVsIGJsdXJiID0gbmV3IExhYmVsKGMsIFNXVC5MRUZUIHwgU1dULldSQVApOworCQkJYmx1cmIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5UT1AsIHRydWUsIGZhbHNlLCAyLCAxKSk7CisJCQlibHVyYi5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuRmlsdGVySGVscCk7CisJCQkKKwkJCV90cmVlID0gbmV3IFRyZWVWaWV3ZXIoYywgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOworCQkJX3RyZWUuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOworCQkJUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5yZWdpc3RlckFkYXB0ZXJzKF9hZGFwdG9yRmFjdG9yeSwgVmFsaWRhdG9yTXV0YWJsZS5jbGFzcyk7CisJCQlQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLnJlZ2lzdGVyQWRhcHRlcnMoX2FkYXB0b3JGYWN0b3J5LCBGaWx0ZXJHcm91cC5jbGFzcyk7CisJCQlQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLnJlZ2lzdGVyQWRhcHRlcnMoX2FkYXB0b3JGYWN0b3J5LCBGaWx0ZXJSdWxlLmNsYXNzKTsKKwkJCV90cmVlLnNldENvbnRlbnRQcm92aWRlcihuZXcgQmFzZVdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpKTsKKwkJCV90cmVlLnNldExhYmVsUHJvdmlkZXIobmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSk7CisJCQlfdHJlZS5zZXRJbnB1dChfdmFsaWRhdG9yKTsKKwkJCV90cmVlLmV4cGFuZEFsbCgpOworCQkJCisJCQlhZGRCdXR0b25zKGMpOworCQkJCisJCQlTdHJpbmcgZGVsZWdhdGluZ0lkID0gX3ZhbGlkYXRvci5nZXREZWxlZ2F0aW5nSWQoKTsKKwkJCWlmIChkZWxlZ2F0aW5nSWQgIT0gbnVsbCl7CisJCQkJYWRkRGVsZWdhdG9yU2VsZWN0aW9uKGMpOworCQkJfQorCQkJCQorCQkJX25vZGVDaGFuZ2VkTGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpeworCisJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKwkJCQkJX3NlbGVjdGVkR3JvdXAgPSBudWxsOworCQkJCQlfc2VsZWN0ZWRSdWxlID0gbnVsbDsKKwkJCQkJaWYgKGV2ZW50LmdldFNlbGVjdGlvbigpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24peworCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKWV2ZW50LmdldFNlbGVjdGlvbigpOworCQkJCQkJaWYgKHNlbC5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIEZpbHRlckdyb3VwKXsKKwkJCQkJCQlfc2VsZWN0ZWRHcm91cCA9IChGaWx0ZXJHcm91cClzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7CisJCQkJCQl9CisJCQkJCQllbHNlIGlmIChzZWwuZ2V0Rmlyc3RFbGVtZW50KCkgaW5zdGFuY2VvZiBGaWx0ZXJSdWxlKXsKKwkJCQkJCQlfc2VsZWN0ZWRSdWxlID0gKEZpbHRlclJ1bGUpc2VsLmdldEZpcnN0RWxlbWVudCgpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCXVwZGF0ZUJ1dHRvbnMoKTsKKwkJCQl9CisJCQkJCisJCQl9OworCQkJCisJCQlfdHJlZS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoX25vZGVDaGFuZ2VkTGlzdGVuZXIpOworCQkJCisJCQlhZGRNZXNzYWdlTWFwcGluZ3MoYyk7CisJCX0KKwkJcmV0dXJuIGM7CisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZEJ1dHRvbnMoQ29tcG9zaXRlIGMpIHsKKwkJQ29tcG9zaXRlIGJ1dHRvbnMgPSBuZXcgQ29tcG9zaXRlKGMsIFNXVC5UT1ApOworCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShTV1QuTEVGVCwgU1dULlRPUCwgZmFsc2UsIGZhbHNlLCAxLCAxKTsKKwkJYnV0dG9ucy5zZXRMYXlvdXREYXRhKGdkKTsKKwkJYnV0dG9ucy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSkpOworCQlfYWRkR3JvdXBJbmNsdWRlID0gbmV3IEJ1dHRvbihidXR0b25zLCBTV1QuUFVTSCB8IFNXVC5GSUxMIHwgU1dULkNFTlRFUik7CisJCV9hZGRHcm91cEluY2x1ZGUuc2V0VGV4dChWYWxVSU1lc3NhZ2VzLkJ1dHRvbkFkZEdyb3VwSW5jbHVkZSk7CisJCV9hZGRHcm91cEluY2x1ZGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5UT1AsIHRydWUsIGZhbHNlLCAxLCAxKSk7CisJCQorCQlfYWRkR3JvdXBJbmNsdWRlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpeworCisJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCWFkZEdyb3VwKGZhbHNlKTsJCQkJCisJCQl9CisKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlhZGRHcm91cChmYWxzZSk7CQkJCQkJCisJCQl9CisJCQkKKwkJfSk7CisJCQkKKwkJX2FkZEdyb3VwRXhjbHVkZSA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlBVU0ggfCBTV1QuRklMTCB8IFNXVC5DRU5URVIpOworCQlfYWRkR3JvdXBFeGNsdWRlLnNldFRleHQoVmFsVUlNZXNzYWdlcy5CdXR0b25BZGRHcm91cEV4Y2x1ZGUpOworCQlfYWRkR3JvdXBFeGNsdWRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuVE9QLCB0cnVlLCBmYWxzZSwgMSwgMSkpOworCQkKKwkJX2FkZEdyb3VwRXhjbHVkZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKKworCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlhZGRHcm91cCh0cnVlKTsJCQkJCisJCQl9CisKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlhZGRHcm91cCh0cnVlKTsJCQkJCQkKKwkJCX0KKwkJCQorCQl9KTsKKworCQlfYWRkUnVsZSA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlBVU0ggfCBTV1QuRklMTCB8IFNXVC5DRU5URVIpOworCQlfYWRkUnVsZS5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuQnV0dG9uQWRkUnVsZSk7CisJCV9hZGRSdWxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuVE9QLCB0cnVlLCBmYWxzZSwgMSwgMSkpOworCQlfYWRkUnVsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKKworCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlkb0l0KCk7CisJCQl9CisKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlkb0l0KCk7CisJCQl9CisJCQkKKwkJCXByaXZhdGUgdm9pZCBkb0l0KCl7CisJCQkJTmV3RmlsdGVyUnVsZSBuZnIgPSBuZXcgTmV3RmlsdGVyUnVsZShfcHJvamVjdCk7CisJCQkJV2l6YXJkRGlhbG9nIHdkID0gbmV3IFdpemFyZERpYWxvZyhfc2hlbGwsIG5mcik7CisJCQkJd2Quc2V0QmxvY2tPbk9wZW4odHJ1ZSk7CisJCQkJaW50IHJjID0gd2Qub3BlbigpOworCQkJCWlmIChyYyA9PSBXaXphcmREaWFsb2cuQ0FOQ0VMKXJldHVybjsKKwkJCQkKKwkJCQlGaWx0ZXJSdWxlIHJ1bGUgPSBuZnIuZ2V0UnVsZSgpOworCQkJCWlmIChydWxlICE9IG51bGwpeworCQkJCQlGaWx0ZXJHcm91cCBuZXdHcm91cCA9IEZpbHRlckdyb3VwLmFkZFJ1bGUoX3NlbGVjdGVkR3JvdXAsIHJ1bGUpOworCQkJCQlfdmFsaWRhdG9yLnJlcGxhY2VGaWx0ZXJHcm91cChfc2VsZWN0ZWRHcm91cCwgbmV3R3JvdXApOworCQkJCQlfc2VsZWN0ZWRHcm91cCA9IG5ld0dyb3VwOworCQkJCQlyZWZyZXNoKCk7CisJCQkJfQorCQkJfQorCQkJCisJCX0pOworCisJCV9yZW1vdmUgPSBuZXcgQnV0dG9uKGJ1dHRvbnMsIFNXVC5QVVNIIHwgU1dULkZJTEwgfCBTV1QuQ0VOVEVSKTsKKwkJX3JlbW92ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULlRPUCwgdHJ1ZSwgZmFsc2UsIDEsIDEpKTsKKwkJX3JlbW92ZS5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuQnV0dG9uUmVtb3ZlKTsKKwkJX3JlbW92ZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKKworCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlyZW1vdmUoKTsJCQkJCQorCQkJfQorCisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJcmVtb3ZlKCk7CQkJCQkJCisJCQl9CQkJCQorCQl9KTsKKwkJCisJCUJ1dHRvbiByZXN0b3JlID0gbmV3IEJ1dHRvbihidXR0b25zLCBTV1QuUFVTSCB8IFNXVC5GSUxMIHwgU1dULkNFTlRFUik7CisJCXJlc3RvcmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5UT1AsIHRydWUsIGZhbHNlLCAxLCAxKSk7CisJCVN0cmluZyBkZWZhdWx0cyA9IEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiZGVmYXVsdHMiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN0b3JlLnNldFRleHQoZGVmYXVsdHMpOworCQlyZXN0b3JlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpeworCisJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCXJlc3RvcmVEZWZhdWx0cygpOwkJCQkJCisJCQl9CisKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlyZXN0b3JlRGVmYXVsdHMoKTsJCQkJCQkKKwkJCX0JCQkJCisJCX0pOworCX0KKwkKKwlwcml2YXRlIHZvaWQgcmVzdG9yZURlZmF1bHRzKCkgeworCQlpZiAoX3ZhbGlkYXRvci5pc1YyVmFsaWRhdG9yKCkpeworCQkJdHJ5IHsKKwkJCQlTdHJpbmcgaWQgPSBfdmFsaWRhdG9yLmdldElkKCk7CisJCQkJVmFsaWRhdG9yW10gdmFscyA9IFZhbE1hbmFnZXIuZ2V0RGVmYXVsdFZhbGlkYXRvcnMoKTsKKwkJCQlmb3IgKFZhbGlkYXRvciB2IDogdmFscyl7CisJCQkJCWlmICh2LmdldElkKCkuZXF1YWxzKGlkKSl7CisJCQkJCQlfdmFsaWRhdG9yID0gbmV3IFZhbGlkYXRvck11dGFibGUodik7CisJCQkJCQlfdHJlZS5zZXRJbnB1dChfdmFsaWRhdG9yKTsKKwkJCQkJCV90cmVlLmV4cGFuZEFsbCgpOworCQkJCQkJcmVmcmVzaCgpOworCQkJCQkJcmV0dXJuOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSl7CisJCQkJCisJCQl9CisJCX0KKwkJCisJfQorCisKKwlwcml2YXRlIHZvaWQgYWRkTWVzc2FnZU1hcHBpbmdzKENvbXBvc2l0ZSBjKSB7CisJCWlmICghX3ZhbGlkYXRvci5pc1YyVmFsaWRhdG9yKCkpcmV0dXJuOworCQlNYXA8U3RyaW5nLE1lc3NhZ2VTZXZlcml0eVNldHRpbmc+IG1hcHBpbmdzID0gX3ZhbGlkYXRvci5nZXRNZXNzYWdlU2V0dGluZ3MoKTsKKwkJaWYgKG1hcHBpbmdzID09IG51bGwgfHwgbWFwcGluZ3Muc2l6ZSgpID09IDApcmV0dXJuOworCQkKKwkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoYywgU1dULk5PTkUpOworCQlncm91cC5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuRnJNc2dTZXYpOworCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULlRPUCwgdHJ1ZSwgZmFsc2UsIDIsIDEpKTsKKwkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7CisJCQorLy8JCUxhYmVsIGhlYWRpbmcgPSBuZXcgTGFiZWwoYywgU1dULkxFRlQpOworLy8JCWhlYWRpbmcuc2V0VGV4dChWYWxVSU1lc3NhZ2VzLkVycm9yc1dhcm5pbmdzKTsKKy8vCQloZWFkaW5nLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0SGVhZGVyRm9udCgpKTsKKy8vCQloZWFkaW5nLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuVE9QLCB0cnVlLCBmYWxzZSwgMiwgMSkpOworCQkKKwkJX21lc3NhZ2VTZXYgPSBuZXcgQ29tYm9bbWFwcGluZ3Muc2l6ZSgpXTsKKwkJaW50IGk9IDA7CisJCWZvciAoTWVzc2FnZVNldmVyaXR5U2V0dGluZyBtcyA6IG1hcHBpbmdzLnZhbHVlcygpKXsKKwkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTEVGVCk7CisJCQlsYWJlbC5zZXRUZXh0KCIgICAiICsgbXMuZ2V0TGFiZWwoKSArICI6Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCisJCQlDb21ibyBzZXYgPSBuZXcgQ29tYm8oZ3JvdXAsIFNXVC5SSUdIVCk7CisJCQlfbWVzc2FnZVNldltpKytdID0gc2V2OworCQkJc2V2LnNldEl0ZW1zKF9tZXNzYWdlcyk7CisJCQlzZXYuc2VsZWN0KG1zLmdldEN1cnJlbnQoKS5vcmRpbmFsKCkpOworCQkJc2V2LnNldERhdGEobXMpOworCQkJc2V2LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpeworCisJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQkJc2VsZWN0KGUpOworCQkJCX0KKworCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQkJc2VsZWN0KGUpOworCQkJCX0KKwkJCQkKKwkJCQlwcml2YXRlIHZvaWQgc2VsZWN0KFNlbGVjdGlvbkV2ZW50IGUpeworCQkJCQlDb21ibyB3ID0gKENvbWJvKWUud2lkZ2V0OworCQkJCQlNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nIG1zID0gKE1lc3NhZ2VTZXZlcml0eVNldHRpbmcpdy5nZXREYXRhKCk7CisJCQkJCWludCBpID0gdy5nZXRTZWxlY3Rpb25JbmRleCgpOworCQkJCQlpZiAobXMuc2V0Q3VycmVudChNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nLlNldmVyaXR5LnZhbHVlcygpW2ldKSkKKwkJCQkJCV92YWxpZGF0b3IuYnVtcENoYW5nZUNvdW50TWVzc2FnZXMoKTsKKwkJCQl9CisJCQkJCisJCQl9KTsKKwkJfQorCX0KKwkJCisJLyoqCisJICogQWRkIGEgY29tYm8gYm94IHNvIHRoYXQgdGhlIHVzZXIgY2FuIGNoYW5nZSB3aGljaCBkZWxlZ2F0aW5nIHZhbGlkYXRvciB0byBjYWxsLgorCSAqLworCXByaXZhdGUgdm9pZCBhZGREZWxlZ2F0b3JTZWxlY3Rpb24oQ29tcG9zaXRlIGMpIHsKKwkJTWFwIG1hcCA9IFZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RGVsZWdhdGVEZXNjcmlwdG9ycyhfdmFsaWRhdG9yLmdldFZhbGlkYXRvckNsYXNzbmFtZSgpKTsKKwkJaWYgKG1hcCA9PSBudWxsKXJldHVybjsKKwkJCisJCUNvbXBvc2l0ZSBsaW5lID0gbmV3IENvbXBvc2l0ZShjLCBTV1QuTk9ORSk7CisJCWxpbmUuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoU1dULkhPUklaT05UQUwpKTsKKwkJbGluZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULlRPUCwgdHJ1ZSwgZmFsc2UsIDIsIDEpKTsKKworCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChsaW5lLCBTV1QuQ0VOVEVSKTsKKwkJbGFiZWwuc2V0VGV4dChWYWxVSU1lc3NhZ2VzLkRlbGVnYXRlc0NvbWJvTGFiZWwpOworCisJCQkJCisJCV9kZWxlZ2F0aW5nID0gbmV3IENvbWJvKGxpbmUsIFNXVC5SRUFEX09OTFkpOworCQlTdHJpbmdbXSBpdGVtcyA9IG5ldyBTdHJpbmdbbWFwLnNpemUoKV07CisJCWZpbmFsIFN0cmluZyBpZHNbXSA9IG5ldyBTdHJpbmdbbWFwLnNpemUoKV07CisJCVN0cmluZyBzZWxlY3RlZCA9IG51bGw7CisJCUl0ZXJhdG9yIGl0ID0gbWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7CisJCWZvciAoaW50IGk9MDsgaTxpdGVtcy5sZW5ndGg7aSsrKXsKKwkJCVZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvciB2ZCA9IChWYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3IpaXQubmV4dCgpOworCQkJaXRlbXNbaV0gPSB2ZC5nZXROYW1lKCk7CisJCQlpZHNbaV0gPSB2ZC5nZXRJZCgpOworCQkJaWYgKHZkLmdldElkKCkuZXF1YWxzKF92YWxpZGF0b3IuZ2V0RGVsZWdhdGluZ0lkKCkpKXsKKwkJCQlzZWxlY3RlZCA9IHZkLmdldE5hbWUoKTsKKwkJCX0KKwkJfQorCQlfZGVsZWdhdGluZy5zZXRJdGVtcyhpdGVtcyk7CisJCV9kZWxlZ2F0aW5nLnNldFRleHQoc2VsZWN0ZWQpOworCQlfZGVsZWdhdGluZy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKKworCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCX0KKworCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCWludCBzZWwgPSBfZGVsZWdhdGluZy5nZXRTZWxlY3Rpb25JbmRleCgpOworCQkJCV92YWxpZGF0b3Iuc2V0RGVsZWdhdGluZ0lkKGlkc1tzZWxdKTsKKwkJCX0KKwkJCQorCQl9KTsKKwl9CisKKwkvKioKKwkgKiBBZGQgYSBuZXcgZmlsdGVyIGdyb3VwIHRvIHRoZSB2YWxpZGF0b3IuCisJICogQHBhcmFtIGV4Y2x1ZGUKKwkgKi8KKwlwcml2YXRlIHZvaWQgYWRkR3JvdXAoYm9vbGVhbiBleGNsdWRlKXsKKwkJaWYgKCFfdmFsaWRhdG9yLmlzVjJWYWxpZGF0b3IoKSlyZXR1cm47CisJCUZpbHRlclJ1bGVbXSBydWxlcyA9IG5ldyBGaWx0ZXJSdWxlWzBdOworCQlfdmFsaWRhdG9yLmFkZChGaWx0ZXJHcm91cC5jcmVhdGUoZXhjbHVkZSwgcnVsZXMpKTsKKwkJcmVmcmVzaCgpOworCQkKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHJlZnJlc2goKXsKKwkJX3RyZWUucmVmcmVzaCgpOworCQlfdHJlZS5leHBhbmRBbGwoKTsKKwkJdXBkYXRlQnV0dG9ucygpOwkJCisJfQorCQorCS8qKgorCSAqIFJlbW92ZSB0aGUgY3VycmVudCBzZWxlY3Rpb24gZnJvbSB0aGUgdmFsaWRhdG9yLgorCSAqLworCXByaXZhdGUgdm9pZCByZW1vdmUoKXsKKwkJaWYgKF9zZWxlY3RlZFJ1bGUgIT0gbnVsbCl7CisJCQlGaWx0ZXJHcm91cCBncm91cCA9IGZpbmRHcm91cChfc2VsZWN0ZWRSdWxlKTsKKwkJCWlmIChncm91cCAhPSBudWxsKXsKKwkJCQlGaWx0ZXJHcm91cCBuZXdHcm91cCA9IEZpbHRlckdyb3VwLnJlbW92ZVJ1bGUoZ3JvdXAsIF9zZWxlY3RlZFJ1bGUpOworCQkJCV92YWxpZGF0b3IucmVwbGFjZUZpbHRlckdyb3VwKGdyb3VwLCBuZXdHcm91cCk7CisJCQkJcmVmcmVzaCgpOworCQkJfQorCQl9CisJCQorCQlpZiAoX3NlbGVjdGVkR3JvdXAgIT0gbnVsbCl7CisJCQlfdmFsaWRhdG9yLnJlbW92ZShfc2VsZWN0ZWRHcm91cCk7CisJCQlyZWZyZXNoKCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJCisJLyoqCisJICogRmluZCB0aGUgZ3JvdXAgaW4gdGhlIGN1cnJlbnQgdmFsaWRhdG9yIHRoYXQgaGFzIHRoaXMgcnVsZS4KKwkgKiBAcGFyYW0gcnVsZSBUaGUgcnVsZSB0aGF0IHdlIGFyZSBzZWFyY2hpbmcgZm9yLgorCSAqIEByZXR1cm4gbnVsbCBpZiB3ZSBjYW4gbm90IGZpbmQgdGhlIGdyb3VwLgorCSAqLworCXByaXZhdGUgRmlsdGVyR3JvdXAgZmluZEdyb3VwKEZpbHRlclJ1bGUgcnVsZSkgeworCQlmb3IgKEZpbHRlckdyb3VwIGdyb3VwIDogX3ZhbGlkYXRvci5nZXRHcm91cHMoKSl7CisJCQlmb3IgKEZpbHRlclJ1bGUgZnIgOiBncm91cC5nZXRSdWxlcygpKXsKKwkJCQlpZiAoZnIuZXF1YWxzKHJ1bGUpKXJldHVybiBncm91cDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIHZvaWQgdXBkYXRlQnV0dG9ucygpIHsKKwkJaWYgKF92YWxpZGF0b3IuaXNWMlZhbGlkYXRvcigpKXsKKwkJCV9hZGRHcm91cEV4Y2x1ZGUuc2V0RW5hYmxlZCghVmFsaWRhdG9ySGVscGVyLmhhc0V4Y2x1ZGVHcm91cChfdmFsaWRhdG9yKSk7CisJCX0KKwkJX2FkZFJ1bGUuc2V0RW5hYmxlZChfc2VsZWN0ZWRHcm91cCAhPSBudWxsKTsKKwkJX3JlbW92ZS5zZXRFbmFibGVkKF9zZWxlY3RlZEdyb3VwICE9IG51bGwgfHwgX3NlbGVjdGVkUnVsZSAhPSBudWxsKTsKKwkJaWYgKF9tZXNzYWdlU2V2ICE9IG51bGwpeworCQkJTWFwPFN0cmluZyxNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nPiBtc2dzID0gX3ZhbGlkYXRvci5nZXRNZXNzYWdlU2V0dGluZ3MoKTsKKwkJCWlmIChtc2dzICE9IG51bGwgJiYgX21lc3NhZ2VTZXYubGVuZ3RoID09IG1zZ3Muc2l6ZSgpKXsKKwkJCQlpbnQgaSA9IDA7CisJCQkJZm9yIChNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nIG1zIDogbXNncy52YWx1ZXMoKSl7CisJCQkJCV9tZXNzYWdlU2V2W2krK10uc2VsZWN0KG1zLmdldEN1cnJlbnQoKS5vcmRpbmFsKCkpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCisJcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7CisJCVBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkudW5yZWdpc3RlckFkYXB0ZXJzKF9hZGFwdG9yRmFjdG9yeSk7CisJCWlmIChfdHJlZSAhPSBudWxsKV90cmVlLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihfbm9kZUNoYW5nZWRMaXN0ZW5lcik7CisJCXJldHVybiBzdXBlci5jbG9zZSgpOworCX0KKwkKKwlwcm90ZWN0ZWQgUG9pbnQgZ2V0SW5pdGlhbFNpemUoKSB7CisJCXJldHVybiBuZXcgUG9pbnQoNjAwLCA0NzUpOworCX0KKworCXB1YmxpYyBWYWxpZGF0b3JNdXRhYmxlIGdldFZhbGlkYXRvcigpIHsKKwkJcmV0dXJuIF92YWxpZGF0b3I7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdWkvaW50ZXJuYWwvZGlhbG9nL05ld0ZpbHRlclJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3VpL2ludGVybmFsL2RpYWxvZy9OZXdGaWx0ZXJSdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFkNDlkNwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3VpL2ludGVybmFsL2RpYWxvZy9OZXdGaWx0ZXJSdWxlLmphdmEKQEAgLTAsMCArMSw1NjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS5pbnRlcm5hbC5kaWFsb2c7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3ROYXR1cmVEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuRmlsdGVyUnVsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS5pbnRlcm5hbC5IZWxwQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS5pbnRlcm5hbC5WYWxVSU1lc3NhZ2VzOworCisvKioKKyAqIEEgd2l6YXJkIHRoYXQgYWRkcyBuZXcgcnVsZXMgdG8gdmFsaWRhdG9ycy4KKyAqIEBhdXRob3Iga2FyYXNpdWsKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBOZXdGaWx0ZXJSdWxlIGV4dGVuZHMgV2l6YXJkIHsKKwkKKwlwcml2YXRlIFBhZ2UxIAkJCV9wYWdlMTsKKwlwcml2YXRlIElXaXphcmRQYWdlCQlfcGFnZTI7CisJCisJcHJpdmF0ZSBJUHJvamVjdAkJX3Byb2plY3Q7CisJCisJcHJpdmF0ZSBGaWx0ZXJSdWxlCQlfcnVsZTsKKwkKKwlwdWJsaWMgTmV3RmlsdGVyUnVsZShJUHJvamVjdCBwcm9qZWN0KXsKKwkJX3Byb2plY3QgPSBwcm9qZWN0OworCQlzZXRXaW5kb3dUaXRsZShWYWxVSU1lc3NhZ2VzLkZyV2l6YXJkKTsKKwkJX3BhZ2UxID0gbmV3IFBhZ2UxKHByb2plY3QpOworCQlhZGRQYWdlKF9wYWdlMSk7CisJCXNldEZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyh0cnVlKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewkKKwkJaWYgKF9wYWdlMiAhPSBudWxsKXJldHVybiBfcGFnZTIuaXNQYWdlQ29tcGxldGUoKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkJCisJcHVibGljIEZpbHRlclJ1bGUgZ2V0UnVsZSgpeworCQlyZXR1cm4gX3J1bGU7CisJfQorCQorCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7CisJCWlmIChfcGFnZTIgPT0gbnVsbClyZXR1cm4gZmFsc2U7CisJCUZpbHRlcldpemFyZFBhZ2UgcGFnZSA9IChGaWx0ZXJXaXphcmRQYWdlKV9wYWdlMjsKKwkJX3J1bGUgPSBwYWdlLmdldEZpbHRlclJ1bGUoKTsKKwkJcmV0dXJuIF9ydWxlICE9IG51bGw7CisJfQorCQorCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7CisJCWlmIChwYWdlID09IF9wYWdlMSl7CisJCQlzZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnMoZmFsc2UpOworCQkJX3BhZ2UyID0gcmV0dXJuT3JCdWlsZFBhZ2UoX3BhZ2UxLmdldFNlbGVjdGVkRmlsdGVyKCkpOworCQkJcmV0dXJuIF9wYWdlMjsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHJpdmF0ZSBJV2l6YXJkUGFnZSByZXR1cm5PckJ1aWxkUGFnZShpbnQgc2VsZWN0ZWRGaWx0ZXIpIHsKKwkJCUlXaXphcmRQYWdlIHBhZ2UgPSAgbnVsbDsKKwkJCWlmIChfcHJvamVjdCAhPSBudWxsICYmIHNlbGVjdGVkRmlsdGVyID09IDIpc2VsZWN0ZWRGaWx0ZXIgPSA0OworCQkJc3dpdGNoIChzZWxlY3RlZEZpbHRlcil7CisJCQljYXNlIDA6CisJCQkJcGFnZSA9IG5ldyBGaWxlRXh0UGFnZSgpOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCXBhZ2UgPSBuZXcgRmlsZVBhZ2UoX3Byb2plY3QpOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCXBhZ2UgPSBuZXcgUHJvamVjdFBhZ2UoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQlwYWdlID0gbmV3IEZhY2V0UGFnZSgpOworCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJCXBhZ2UgPSBuZXcgQ29udGVudFR5cGVQYWdlKCk7CisJCQkJYnJlYWs7CisJCQl9CisJCWFkZFBhZ2UocGFnZSk7CisJCXJldHVybiBwYWdlOworCX0KKworCXB1YmxpYyBzdGF0aWMgY2xhc3MgUGFnZTEgZXh0ZW5kcyBXaXphcmRQYWdlIHsKKwkJCisJCXByaXZhdGUgaW50IAkJX3NlbGVjdGVkRmlsdGVyOworCQlwcml2YXRlIElQcm9qZWN0CV9wcm9qZWN0OworCisJCQorCQlwdWJsaWMgUGFnZTEoSVByb2plY3QgcHJvamVjdCl7CisJCQlzdXBlcigicGFnZTEiLCBWYWxVSU1lc3NhZ2VzLkZyU2VsZWN0RmlsdGVyVHlwZSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJCXNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKKwkJCV9wcm9qZWN0ID0gcHJvamVjdDsKKwkJfQorCQkKKwkJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7CisJCQlTdHJpbmcgaGVscElkID0gX3Byb2plY3QgPT0gbnVsbCA/IEhlbHBDb250ZXh0SWRzLkZpbHRlclJ1bGUgOiBIZWxwQ29udGV4dElkcy5Qcm9qZWN0RmlsdGVyUnVsZTsKKwkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LCBoZWxwSWQpOworCQkJU3RyaW5nW10gbGFiZWxzID0gbnVsbDsKKwkJCVN0cmluZ1tdIGRlc2MgPSBudWxsOworCQkJaWYgKF9wcm9qZWN0ICE9IG51bGwpeworCQkJCWxhYmVscyA9IG5ldyBTdHJpbmdbXXtWYWxVSU1lc3NhZ2VzLkxhYmVsRXh0ZW5zaW9uLCBWYWxVSU1lc3NhZ2VzLkxhYmVsRmlsZSwKKwkJCQkJCVZhbFVJTWVzc2FnZXMuTGFiZWxDb250ZW50VHlwZX07CisJCQkJCisJCQkJZGVzYyA9IG5ldyBTdHJpbmdbXXtWYWxVSU1lc3NhZ2VzLkRlc2NFeHRlbnNpb24sIFZhbFVJTWVzc2FnZXMuRGVzY0ZpbGUsCisJCQkJCQlWYWxVSU1lc3NhZ2VzLkRlc2NDb250ZW50VHlwZX07CisJCQl9CisJCQllbHNlIHsKKwkJCQlsYWJlbHMgPSBuZXcgU3RyaW5nW117VmFsVUlNZXNzYWdlcy5MYWJlbEV4dGVuc2lvbiwgVmFsVUlNZXNzYWdlcy5MYWJlbEZpbGUsCisJCQkJCQlWYWxVSU1lc3NhZ2VzLkxhYmVsUHJvamVjdHMsIFZhbFVJTWVzc2FnZXMuTGFiZWxGYWNldHMsCisJCQkJCQlWYWxVSU1lc3NhZ2VzLkxhYmVsQ29udGVudFR5cGV9OworCQkJCQorCQkJCWRlc2MgPSBuZXcgU3RyaW5nW117VmFsVUlNZXNzYWdlcy5EZXNjRXh0ZW5zaW9uLCBWYWxVSU1lc3NhZ2VzLkRlc2NGaWxlLAorCQkJCQkJVmFsVUlNZXNzYWdlcy5EZXNjUHJvamVjdHMsIFZhbFVJTWVzc2FnZXMuRGVzY0ZhY2V0cywgCisJCQkJCQlWYWxVSU1lc3NhZ2VzLkRlc2NDb250ZW50VHlwZX07CisJCQl9CisJCQkKKwkJCUNvbXBvc2l0ZSBjb250cm9sID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKwkJCWNvbnRyb2wuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7CisKKwkJCVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7CisKKwkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCQlkb0l0KGUpOworCQkJCX0KKworCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQkJZG9JdChlKTsKKwkJCQl9CisJCQkJCisJCQkJcHJpdmF0ZSB2b2lkIGRvSXQoU2VsZWN0aW9uRXZlbnQgZSl7CisJCQkJCWlmIChlLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgQnV0dG9uKXsKKwkJCQkJCUJ1dHRvbiBiID0gKEJ1dHRvbillLmdldFNvdXJjZSgpOworCQkJCQkJaWYgKGIuZ2V0RGF0YSgpIGluc3RhbmNlb2YgSW50ZWdlcikgeworCQkJCQkJCUludGVnZXIgaW5kZXggPSAoSW50ZWdlcikgYi5nZXREYXRhKCk7CisJCQkJCQkJc2V0U2VsZWN0ZWRGaWx0ZXIoaW5kZXguaW50VmFsdWUoKSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJCisJCQl9OworCQkJZm9yIChpbnQgaT0wOyBpPGxhYmVscy5sZW5ndGg7IGkrKyl7CisJCQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29udHJvbCwgU1dULlJBRElPKTsKKwkJCQlidXR0b24uc2V0VGV4dChsYWJlbHNbaV0pOworCQkJCWJ1dHRvbi5zZXREYXRhKG5ldyBJbnRlZ2VyKGkpKTsJCQkKKwkJCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOworCQkJCShuZXcgTGFiZWwoY29udHJvbCwgU1dULldSQVApKS5zZXRUZXh0KGRlc2NbaV0pOworCQkJCWlmIChpID09IDApYnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsJCQkJCisJCQl9CQkJCisJCQlzZXRDb250cm9sKGNvbnRyb2wpOwkJCQorCQl9CisKKwkJcHVibGljIGludCBnZXRTZWxlY3RlZEZpbHRlcigpIHsKKwkJCXJldHVybiBfc2VsZWN0ZWRGaWx0ZXI7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZEZpbHRlcihpbnQgc2VsZWN0ZWRGaWx0ZXIpIHsKKwkJCV9zZWxlY3RlZEZpbHRlciA9IHNlbGVjdGVkRmlsdGVyOworCQkJZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOworCQl9CisJCQkJCQkKKwl9CisJCisJcHVibGljIHN0YXRpYyBjbGFzcyBGaWxlRXh0UGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgaW1wbGVtZW50cyBGaWx0ZXJXaXphcmRQYWdlIHsKKwkJCisJCXByaXZhdGUgVGV4dCAJX3BhdHRlcm47CisJCXByaXZhdGUgQnV0dG9uCV9jYXNlOworCQkKKwkJcHVibGljIEZpbGVFeHRQYWdlKCl7CisJCQlzdXBlcigiZmlsZWV4dCIsIFZhbFVJTWVzc2FnZXMuRnJGaWxlRXh0ZW5zaW9uLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCQl9CisKKwkJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7CisJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgSGVscENvbnRleHRJZHMuRlJGaWxlRXh0KTsKKwkJCUNvbXBvc2l0ZSBjb250cm9sID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKwkJCXNldENvbnRyb2woY29udHJvbCk7CisJCQljb250cm9sLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOworCQkJKG5ldyBMYWJlbChjb250cm9sLCBTV1QuTk9ORSkpLnNldFRleHQoVmFsVUlNZXNzYWdlcy5GckZpbGVFeHRlbnNpb25MYWJlbCk7CisJCQlfcGF0dGVybiA9IG5ldyBUZXh0KGNvbnRyb2wsIFNXVC5OT05FKTsKKwkJCV9wYXR0ZXJuLnNldEZvY3VzKCk7CisJCQlfcGF0dGVybi5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKXsKKworCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgeworCQkJCQlnZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7CisJCQkJfQorCQkJCQorCQkJfSk7CisJCQkKKwkJCV9jYXNlID0gbmV3IEJ1dHRvbihjb250cm9sLCBTV1QuQ0hFQ0spOworCQkJX2Nhc2Uuc2V0VGV4dChWYWxVSU1lc3NhZ2VzLkZyQ2FzZVNlbnNpdGl2ZSk7CisJCQlfY2FzZS5zZXRTZWxlY3Rpb24oZmFsc2UpOworCQkJX2Nhc2Uuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkJFR0lOTklORyxmYWxzZSwgZmFsc2UsIDIsIDEpKTsKKwkJCQorCQl9CisKKwkJcHVibGljIEZpbHRlclJ1bGUgZ2V0RmlsdGVyUnVsZSgpIHsKKwkJCWlmICghaXNQYWdlQ29tcGxldGUoKSlyZXR1cm4gbnVsbDsKKwkJCXJldHVybiBGaWx0ZXJSdWxlLkZpbGVFeHQuY3JlYXRlRmlsZUV4dChfcGF0dGVybi5nZXRUZXh0KCksIF9jYXNlLmdldFNlbGVjdGlvbigpKTsKKwkJfQorCQkKKwkJcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7CisJCQlyZXR1cm4gX3BhdHRlcm4gIT0gbnVsbCAmJiBfcGF0dGVybi5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID4gMDsKKwkJfQorCQkKKwkJCisJfQorCQorCXB1YmxpYyBzdGF0aWMgY2xhc3MgRmlsZVBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIGltcGxlbWVudHMgRmlsdGVyV2l6YXJkUGFnZSB7CisJCQorCQlwcml2YXRlIFRleHQgCV9wYXR0ZXJuOworCQlwcml2YXRlIEJ1dHRvbglfYnJvd3NlRmlsZTsKKwkJcHJpdmF0ZSBCdXR0b24JX2Jyb3dzZUZvbGRlcjsKKwkJcHJpdmF0ZSBCdXR0b24JX2Nhc2U7CisJCXByaXZhdGUgQnV0dG9uCV9zaW1wbGVGaWxlTmFtZTsKKwkJCisJCXByaXZhdGUgSVByb2plY3QJX3Byb2plY3Q7CisJCXByaXZhdGUgaW50CQkJX3R5cGUgPSBGaWx0ZXJSdWxlLkZpbGUuRmlsZVR5cGVGaWxlOworCQlwcml2YXRlIElQYXRoCQlfZnVsbEZpbGVOYW1lOworCQlwcml2YXRlIFN0cmluZwkJX3Jvb3Q7CisJCQorCQlwdWJsaWMgRmlsZVBhZ2UoSVByb2plY3QgcHJvamVjdCl7CisJCQlzdXBlcigiZmlsZSIsIFZhbFVJTWVzc2FnZXMuRnJGb2xkZXJPckZpbGUsIG51bGwpOyAvLyROT04tTkxTLTEkCisJCQlfcHJvamVjdCA9IHByb2plY3Q7CisJCX0KKworCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LCBIZWxwQ29udGV4dElkcy5GUk5hbWUpOworCQkJZmluYWwgQ29tcG9zaXRlIGNvbnRyb2wgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOworCQkJc2V0Q29udHJvbChjb250cm9sKTsKKwkJCWNvbnRyb2wuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDQsIGZhbHNlKSk7CisJCQkobmV3IExhYmVsKGNvbnRyb2wsIFNXVC5OT05FKSkuc2V0VGV4dChWYWxVSU1lc3NhZ2VzLkZyRm9sZGVyT3JGaWxlTGFiZWwpOworCQkJX3BhdHRlcm4gPSBuZXcgVGV4dChjb250cm9sLCBTV1QuTk9ORSk7CisJCQlfcGF0dGVybi5zZXRGb2N1cygpOworCQkJX3BhdHRlcm4uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoMzAwLCBTV1QuREVGQVVMVCkpOworCQkJX3BhdHRlcm4uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCl7CisKKwkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKKwkJCQkJZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOworCQkJCX0KKwkJCQkKKwkJCX0pOworCisJCQlfcm9vdCA9IG51bGw7CisJCQlJUGF0aCBiYXNlID0gX3Byb2plY3QgPT0gbnVsbCA/IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKSA6CisJCQkJX3Byb2plY3QuZ2V0TG9jYXRpb24oKTsKKwkJCWlmIChiYXNlICE9IG51bGwpX3Jvb3QgPSBiYXNlLnRvT1NTdHJpbmcoKTsKKwkJCQkJCQorCQkJX2Jyb3dzZUZpbGUgPSBuZXcgQnV0dG9uKGNvbnRyb2wsIFNXVC5QVVNIKTsKKwkJCV9icm93c2VGaWxlLnNldFRleHQoVmFsVUlNZXNzYWdlcy5GckJyb3dzZUZpbGUpOworCQkJX2Jyb3dzZUZpbGUuc2V0RW5hYmxlZChfcm9vdCAhPSBudWxsKTsKKwkJCV9icm93c2VGaWxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpeworCisJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQkJYnJvd3NlKCk7CisJCQkJfQorCisJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCQlicm93c2UoKTsKKwkJCQl9CisJCQkJCisJCQkJcHJpdmF0ZSB2b2lkIGJyb3dzZSgpeworCQkJCQlGaWxlRGlhbG9nIGZkID0gbmV3IEZpbGVEaWFsb2coY29udHJvbC5nZXRTaGVsbCgpLCBTV1QuT1BFTik7CisJCQkJCWZkLnNldFRleHQoVmFsVUlNZXNzYWdlcy5GckZpbGVGaWx0ZXIpOworCQkJCQlmZC5zZXRGaWx0ZXJQYXRoKF9yb290KTsKKwkJCQkJCisJCQkJCVN0cmluZyBmaWxlID0gZmQub3BlbigpOworCQkJCQlpZiAoZmlsZSAhPSBudWxsKXsKKwkJCQkJCWlmIChmaWxlLnN0YXJ0c1dpdGgoX3Jvb3QpKWZpbGUgPSBmaWxlLnN1YnN0cmluZyhfcm9vdC5sZW5ndGgoKSsxKTsKKwkJCQkJCWVsc2UgZmlsZSA9IG51bGw7CisJCQkJCX0KKwkJCQkJaWYgKGZpbGUgIT0gbnVsbCl7CisJCQkJCQlfZnVsbEZpbGVOYW1lID0gbmV3IFBhdGgoZmlsZSk7CisJCQkJCQlpZiAoX3Byb2plY3QgPT0gbnVsbClfZnVsbEZpbGVOYW1lID0gX2Z1bGxGaWxlTmFtZS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOworCisJCQkJCQlpZiAoX3NpbXBsZUZpbGVOYW1lLmdldFNlbGVjdGlvbigpKXsKKwkJCQkJCQlfdHlwZSA9IEZpbHRlclJ1bGUuRmlsZS5GaWxlVHlwZUZpbGU7CisJCQkJCQkJX3BhdHRlcm4uc2V0VGV4dChfZnVsbEZpbGVOYW1lLmxhc3RTZWdtZW50KCkpOworCQkJCQkJfQorCQkJCQkJZWxzZSB7CisJCQkJCQkJX3R5cGUgPSBGaWx0ZXJSdWxlLkZpbGUuRmlsZVR5cGVGdWxsOworCQkJCQkJCV9wYXR0ZXJuLnNldFRleHQoX2Z1bGxGaWxlTmFtZS50b1BvcnRhYmxlU3RyaW5nKCkpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJX2Z1bGxGaWxlTmFtZSA9IG51bGw7CisJCQkJCQlfcGF0dGVybi5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJfQkJCQkKKwkJCX0pOworCQkJCisJCQlfYnJvd3NlRm9sZGVyID0gbmV3IEJ1dHRvbihjb250cm9sLCBTV1QuUFVTSCk7CisJCQlfYnJvd3NlRm9sZGVyLnNldFRleHQoVmFsVUlNZXNzYWdlcy5GckJyb3dzZUZvbGRlcik7CisJCQlfYnJvd3NlRm9sZGVyLnNldEVuYWJsZWQoX3Jvb3QgIT0gbnVsbCk7CisJCQlfYnJvd3NlRm9sZGVyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpeworCisJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQkJYnJvd3NlKCk7CisJCQkJfQorCisJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCQlicm93c2UoKTsKKwkJCQl9CisJCQkJCisJCQkJcHJpdmF0ZSB2b2lkIGJyb3dzZSgpeworCQkJCQlEaXJlY3RvcnlEaWFsb2cgZmQgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKGNvbnRyb2wuZ2V0U2hlbGwoKSk7CisJCQkJCWZkLnNldE1lc3NhZ2UoVmFsVUlNZXNzYWdlcy5GckZvbGRlckZpbHRlcik7CisJCQkJCWZkLnNldEZpbHRlclBhdGgoX3Jvb3QpOworCQkJCQlTdHJpbmcgZGlyID0gZmQub3BlbigpOworCQkJCQlpZiAoZGlyICE9IG51bGwpeworCQkJCQkJX2Z1bGxGaWxlTmFtZSA9IG51bGw7CisJCQkJCQlfdHlwZSA9IEZpbHRlclJ1bGUuRmlsZS5GaWxlVHlwZUZvbGRlcjsKKwkJCQkJCWlmIChkaXIuc3RhcnRzV2l0aChfcm9vdCkgJiYgZGlyLmxlbmd0aCgpID4gX3Jvb3QubGVuZ3RoKCkpeworCQkJCQkJCWRpciA9IGRpci5zdWJzdHJpbmcoX3Jvb3QubGVuZ3RoKCkrMSk7CisJCQkJCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGRpcik7CisJCQkJCQkJaWYgKF9wcm9qZWN0ID09IG51bGwpcGF0aCA9IHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKKwkJCQkJCQlfcGF0dGVybi5zZXRUZXh0KHBhdGgudG9Qb3J0YWJsZVN0cmluZygpKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgeworCQkJCQkJCV9wYXR0ZXJuLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJCisJCQl9KTsKKwkJCQorCQkJX2Nhc2UgPSBuZXcgQnV0dG9uKGNvbnRyb2wsIFNXVC5DSEVDSyk7CisJCQlfY2FzZS5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuRnJDYXNlU2Vuc2l0aXZlKTsKKwkJCV9jYXNlLnNldFNlbGVjdGlvbihmYWxzZSk7CisJCQlfY2FzZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuQkVHSU5OSU5HLGZhbHNlLCBmYWxzZSwgNCwgMSkpOworCQkJCisJCQlhZGRTaW1wbGVGaWxlTmFtZUJ1dHRvbihjb250cm9sKTsKKwkJfQorCisJCXByaXZhdGUgdm9pZCBhZGRTaW1wbGVGaWxlTmFtZUJ1dHRvbihmaW5hbCBDb21wb3NpdGUgY29udHJvbCkgeworCQkJX3NpbXBsZUZpbGVOYW1lID0gbmV3IEJ1dHRvbihjb250cm9sLCBTV1QuQ0hFQ0spOworCQkJX3NpbXBsZUZpbGVOYW1lLnNldFRleHQoVmFsVUlNZXNzYWdlcy5GclNpbXBsZUZpbGVOYW1lKTsKKwkJCV9zaW1wbGVGaWxlTmFtZS5zZXRTZWxlY3Rpb24oX3R5cGUgPT0gRmlsdGVyUnVsZS5GaWxlLkZpbGVUeXBlRmlsZSk7CisJCQlfc2ltcGxlRmlsZU5hbWUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkJFR0lOTklORyxmYWxzZSwgZmFsc2UsIDQsIDEpKTsKKwkJCQorCQkJX3NpbXBsZUZpbGVOYW1lLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpeworCisJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQl9CisKKwkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJCWlmIChfdHlwZSA9PSBGaWx0ZXJSdWxlLkZpbGUuRmlsZVR5cGVGb2xkZXIpcmV0dXJuOworCQkJCQlpZiAoX3NpbXBsZUZpbGVOYW1lLmdldFNlbGVjdGlvbigpKXsKKwkJCQkJCWlmIChfZnVsbEZpbGVOYW1lICE9IG51bGwpX3BhdHRlcm4uc2V0VGV4dChfZnVsbEZpbGVOYW1lLmxhc3RTZWdtZW50KCkpOworCQkJCQkJX3R5cGUgPSBGaWx0ZXJSdWxlLkZpbGUuRmlsZVR5cGVGaWxlOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJaWYgKF9mdWxsRmlsZU5hbWUgIT0gbnVsbClfcGF0dGVybi5zZXRUZXh0KF9mdWxsRmlsZU5hbWUudG9Qb3J0YWJsZVN0cmluZygpKTsKKwkJCQkJCV90eXBlID0gRmlsdGVyUnVsZS5GaWxlLkZpbGVUeXBlRnVsbDsJCQkJCX0KKwkJCQkJfQkJCQkKKwkJCQl9KTsKKwkJfQorCisJCXB1YmxpYyBGaWx0ZXJSdWxlIGdldEZpbHRlclJ1bGUoKSB7CisJCQlpZiAoIWlzUGFnZUNvbXBsZXRlKCkpcmV0dXJuIG51bGw7CisJCQlyZXR1cm4gRmlsdGVyUnVsZS5jcmVhdGVGaWxlKF9wYXR0ZXJuLmdldFRleHQoKSwgX2Nhc2UuZ2V0U2VsZWN0aW9uKCksIF90eXBlKTsKKwkJfQorCQkKKwkJcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7CisJCQlpZiAoX3BhdHRlcm4gPT0gbnVsbClyZXR1cm4gZmFsc2U7CisJCQlpZiAoX3BhdHRlcm4uZ2V0VGV4dCgpID09IG51bGwpcmV0dXJuIGZhbHNlOworCQkJcmV0dXJuIF9wYXR0ZXJuLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPiAwOworCQl9CisJCQorCX0KKwkKKwlwdWJsaWMgc3RhdGljIGNsYXNzIFByb2plY3RQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSBpbXBsZW1lbnRzIEZpbHRlcldpemFyZFBhZ2V7CisJCQorCQlwcml2YXRlIENvbWJvCQlfbmF0dXJlczsKKwkJcHJpdmF0ZSBTdHJpbmdbXQlfaWRzOworCQkKKwkJcHVibGljIFByb2plY3RQYWdlKCl7CisJCQlzdXBlcigicHJvamVjdCIsIFZhbFVJTWVzc2FnZXMuRnJQcm9qZWN0TmF0dXJlLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCQl9CisKKwkJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7CisJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgSGVscENvbnRleHRJZHMuRlJQcm9qZWN0TmF0dXJlKTsKKwkJCUNvbXBvc2l0ZSBjb250cm9sID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKwkJCXNldENvbnRyb2woY29udHJvbCk7CisJCQljb250cm9sLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOworCQkJKG5ldyBMYWJlbChjb250cm9sLCBTV1QuTk9ORSkpLnNldFRleHQoVmFsVUlNZXNzYWdlcy5GclByb2plY3ROYXR1cmVMYWJlbCk7CisJCQkKKwkJCUlQcm9qZWN0TmF0dXJlRGVzY3JpcHRvcltdIHBuID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldE5hdHVyZURlc2NyaXB0b3JzKCk7CisJCQlTdHJpbmcgaXRlbXNbXSA9IG5ldyBTdHJpbmdbcG4ubGVuZ3RoXTsKKwkJCV9pZHMgPSBuZXcgU3RyaW5nW3BuLmxlbmd0aF07CisJCQlmb3IgKGludCBpPTA7IGk8cG4ubGVuZ3RoOyBpKyspeworCQkJCV9pZHNbaV0gPSBwbltpXS5nZXROYXR1cmVJZCgpOworCQkJCWl0ZW1zW2ldID0gcG5baV0uZ2V0TGFiZWwoKSArICIgLSAiICsgX2lkc1tpXTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJX25hdHVyZXMgPSBuZXcgQ29tYm8oY29udHJvbCwgU1dULkRST1BfRE9XTik7CisJCQlfbmF0dXJlcy5zZXRJdGVtcyhpdGVtcyk7CisJCQlfbmF0dXJlcy5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKXsKKworCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgeworCQkJCQlnZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7CQkJCQkKKwkJCQl9CisJCQkJCisJCQl9KTsKKwkJCQkJCQorCQl9CisKKwkJcHVibGljIEZpbHRlclJ1bGUgZ2V0RmlsdGVyUnVsZSgpIHsKKwkJCWlmICghaXNQYWdlQ29tcGxldGUoKSlyZXR1cm4gbnVsbDsKKwkJCWludCBpID0gX25hdHVyZXMuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKKwkJCWlmIChpID09IC0xKXJldHVybiBudWxsOworCQkJCisJCQlyZXR1cm4gRmlsdGVyUnVsZS5jcmVhdGVQcm9qZWN0KF9pZHNbaV0pOworCQl9CisJCQorCQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKKwkJCWlmIChfbmF0dXJlcyA9PSBudWxsKXJldHVybiBmYWxzZTsKKwkJCWlmIChfbmF0dXJlcy5nZXRUZXh0KCkgPT0gbnVsbClyZXR1cm4gZmFsc2U7CisJCQlyZXR1cm4gX25hdHVyZXMuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDA7CisJCX0KKwkKKwl9CisJCisJcHVibGljIHN0YXRpYyBjbGFzcyBGYWNldFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIGltcGxlbWVudHMgRmlsdGVyV2l6YXJkUGFnZSB7CisJCQorCQlwcml2YXRlIFRleHQJX3BhdHRlcm47CisJCQorCQlwdWJsaWMgRmFjZXRQYWdlKCl7CisJCQlzdXBlcigiZmFjZXQiLCBWYWxVSU1lc3NhZ2VzLkZyRmFjaXQsIG51bGwpOyAvLyROT04tTkxTLTEkCisJCX0KKworCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LCBIZWxwQ29udGV4dElkcy5GUkZhY2V0KTsKKwkJCUNvbXBvc2l0ZSBjb250cm9sID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKwkJCXNldENvbnRyb2woY29udHJvbCk7CisJCQljb250cm9sLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOworCQkJKG5ldyBMYWJlbChjb250cm9sLCBTV1QuTk9ORSkpLnNldFRleHQoVmFsVUlNZXNzYWdlcy5GckZhY2l0TGFiZWwpOworCQkJX3BhdHRlcm4gPSBuZXcgVGV4dChjb250cm9sLCBTV1QuTk9ORSk7CisJCQlfcGF0dGVybi5zZXRGb2N1cygpOworCQkJX3BhdHRlcm4uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoMzAwLCBTV1QuREVGQVVMVCkpOworCQkJX3BhdHRlcm4uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCl7CisKKwkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKKwkJCQkJZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOworCQkJCX0KKwkJCQkKKwkJCX0pOworCQl9CisKKwkJcHVibGljIEZpbHRlclJ1bGUgZ2V0RmlsdGVyUnVsZSgpIHsKKwkJCWlmICghaXNQYWdlQ29tcGxldGUoKSlyZXR1cm4gbnVsbDsKKwkJCUZpbHRlclJ1bGUgcnVsZSA9IEZpbHRlclJ1bGUuY3JlYXRlRmFjZXQoX3BhdHRlcm4uZ2V0VGV4dCgpKTsKKwkJCXJldHVybiBydWxlOworCQl9CisJCQorCQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKKwkJCWlmIChfcGF0dGVybiA9PSBudWxsKXJldHVybiBmYWxzZTsKKwkJCWlmIChfcGF0dGVybi5nZXRUZXh0KCkgPT0gbnVsbClyZXR1cm4gZmFsc2U7CisJCQlyZXR1cm4gX3BhdHRlcm4uZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDA7CisJCX0KKwkJCisJfQorCQorCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ29udGVudFR5cGVQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSBpbXBsZW1lbnRzIEZpbHRlcldpemFyZFBhZ2UgeworCQlwcml2YXRlIENvbWJvCV9wYXR0ZXJuOworCQlwcml2YXRlIEJ1dHRvbglfZXhhY3RNYXRjaDsKKwkJcHJpdmF0ZSBNYXA8U3RyaW5nLCBJQ29udGVudFR5cGU+IF9tYXA7CisJCQorCQlwdWJsaWMgQ29udGVudFR5cGVQYWdlKCl7CisJCQlzdXBlcigiY29udGVudFR5cGUiLCBWYWxVSU1lc3NhZ2VzLkZyQ29udGVudFR5cGUsIG51bGwpOyAvLyROT04tTkxTLTEkCisJCX0KKworCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LCBIZWxwQ29udGV4dElkcy5GUkNvbnRlbnRUeXBlKTsKKwkJCUNvbXBvc2l0ZSBjb250cm9sID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKwkJCXNldENvbnRyb2woY29udHJvbCk7CisJCQljb250cm9sLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOworCQkJKG5ldyBMYWJlbChjb250cm9sLCBTV1QuTk9ORSkpLnNldFRleHQoVmFsVUlNZXNzYWdlcy5GckNvbnRlbnRUeXBlTGFiZWwpOworCQkJCisJCQlJQ29udGVudFR5cGVbXSB0eXBlcyA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldEFsbENvbnRlbnRUeXBlcygpOworCQkJX21hcCA9IG5ldyBUcmVlTWFwPFN0cmluZywgSUNvbnRlbnRUeXBlPigpOworCQkJZm9yIChJQ29udGVudFR5cGUgdHlwZSA6IHR5cGVzKXsKKwkJCQlTdHJpbmcgbmFtZSA9IHR5cGUuZ2V0TmFtZSgpOworCQkJCWlmIChuYW1lID09IG51bGwpbmFtZSA9IHR5cGUuZ2V0SWQoKTsKKwkJCQlfbWFwLnB1dChuYW1lLCB0eXBlKTsKKwkJCX0KKwkJCVN0cmluZyBpdGVtc1tdID0gbmV3IFN0cmluZ1tfbWFwLnNpemUoKV07CisJCQlpbnQgaSA9IDA7CisJCQlmb3IgKFN0cmluZyBsYWJlbCA6IF9tYXAua2V5U2V0KCkpeworCQkJCWl0ZW1zW2krK10gPSBsYWJlbDsKKwkJCX0KKwkJCV9wYXR0ZXJuID0gbmV3IENvbWJvKGNvbnRyb2wsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKKwkJCV9wYXR0ZXJuLnNldEZvY3VzKCk7CisJCQlfcGF0dGVybi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgzMDAsIFNXVC5ERUZBVUxUKSk7CisJCQlfcGF0dGVybi5zZXRWaXNpYmxlSXRlbUNvdW50KDIwKTsKKwkJCV9wYXR0ZXJuLnNldEl0ZW1zKGl0ZW1zKTsKKwkJCV9wYXR0ZXJuLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpeworCisJCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7CisJCQkJCWdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKKwkJCQl9CisJCQkJCisJCQl9KTsKKwkJCQorCQkJX2V4YWN0TWF0Y2ggPSBuZXcgQnV0dG9uKGNvbnRyb2wsIFNXVC5DSEVDSyk7CisJCQlfZXhhY3RNYXRjaC5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuRnJFeGFjdE1hdGNoKTsKKwkJCV9leGFjdE1hdGNoLnNldFNlbGVjdGlvbihmYWxzZSk7CisJCQlfZXhhY3RNYXRjaC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuQkVHSU5OSU5HLGZhbHNlLCBmYWxzZSwgMiwgMSkpOworCisJCX0KKworCQlwdWJsaWMgRmlsdGVyUnVsZSBnZXRGaWx0ZXJSdWxlKCkgeworCQkJaWYgKCFpc1BhZ2VDb21wbGV0ZSgpKXJldHVybiBudWxsOworCQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBfbWFwLmdldChfcGF0dGVybi5nZXRUZXh0KCkpOworCQkJaWYgKHR5cGUgPT0gbnVsbClyZXR1cm4gbnVsbDsKKwkJCUZpbHRlclJ1bGUgcnVsZSA9IEZpbHRlclJ1bGUuY3JlYXRlQ29udGVudFR5cGUodHlwZS5nZXRJZCgpLCBfZXhhY3RNYXRjaC5nZXRTZWxlY3Rpb24oKSk7CisJCQlyZXR1cm4gcnVsZTsKKwkJfQorCQkKKwkJcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7CisJCQlpZiAoX3BhdHRlcm4gPT0gbnVsbClyZXR1cm4gZmFsc2U7CisJCQlpZiAoX3BhdHRlcm4uZ2V0VGV4dCgpID09IG51bGwpcmV0dXJuIGZhbHNlOworCQkJcmV0dXJuIF9wYXR0ZXJuLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPiAwOworCQl9CisJCQorCX0KKwkKKwlpbnRlcmZhY2UgRmlsdGVyV2l6YXJkUGFnZSB7CisJCS8qKgorCQkgKiBBbnN3ZXIgdGhlIHJ1bGUgdGhhdCB3YXMgY3JlYXRlZC4KKwkJICogCisJCSAqIEByZXR1cm4gbnVsbCBpZiB0aGUgdXNlciBkaWRuJ3QgY3JlYXRlIGEgbmV3IHJ1bGUuCisJCSAqLworCQlGaWx0ZXJSdWxlIGdldEZpbHRlclJ1bGUoKTsKKwl9CisKKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdWkvaW50ZXJuYWwvZGlhbG9nL1Jlc3VsdHNEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3VpL2ludGVybmFsL2RpYWxvZy9SZXN1bHRzRGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUzNGViNwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3VpL2ludGVybmFsL2RpYWxvZy9SZXN1bHRzRGlhbG9nLmphdmEKQEAgLTAsMCArMSwxNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS5pbnRlcm5hbC5kaWFsb2c7CisKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSWNvbkFuZE1lc3NhZ2VEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UubGF5b3V0LkdyaWREYXRhRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5NaXNjOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsUHJlZk1hbmFnZXJHbG9iYWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvblJlc3VsdFN1bW1hcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuR2xvYmFsUHJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwubW9kZWwuR2xvYmFsUHJlZmVyZW5jZXNWYWx1ZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwudWkuVmFsaWRhdGlvblVJTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkuaW50ZXJuYWwuVmFsVUlNZXNzYWdlczsKKworLyoqCisgKiBBIGRpYWxvZyBmb3IgZGlzcGxheWluZyB0aGUgcmVzdWx0cyBvZiBhIG1hbnVhbCB2YWxpZGF0aW9uLgorICogQGF1dGhvciBrYXJhc2l1aworICoKKyAqLworcHVibGljIGNsYXNzIFJlc3VsdHNEaWFsb2cgZXh0ZW5kcyBJY29uQW5kTWVzc2FnZURpYWxvZyB7CisJCisJcHJpdmF0ZSBWYWxpZGF0aW9uUmVzdWx0U3VtbWFyeSAJX3Jlc3VsdDsKKwlwcml2YXRlIGxvbmcJCQkJX3RpbWU7CisJcHJpdmF0ZSBpbnQJCQkJCV9yZXNvdXJjZUNvdW50OworCXByaXZhdGUgQnV0dG9uIF9oaWRlQnV0dG9uOworCisJLyoqCisJICogQ3JlYXRlIGEgZGlhbG9nIGZvciBkaXNwbGF5aW5nIHZhbGlkYXRpb24gcmVzdWx0cy4KKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50U2hlbGwgdGhpcyBjYW4gYmUgbnVsbAorCSAqIEBwYXJhbSByZXN1bHRzIHRoZSByZXN1bHRzIG9mIHRoZSB2YWxpZGF0aW9uCisJICogQHBhcmFtIHRpbWUgdGhlIHRpbWUgdGhhdCB0aGUgdmFsaWRhdGlvbiB0b29rIGluIG1pbGxpc2Vjb25kcworCSAqIEBwYXJhbSByZXNvdXJjZUNvdW50IHRoZSBudW1iZXIgb2YgcmVzb3VyY2VzIHRoYXQgd2VyZSB2YWxpZGF0ZWQKKwkgKi8KKwlwdWJsaWMgUmVzdWx0c0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgVmFsaWRhdGlvblJlc3VsdFN1bW1hcnkgcmVzdWx0cywgbG9uZyB0aW1lLCBpbnQgcmVzb3VyY2VDb3VudCkgeworCQlzdXBlcihwYXJlbnRTaGVsbCk7CisJCV9yZXN1bHQgPSByZXN1bHRzOworCQlfdGltZSA9IHRpbWU7CisJCV9yZXNvdXJjZUNvdW50ID0gcmVzb3VyY2VDb3VudDsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgeworCQlpZihfaGlkZUJ1dHRvbiE9bnVsbCkgeworCQkJVmFsTWFuYWdlciB2bSA9IFZhbE1hbmFnZXIuZ2V0RGVmYXVsdCgpOworCQkJR2xvYmFsUHJlZmVyZW5jZXMgZ3AgPSB2bS5nZXRHbG9iYWxQcmVmZXJlbmNlcygpOworCQkJR2xvYmFsUHJlZmVyZW5jZXNWYWx1ZXMgZ3B2ID0gZ3AuYXNWYWx1ZXMoKTsKKwkJCWdwdi5jb25maXJtRGlhbG9nID0gIV9oaWRlQnV0dG9uLmdldFNlbGVjdGlvbigpOworCQkJaW50IGNoYW5nZXMgPSB2bS5yZXBsYWNlKGdwdik7CisJCQlpZiAoY2hhbmdlcyAhPSAwKVZhbFByZWZNYW5hZ2VyR2xvYmFsLmdldERlZmF1bHQoKS5zYXZlUHJlZmVyZW5jZXMoKTsKKwkJfQorCQlzdXBlci5va1ByZXNzZWQoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIGludCBvcGVuKCkgeworCQlpZiAoIUVycm9yRGlhbG9nLkFVVE9NQVRFRF9NT0RFKSB7CisJCQlyZXR1cm4gc3VwZXIub3BlbigpOworCQl9CisJCXNldFJldHVybkNvZGUoT0spOworCQlyZXR1cm4gT0s7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZSgpIHsKKwkJaWYgKF9yZXN1bHQuZ2V0U2V2ZXJpdHlFcnJvcigpID4gMClyZXR1cm4gZ2V0RXJyb3JJbWFnZSgpOworCQlpZiAoX3Jlc3VsdC5nZXRTZXZlcml0eVdhcm5pbmcoKSA+IDApcmV0dXJuIGdldFdhcm5pbmdJbWFnZSgpOworCQlyZXR1cm4gZ2V0SW5mb0ltYWdlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgeworCQltZXNzYWdlID0gZ2V0TWVzc2FnZSgpOworCQljcmVhdGVNZXNzYWdlQXJlYShwYXJlbnQpOworCQkJCQorCQluZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSkuc2V0TGF5b3V0RGF0YShHcmlkRGF0YUZhY3Rvcnkuc3d0RGVmYXVsdHMoKS5zcGFuKDIsIDEpLmNyZWF0ZSgpKTsJCQorCQlhZGRIaWRlQ2hlY2tib3gocGFyZW50KTsKKworCQlDb250cm9sIGMgPSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7CisJCXJldHVybiBjOworCX0KKwkKKwlwcml2YXRlIHZvaWQgYWRkSGlkZUNoZWNrYm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJX2hpZGVCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKKwkJR3JpZERhdGFGYWN0b3J5LnN3dERlZmF1bHRzKCkuYWxpZ24oU1dULkJFR0lOTklORywgU1dULkJFR0lOTklORykuc3BhbigyLCAxKS5hcHBseVRvKF9oaWRlQnV0dG9uKTsKKwkJX2hpZGVCdXR0b24uc2V0VGV4dChWYWxVSU1lc3NhZ2VzLkRvTm90U2hvd1Jlc3VsdHMpOworCQlpZiAoVmFsTWFuYWdlci5nZXREZWZhdWx0KCkuZ2V0R2xvYmFsUHJlZmVyZW5jZXMoKS5nZXRDb25maXJtRGlhbG9nKCkgJiYgX2hpZGVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKKwkJCS8vIHRlbGwgdGhlIHVzZXIgd2hlcmUgdG8gcmUtZW5hYmxlIGl0PworCQl9CisJCV9oaWRlQnV0dG9uLnNldFNlbGVjdGlvbighVmFsTWFuYWdlci5nZXREZWZhdWx0KCkuZ2V0R2xvYmFsUHJlZmVyZW5jZXMoKS5nZXRDb25maXJtRGlhbG9nKCkpOworCX0KKworCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIG5ld1NoZWxsKSB7CisJCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKKwkJbmV3U2hlbGwuc2V0VGV4dChWYWxpZGF0aW9uVUlNZXNzYWdlcy5WYWxSZXN1bHRzKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7CisJCUJ1dHRvbiBvayA9IGNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIGZhbHNlKTsKKwkJb2suc2V0Rm9jdXMoKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXRNZXNzYWdlKCl7CisJCWlmIChfcmVzb3VyY2VDb3VudCA+IDEpIHsKKwkJCWlmIChfcmVzdWx0LmdldFNldmVyaXR5RXJyb3IoKSA+IDEpCisJCQkJcmV0dXJuIE5MUy5iaW5kKFZhbGlkYXRpb25VSU1lc3NhZ2VzLlZhbEVycm9yc1Jlc291cmNlcywgbmV3IE9iamVjdFtde19yZXN1bHQuZ2V0U2V2ZXJpdHlFcnJvcigpLCBfcmVzb3VyY2VDb3VudCwgTWlzYy5nZXRUaW1lTVMoX3RpbWUpfSk7CisJCQlpZiAoX3Jlc3VsdC5nZXRTZXZlcml0eUVycm9yKCkgPT0gMSkKKwkJCQlyZXR1cm4gTkxTLmJpbmQoVmFsaWRhdGlvblVJTWVzc2FnZXMuVmFsRXJyb3IxUmVzb3VyY2VzLCBfcmVzb3VyY2VDb3VudCwgTWlzYy5nZXRUaW1lTVMoX3RpbWUpKTsKKworCQkJaWYgKF9yZXN1bHQuZ2V0U2V2ZXJpdHlXYXJuaW5nKCkgPiAxKQorCQkJCXJldHVybiBOTFMuYmluZChWYWxpZGF0aW9uVUlNZXNzYWdlcy5WYWxXYXJuUmVzb3VyY2VzLCBuZXcgT2JqZWN0W117X3Jlc3VsdC5nZXRTZXZlcml0eVdhcm5pbmcoKSwgX3Jlc291cmNlQ291bnQsIE1pc2MuZ2V0VGltZU1TKF90aW1lKX0pOworCQkJaWYgKF9yZXN1bHQuZ2V0U2V2ZXJpdHlXYXJuaW5nKCkgPT0gMSkKKwkJCQlyZXR1cm4gTkxTLmJpbmQoVmFsaWRhdGlvblVJTWVzc2FnZXMuVmFsV2FybjFSZXNvdXJjZXMsIF9yZXNvdXJjZUNvdW50LCBNaXNjLmdldFRpbWVNUyhfdGltZSkpOworCisJCQlpZiAoX3Jlc3VsdC5nZXRTZXZlcml0eUluZm8oKSA+IDEpCisJCQkJcmV0dXJuIE5MUy5iaW5kKFZhbGlkYXRpb25VSU1lc3NhZ2VzLlZhbEluZm9SZXNvdXJjZXMsIG5ldyBPYmplY3RbXXtfcmVzdWx0LmdldFNldmVyaXR5SW5mbygpLCBfcmVzb3VyY2VDb3VudCwgTWlzYy5nZXRUaW1lTVMoX3RpbWUpfSk7CisJCQlpZiAoX3Jlc3VsdC5nZXRTZXZlcml0eUluZm8oKSA9PSAxKQorCQkJCXJldHVybiBOTFMuYmluZChWYWxpZGF0aW9uVUlNZXNzYWdlcy5WYWxJbmZvMVJlc291cmNlcywgX3Jlc291cmNlQ291bnQsIE1pc2MuZ2V0VGltZU1TKF90aW1lKSk7CisJCX0KKwkJZWxzZSBpZiAoX3Jlc291cmNlQ291bnQgPT0gMSkgeworCQkJaWYgKF9yZXN1bHQuZ2V0U2V2ZXJpdHlFcnJvcigpID4gMSkKKwkJCQlyZXR1cm4gTkxTLmJpbmQoVmFsaWRhdGlvblVJTWVzc2FnZXMuVmFsRXJyb3JzUmVzb3VyY2UxLCBfcmVzdWx0LmdldFNldmVyaXR5RXJyb3IoKSwgTWlzYy5nZXRUaW1lTVMoX3RpbWUpKTsKKwkJCWlmIChfcmVzdWx0LmdldFNldmVyaXR5RXJyb3IoKSA9PSAxKQorCQkJCXJldHVybiBOTFMuYmluZChWYWxpZGF0aW9uVUlNZXNzYWdlcy5WYWxFcnJvcjFSZXNvdXJjZTEsIE1pc2MuZ2V0VGltZU1TKF90aW1lKSk7CisKKwkJCWlmIChfcmVzdWx0LmdldFNldmVyaXR5V2FybmluZygpID4gMSkKKwkJCQlyZXR1cm4gTkxTLmJpbmQoVmFsaWRhdGlvblVJTWVzc2FnZXMuVmFsV2FyblJlc291cmNlMSwgX3Jlc3VsdC5nZXRTZXZlcml0eVdhcm5pbmcoKSwgTWlzYy5nZXRUaW1lTVMoX3RpbWUpKTsKKwkJCWlmIChfcmVzdWx0LmdldFNldmVyaXR5V2FybmluZygpID09IDEpCisJCQkJcmV0dXJuIE5MUy5iaW5kKFZhbGlkYXRpb25VSU1lc3NhZ2VzLlZhbFdhcm4xUmVzb3VyY2UxLCBNaXNjLmdldFRpbWVNUyhfdGltZSkpOworCisJCQlpZiAoX3Jlc3VsdC5nZXRTZXZlcml0eUluZm8oKSA+IDEpCisJCQkJcmV0dXJuIE5MUy5iaW5kKFZhbGlkYXRpb25VSU1lc3NhZ2VzLlZhbEluZm9SZXNvdXJjZTEsIF9yZXN1bHQuZ2V0U2V2ZXJpdHlJbmZvKCksIE1pc2MuZ2V0VGltZU1TKF90aW1lKSk7CisJCQlpZiAoX3Jlc3VsdC5nZXRTZXZlcml0eUluZm8oKSA9PSAxKQorCQkJCXJldHVybiBOTFMuYmluZChWYWxpZGF0aW9uVUlNZXNzYWdlcy5WYWxJbmZvMVJlc291cmNlMSwgTWlzYy5nZXRUaW1lTVMoX3RpbWUpKTsKKwkJfQorCQlyZXR1cm4gVmFsaWRhdGlvblVJTWVzc2FnZXMuVmFsU3VjY2VzczsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9WYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1ZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZTE1NTYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9WYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2UuamF2YQpAQCAtMCwwICsxLDg0NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLmludGVybmFsLnByZWZlcmVuY2VzOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5sYXlvdXQuR3JpZERhdGFGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TY3JvbGxlZENvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5NZW51QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVzc2FnZUJveDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuQ29uZmlndXJhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuRnVsbEJ1aWxkSm9iOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkdsb2JhbENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxQcmVmTWFuYWdlckdsb2JhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNdXRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLkdsb2JhbFByZWZlcmVuY2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm1vZGVsLkdsb2JhbFByZWZlcmVuY2VzVmFsdWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnVpLkRlbGVnYXRpbmdWYWxpZGF0b3JQcmVmZXJlbmNlc0RpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC51aS5wbHVnaW4uVmFsaWRhdGlvblVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLmludGVybmFsLkhlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLmludGVybmFsLkltYWdlTmFtZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkuaW50ZXJuYWwuVmFsVUlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS5pbnRlcm5hbC5kaWFsb2cuRmlsdGVyRGlhbG9nOworCisvKioKKyAqIEZyb20gdGhpcyBwYWdlIHRoZSB1c2VyIGNhbiBjb25maWd1cmUgaW5kaXZpZHVhbCB2YWxpZGF0b3JzLgorICogPHA+CisgKiBUaGlzIGNsYXNzIGFuZCBpdHMgaW5uZXIgY2xhc3NlcyBhcmUgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgb3V0c2lkZSBvZgorICogdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLgorICogPC9wPgorICovCitwdWJsaWMgY2xhc3MgVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cwlJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgeworCisJcHJpdmF0ZSBJVmFsaWRhdGlvblBhZ2UgX3BhZ2VJbXBsID0gbnVsbDsKKwlwcml2YXRlIFNoZWxsIF9zaGVsbDsKKworCXB1YmxpYyBpbnRlcmZhY2UgSVZhbGlkYXRpb25QYWdlIHsKKwkJCisJCUNvbXBvc2l0ZSBjcmVhdGVQYWdlKENvbXBvc2l0ZSBwYXJlbnQpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworCQlib29sZWFuIHBlcmZvcm1PaygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworCQlib29sZWFuIHBlcmZvcm1EZWZhdWx0cygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworCQlDb21wb3NpdGUgZ2V0Q29udHJvbCgpOworCQl2b2lkIGRpc3Bvc2UoKTsKKwkJdm9pZCBsb3NlRm9jdXMoKTsKKwkJdm9pZCBnYWluRm9jdXMoKTsKKwl9CisKKwlwdWJsaWMgZmluYWwgY2xhc3MgSW52YWxpZFBhZ2UgaW1wbGVtZW50cyBJVmFsaWRhdGlvblBhZ2UgeworCQlwcml2YXRlIENvbXBvc2l0ZSBwYWdlID0gbnVsbDsKKworCQlwcml2YXRlIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBudWxsOworCQlwcml2YXRlIEdyaWRMYXlvdXQgbGF5b3V0ID0gbnVsbDsKKwkJcHJpdmF0ZSBMYWJlbCBtZXNzYWdlTGFiZWwgPSBudWxsOworCisJCXB1YmxpYyBJbnZhbGlkUGFnZShDb21wb3NpdGUgcGFyZW50KSB7CisJCQlwYWdlID0gY3JlYXRlUGFnZShwYXJlbnQpOworCQl9CisKKwkJLyoqCisJCSAqIFRoaXMgcGFnZSBpcyBhZGRlZCB0byB0aGUgUHJvcGVydGllcyBndWlkZSBpZiBzb21lIGludGVybmFsIHByb2JsZW0KKwkJICogb2NjdXJyZWQ7IGZvciBleGFtcGxlLCB0aGUgaGlnaGxpZ2h0ZWQgaXRlbSBpbiB0aGUgd29ya2JlbmNoIGlzIG5vdAorCQkgKiBhbiBJUHJvamVjdCAoYWNjb3JkaW5nIHRvIHRoaXMgcGFnZSdzIHBsdWdpbi54bWwsIHRoaXMgcGFnZSBpcyBvbmx5CisJCSAqIHZhbGlkIHdoZW4gYW4gSVByb2plY3QgaXMgc2VsZWN0ZWQpLgorCQkgKi8KKwkJcHVibGljIENvbXBvc2l0ZSBjcmVhdGVQYWdlKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCS8vIERvbid0IGNyZWF0ZSB0aGUgZGVmYXVsdCBhbmQgYXBwbHkgYnV0dG9ucy4KKwkJCW5vRGVmYXVsdEFuZEFwcGx5QnV0dG9uKCk7CisKKwkJCWZpbmFsIFNjcm9sbGVkQ29tcG9zaXRlIHNjMSA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZShwYXJlbnQsCVNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7CisJCQlzYzEuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7CisJCQljb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHNjMSwgU1dULk5PTkUpOworCQkJc2MxLnNldENvbnRlbnQoY29tcG9zaXRlKTsKKwkJCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7CisKKwkJCW1lc3NhZ2VMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKKwkJCW1lc3NhZ2VMYWJlbC5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuVkJGX0VYQ19JTlZBTElEX1JFR0lTVEVSKTsKKworCQkJY29tcG9zaXRlLnNldFNpemUoY29tcG9zaXRlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkpOworCisJCQlyZXR1cm4gY29tcG9zaXRlOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gcGVyZm9ybURlZmF1bHRzKCkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQkvKioKKwkJICogU2luY2UgdGhpcyBwYWdlIG9jY3VycyB1bmRlciBpbnZhbGlkIGNpcmN1bXN0YW5jZXMsIHRoZXJlIGlzIG5vdGhpbmcKKwkJICogdG8gc2F2ZS4KKwkJICovCisJCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJcHVibGljIENvbXBvc2l0ZSBnZXRDb250cm9sKCkgeworCQkJcmV0dXJuIHBhZ2U7CisJCX0KKworCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQkJbWVzc2FnZUxhYmVsLmRpc3Bvc2UoKTsKKwkJCS8vIGxheW91dC5kaXNwb3NlKCk7CisJCQljb21wb3NpdGUuZGlzcG9zZSgpOworCQl9CisKKwkJcHVibGljIHZvaWQgbG9zZUZvY3VzKCkgeworCQkJLy8gVGhpcyBwYWdlIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgY29udGVudHMgb2YgYW55IG90aGVyIHBhZ2UgaW4KKwkJCS8vIHRoZSB3aXphcmQsIHNvIGRvIG5vdGhpbmcuCisJCX0KKworCQlwdWJsaWMgdm9pZCBnYWluRm9jdXMoKSB7CisJCQkvLyBUaGlzIHBhZ2UgZG9lcyBub3QgZGVwZW5kIG9uIHRoZSBjb250ZW50cyBvZiBhbnkgb3RoZXIgcGFnZSBpbgorCQkJLy8gdGhlIHdpemFyZCwgc28gZG8gbm90aGluZy4KKwkJfQorCX0KKworCXByaXZhdGUgZmluYWwgY2xhc3MgVmFsaWRhdG9yTGlzdFBhZ2UgaW1wbGVtZW50cyBJVmFsaWRhdGlvblBhZ2UgeworCQlwcml2YXRlIENvbXBvc2l0ZSBfcGFnZTsKKwkJcHJpdmF0ZSBUYWJsZVZpZXdlciBfdmFsaWRhdG9yTGlzdDsKKwkJcHJpdmF0ZSBCdXR0b24gX2VuYWJsZUFsbEJ1dHRvbjsKKwkJcHJpdmF0ZSBCdXR0b24gX2Rpc2FibGVBbGxCdXR0b247CisJCXByaXZhdGUgQnV0dG9uIF9vdmVycmlkZTsKKwkJcHJpdmF0ZSBCdXR0b24gX3N1c3BlbmQ7CisJCXByaXZhdGUgQnV0dG9uIF9hdXRvU2F2ZTsKKwkJcHJpdmF0ZSBCdXR0b24gX2NvbmZpcm1CdXR0b247CisJCXByaXZhdGUgTGFiZWwgX2xpc3RMYWJlbDsKKwkJcHJpdmF0ZSBUYWJsZSBfdmFsaWRhdG9yc1RhYmxlOworCQlwcml2YXRlIEdsb2JhbFByZWZlcmVuY2VzVmFsdWVzIAlfZ2xvYmFsUHJlZmVyZW5jZXMgPSBWYWxNYW5hZ2VyLmdldERlZmF1bHQoKS5nZXRHbG9iYWxQcmVmZXJlbmNlcygpLmFzVmFsdWVzKCk7CisJCXByaXZhdGUgR2xvYmFsQ29uZmlndXJhdGlvbiBfZ2xvYmFsQ29uZmlnOworCQlwcml2YXRlIFZhbGlkYXRvck11dGFibGVbXSBfdmFsaWRhdG9yczsKKwkJCisJCXByaXZhdGUgaW50IF9jaGFuZ2VDb3VudDsKKworCQkvKioKKwkJICogVGhpcyBjbGFzcyBpcyBwcm92aWRlZCBmb3IgdGhlIENoZWNrYm94VGFibGVWaWV3ZXIgaW4gdGhlCisJCSAqIFZhbGlkYXRpb25Qcm9wZXJ0aWVzUGFnZSRWYWxpZGF0b3JMaXN0UGFnZSBjbGFzcy4KKwkJICovCisJCXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgeworCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJCX0KKworCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKKwkJCQlpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgVmFsaWRhdG9yTXV0YWJsZVtdKSB7CisJCQkJCXJldHVybiAoVmFsaWRhdG9yTXV0YWJsZVtdKSBpbnB1dEVsZW1lbnQ7CisJCQkJfQorCQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOworCQkJfQorCisJCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKKwkJCX0KKwkJfQorCisJCS8qKgorCQkgKiBUaGlzIGNsYXNzIGlzIHByb3ZpZGVkIGZvcgorCQkgKiBWYWxpZGF0aW9uUHJvcGVydGllc1BhZ2UkVmFsaWRhdG9yTGlzdFBhZ2UncyBjaGVja2JveFRhYmxlVmlld2VyIGVsZW1lbnQuCisJCSAqLworCQlwdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7CisJCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKKwkJCQlpZiAoZWxlbWVudCA9PSBudWxsKXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAorCQkJCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWYWxpZGF0b3JNdXRhYmxlKQorCQkJCQlyZXR1cm4gKChWYWxpZGF0b3JNdXRhYmxlKSBlbGVtZW50KS5nZXROYW1lKCk7CisJCQkJZWxzZQorCQkJCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKKwkJCX0KKworCQkJcHJpdmF0ZSBJbWFnZSBnZXRJbWFnZShTdHJpbmcgaW1hZ2VOYW1lKSB7CisJCQkJYm9vbGVhbiBpc0Rpc2FibGVkID0gIV92YWxpZGF0b3JzVGFibGUuaXNFbmFibGVkKCk7CisJCQkJaWYgKGlzRGlzYWJsZWQpaW1hZ2VOYW1lID0gaW1hZ2VOYW1lICsgSW1hZ2VOYW1lcy5kaXNhYmxlZDsKKworCQkJCXJldHVybiBWYWxpZGF0aW9uVUlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoaW1hZ2VOYW1lKTsKKwkJCX0KKworCQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKKwkJCQlWYWxpZGF0b3JNdXRhYmxlIHYgPSAoVmFsaWRhdG9yTXV0YWJsZSkgZWxlbWVudDsKKwkJCQlpZiAoY29sdW1uSW5kZXggPT0gMSkgeworCQkJCQlyZXR1cm4gZ2V0SW1hZ2Uodi5pc01hbnVhbFZhbGlkYXRpb24oKSA/IEltYWdlTmFtZXMub2tUYWJsZSA6IEltYWdlTmFtZXMuZmFpbFRhYmxlKTsKKwkJCQl9IGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDIpIHsKKwkJCQkJcmV0dXJuIGdldEltYWdlKHYuaXNCdWlsZFZhbGlkYXRpb24oKSA/IEltYWdlTmFtZXMub2tUYWJsZSA6IEltYWdlTmFtZXMuZmFpbFRhYmxlKTsKKwkJCQl9IGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDMpIHsKKwkJCQkJaWYgKGhhc1NldHRpbmdzKHYpKXJldHVybiBnZXRJbWFnZShJbWFnZU5hbWVzLnNldHRpbmdzKTsKKwkJCQkJcmV0dXJuICBudWxsOworCisJCQkJfQorCQkJCXJldHVybiBudWxsOworCQkJfQorCisJCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgeworCQkJCWlmIChjb2x1bW5JbmRleCA9PSAwKXJldHVybiAoKFZhbGlkYXRvck11dGFibGUpIGVsZW1lbnQpLmdldE5hbWUoKTsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJfQorCisJCS8qKgorCQkgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gc29ydCB0aGUgQ2hlY2tib3hUYWJsZVZpZXdlciBlbGVtZW50cy4KKwkJICovCisJCXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uVmlld2VyU29ydGVyIGV4dGVuZHMgVmlld2VyU29ydGVyIHsKKwkJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgeworCQkJCS8vIENhbid0IGluc3RhbnRpYXRlIFZpZXdlclNvcnRlciBiZWNhdXNlIGl0J3MgYWJzdHJhY3QsIHNvIHVzZSB0aGlzCisJCQkJLy8gaW5uZXIgY2xhc3MgdG8gcmVwcmVzZW50IGl0LgorCQkJCXJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgZTEsIGUyKTsKKwkJCX0KKwkJfQorCisJCXB1YmxpYyBWYWxpZGF0b3JMaXN0UGFnZShDb21wb3NpdGUgcGFyZW50KSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7CisJCQlfcGFnZSA9IGNyZWF0ZVBhZ2UocGFyZW50KTsKKwkJfQorCisJCXByaXZhdGUgdm9pZCBzZXR1cFRhYmxlQ29sdW1ucyhUYWJsZSB0YWJsZSkgeworCQkJVGFibGVDb2x1bW4gdmFsaWRhdG9yQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7CisJCQl2YWxpZGF0b3JDb2x1bW4uc2V0VGV4dChWYWxVSU1lc3NhZ2VzLlZBTElEQVRPUik7CisJCQl2YWxpZGF0b3JDb2x1bW4uc2V0V2lkdGgoMjQ1KTsKKwkJCVRhYmxlQ29sdW1uIG1hbnVhbENvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkNFTlRFUik7CisJCQltYW51YWxDb2x1bW4uc2V0VGV4dChWYWxVSU1lc3NhZ2VzLk1BTlVBTCk7CisJCQltYW51YWxDb2x1bW4ucGFjaygpOworCQkJVGFibGVDb2x1bW4gYnVpbGRDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5DRU5URVIpOworCQkJYnVpbGRDb2x1bW4uc2V0VGV4dChWYWxVSU1lc3NhZ2VzLkJVSUxEKTsKKwkJCWJ1aWxkQ29sdW1uLnBhY2soKTsKKwkJCVRhYmxlQ29sdW1uIHNldHRpbmdzQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuQ0VOVEVSKTsKKwkJCXNldHRpbmdzQ29sdW1uLnNldFRleHQoVmFsVUlNZXNzYWdlcy5TRVRUSU5HUyk7CisJCQlzZXR0aW5nc0NvbHVtbi5wYWNrKCk7CisJCX0KKwkJCisJCXByaXZhdGUgVmFsaWRhdG9yTXV0YWJsZVtdIGdldERlZmF1bHRWYWxpZGF0b3JzKCl7CisJCQlWYWxpZGF0b3JbXSB2YWxzID0gVmFsTWFuYWdlci5nZXREZWZhdWx0KCkuZ2V0VmFsaWRhdG9ycygpOworCQkJVmFsaWRhdG9yTXV0YWJsZVtdIHZtcyA9IG5ldyBWYWxpZGF0b3JNdXRhYmxlW3ZhbHMubGVuZ3RoXTsKKwkJCWZvciAoaW50IGk9MDsgaTx2YWxzLmxlbmd0aDsgaSsrKXZtc1tpXSA9IG5ldyBWYWxpZGF0b3JNdXRhYmxlKHZhbHNbaV0pOworCQkJcmV0dXJuIHZtczsKKwkJfQorCisJCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlUGFnZShDb21wb3NpdGUgcGFyZW50KSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7CisJCQlfZ2xvYmFsQ29uZmlnID0gbmV3IEdsb2JhbENvbmZpZ3VyYXRpb24oQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKSk7CisJCQlfdmFsaWRhdG9ycyA9IGdldERlZmF1bHRWYWxpZGF0b3JzKCk7CisJCQkKKwkJCUNvbXBvc2l0ZSB2YWxpZGF0b3JHcm91cCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7CisKKwkJCUdyaWRMYXlvdXQgdmFsaWRhdG9yR3JvdXBMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQkJdmFsaWRhdG9yR3JvdXBMYXlvdXQubnVtQ29sdW1ucyA9IDI7CisJCQl2YWxpZGF0b3JHcm91cC5zZXRMYXlvdXQodmFsaWRhdG9yR3JvdXBMYXlvdXQpOworCQkJR3JpZERhdGFGYWN0b3J5LmZpbGxEZWZhdWx0cygpLmdyYWIodHJ1ZSwgdHJ1ZSkuYXBwbHlUbyh2YWxpZGF0b3JHcm91cCk7CisJCQkKKwkJCW5ldyBMYWJlbCh2YWxpZGF0b3JHcm91cCwgU1dULk5PTkUpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOworCisJCQlhZGRPdmVycmlkZSh2YWxpZGF0b3JHcm91cCk7CisJCQlhZGRTdXNwZW5kKHZhbGlkYXRvckdyb3VwKTsKKwkJCWFkZEF1dG9TYXZlKHZhbGlkYXRvckdyb3VwKTsKKwkJCWFkZENvbmZpcm0odmFsaWRhdG9yR3JvdXApOworCisJCQlfbGlzdExhYmVsID0gbmV3IExhYmVsKHZhbGlkYXRvckdyb3VwLCBTV1QuTk9ORSk7CisJCQlHcmlkRGF0YSBsaXN0TGFiZWxEYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CisJCQlsaXN0TGFiZWxEYXRhLmhvcml6b250YWxTcGFuID0gMjsKKwkJCV9saXN0TGFiZWwuc2V0TGF5b3V0RGF0YShsaXN0TGFiZWxEYXRhKTsKKwkJCV9saXN0TGFiZWwuc2V0VGV4dChWYWxVSU1lc3NhZ2VzLlBSRUZfVkFMTElTVF9USVRMRSk7CisJCQkKKwkJCV92YWxpZGF0b3JzVGFibGUgPSBuZXcgVGFibGUodmFsaWRhdG9yR3JvdXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKKwkJCVBvaW50IHByZWZlcnJlZFNpemUgPSBfdmFsaWRhdG9yc1RhYmxlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7CisJCQlHcmlkRGF0YUZhY3RvcnkuZmlsbERlZmF1bHRzKCkuZ3JhYih0cnVlLCB0cnVlKS5oaW50KHByZWZlcnJlZFNpemUpCisJCQkJLnNwYW4oMiwxKS5hcHBseVRvKF92YWxpZGF0b3JzVGFibGUpOworCQkJCQkJCisKKwkJCV92YWxpZGF0b3JzVGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKKwkJCV92YWxpZGF0b3JzVGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOworCisJCQlfdmFsaWRhdG9yTGlzdCA9IG5ldyBUYWJsZVZpZXdlcihfdmFsaWRhdG9yc1RhYmxlKTsJCQkKKy8vCQkJX3ZhbGlkYXRvcnNUYWJsZS5zZXRMYXlvdXREYXRhKHZhbGlkYXRvckxpc3REYXRhKTsKKy8vCQkJX3ZhbGlkYXRvckxpc3QuZ2V0VGFibGUoKS5zZXRMYXlvdXREYXRhKHZhbGlkYXRvckxpc3REYXRhKTsKKwkJCV92YWxpZGF0b3JMaXN0LnNldExhYmVsUHJvdmlkZXIobmV3IFZhbGlkYXRpb25MYWJlbFByb3ZpZGVyKCkpOworCQkJX3ZhbGlkYXRvckxpc3Quc2V0Q29udGVudFByb3ZpZGVyKG5ldyBWYWxpZGF0aW9uQ29udGVudFByb3ZpZGVyKCkpOworCQkJX3ZhbGlkYXRvckxpc3Quc2V0U29ydGVyKG5ldyBWYWxpZGF0aW9uVmlld2VyU29ydGVyKCkpOworCQkJc2V0dXBUYWJsZUNvbHVtbnMoX3ZhbGlkYXRvcnNUYWJsZSk7CisKKwkJCV92YWxpZGF0b3JMaXN0LnNldElucHV0KF92YWxpZGF0b3JzKTsKKwkJCV92YWxpZGF0b3JzVGFibGUuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgeworCisJCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgeworCQkJCQlpZiAoZS5idXR0b24gIT0gMSlyZXR1cm47CisKKwkJCQkJVGFibGVJdGVtIHRhYmxlSXRlbSA9IF92YWxpZGF0b3JzVGFibGUuZ2V0SXRlbShuZXcgUG9pbnQoZS54LCBlLnkpKTsKKwkJCQkJaWYgKHRhYmxlSXRlbSA9PSBudWxsIHx8IHRhYmxlSXRlbS5pc0Rpc3Bvc2VkKCkpcmV0dXJuOworCQkJCQlpbnQgY29sdW1uTnVtYmVyOworCQkJCQlpbnQgY29sdW1uc0NvdW50ID0gX3ZhbGlkYXRvcnNUYWJsZS5nZXRDb2x1bW5Db3VudCgpOworCQkJCQlpZiAoY29sdW1uc0NvdW50ID09IDApIHsKKwkJCQkJCS8vIElmIG5vIFRhYmxlQ29sdW1uLCBUYWJsZSBhY3RzIGFzIGlmIGl0IGhhcyBhIHNpbmdsZQorCQkJCQkJLy8gY29sdW1uIHdoaWNoIHRha2VzIHRoZSB3aG9sZSB3aWR0aC4KKwkJCQkJCWNvbHVtbk51bWJlciA9IDA7CisJCQkJCX0gZWxzZSB7CisJCQkJCQljb2x1bW5OdW1iZXIgPSAtMTsKKwkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uc0NvdW50OyBpKyspIHsKKwkJCQkJCQlSZWN0YW5nbGUgYm91bmRzID0gdGFibGVJdGVtLmdldEJvdW5kcyhpKTsKKwkJCQkJCQlpZiAoYm91bmRzLmNvbnRhaW5zKGUueCwgZS55KSkgeworCQkJCQkJCQljb2x1bW5OdW1iZXIgPSBpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlpZiAoY29sdW1uTnVtYmVyID09IC0xKXJldHVybjsKKwkJCQkJfQorCisJCQkJCWNvbHVtbkNsaWNrZWQoY29sdW1uTnVtYmVyKTsKKwkJCQl9CisJCQl9KTsKKworCQkJX3ZhbGlkYXRvcnNUYWJsZS5zZXRNZW51KGNyZWF0ZUNvbnRleHRNZW51KCkpOworCQkJX3ZhbGlkYXRvcnNUYWJsZS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7CisKKwkJCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKKwkJCQkJc3VwZXIuZm9jdXNHYWluZWQoZSk7CisJCQkJCWlmIChfdmFsaWRhdG9yc1RhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkgPT0gMCkgeworCQkJCQkJX3ZhbGlkYXRvcnNUYWJsZS5zZWxlY3QoMCk7CisJCQkJCX0KKwkJCQl9CisJCQl9KTsKKworCQkJYWRkRW5hYmxlRGlzYWJsZSh2YWxpZGF0b3JHcm91cCk7CisKKwkJCS8vIEhhdmUgdG8gc2V0IHRoZSB0YWIgb3JkZXIgb3Igb25seSB0aGUgZmlyc3QgY2hlY2tib3ggaW4gYQorCQkJLy8gQ29tcG9zaXRlIGNhbiBiZSB0YWJiZWQgdG8uIChTZWVtcyB0byBhcHBseSBvbmx5IHRvIGNoZWNrYm94ZXMuIEhhdmUgdG8gdXNlIHRoZQorCQkJLy8gYXJyb3cga2V5IHRvIG5hdmlnYXRlIHRoZSBjaGVja2JveGVzLikKKwkJCXZhbGlkYXRvckdyb3VwLnNldFRhYkxpc3QobmV3IENvbnRyb2xbXSB7IF9zdXNwZW5kLCBfYXV0b1NhdmUsCisJCQkJX3ZhbGlkYXRvcnNUYWJsZSwgX2VuYWJsZUFsbEJ1dHRvbiwgX2Rpc2FibGVBbGxCdXR0b24gfSk7CisKKwkJCXVwZGF0ZVdpZGdldHMoKTsKKworCQkJYXBwbHlEaWFsb2dGb250KHZhbGlkYXRvckdyb3VwKTsKKwkJCXZhbGlkYXRvckdyb3VwLnNldFNpemUodmFsaWRhdG9yR3JvdXAuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKSk7CisJCQlyZXR1cm4gdmFsaWRhdG9yR3JvdXA7CisJCX0KKworCQlwcml2YXRlIHZvaWQgYWRkRW5hYmxlRGlzYWJsZShDb21wb3NpdGUgdmFsaWRhdG9yR3JvdXApIHsKKwkJCV9lbmFibGVBbGxCdXR0b24gPSBuZXcgQnV0dG9uKHZhbGlkYXRvckdyb3VwLCBTV1QuUFVTSCk7CisJCQlfZW5hYmxlQWxsQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOworCQkJX2VuYWJsZUFsbEJ1dHRvbi5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuUFJFRl9CVVRUT05fRU5BQkxFQUxMKTsKKwkJCV9lbmFibGVBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCQl0cnkgeworCQkJCQkJcGVyZm9ybUVuYWJsZUFsbCgpOworCQkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgeworCQkJCQkJZGlzcGxheUFuZExvZ0Vycm9yKFZhbFVJTWVzc2FnZXMuVkJGX0VYQ19JTlRFUk5BTF9USVRMRSwKKwkJCQkJCQlWYWxVSU1lc3NhZ2VzLlZCRl9FWENfSU5URVJOQUxfUEFHRSwgZXhjKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0pOworCisJCQlfZGlzYWJsZUFsbEJ1dHRvbiA9IG5ldyBCdXR0b24odmFsaWRhdG9yR3JvdXAsIFNXVC5QVVNIKTsKKwkJCV9kaXNhYmxlQWxsQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOworCQkJX2Rpc2FibGVBbGxCdXR0b24uc2V0VGV4dChWYWxVSU1lc3NhZ2VzLlBSRUZfQlVUVE9OX0RJU0FCTEVBTEwpOworCQkJX2Rpc2FibGVBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCQl0cnkgeworCQkJCQkJcGVyZm9ybURpc2FibGVBbGwoKTsKKwkJCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKKwkJCQkJCWRpc3BsYXlBbmRMb2dFcnJvcihWYWxVSU1lc3NhZ2VzLlZCRl9FWENfSU5URVJOQUxfVElUTEUsCisJCQkJCQkJVmFsVUlNZXNzYWdlcy5WQkZfRVhDX0lOVEVSTkFMX1BBR0UsIGV4Yyk7CisJCQkJCX0KKwkJCQl9CisJCQl9KTsKKwkJfQorCQkKKwkJcHJpdmF0ZSB2b2lkIGFkZENvbmZpcm0oQ29tcG9zaXRlIHZhbGlkYXRvckdyb3VwKSB7CisJCQlHcmlkRGF0YSBnZDsKKwkJCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CisJCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7CisJCQlfY29uZmlybUJ1dHRvbiA9IG5ldyBCdXR0b24odmFsaWRhdG9yR3JvdXAsIFNXVC5DSEVDSyk7CisJCQlfY29uZmlybUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKKwkJCV9jb25maXJtQnV0dG9uLnNldFRleHQoVmFsVUlNZXNzYWdlcy5QcmVmUGFnZUNvbmZpcm1EaWFsb2cpOworCQkJX2NvbmZpcm1CdXR0b24uc2V0U2VsZWN0aW9uKF9nbG9iYWxQcmVmZXJlbmNlcy5jb25maXJtRGlhbG9nKTsKKwkJCV9jb25maXJtQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQkJLy8gZG8gbm90IGluY3JlbWVudCB0aGUgX2NoYW5nZUNvdW50IGFzIHRoaXMgYnkgaXRzZWxmIHNob3VsZCBub3QgdHJpZ2dlciBhIGJ1aWxkIHByb21wdAorCQkJCQlfZ2xvYmFsUHJlZmVyZW5jZXMuY29uZmlybURpYWxvZyA9IF9jb25maXJtQnV0dG9uLmdldFNlbGVjdGlvbigpOworCQkJCQlfY29uZmlybUJ1dHRvbi5zZXRGb2N1cygpOworCQkJCX0KKwkJCX0pOworCQl9CisKKwkJcHJpdmF0ZSB2b2lkIGFkZEF1dG9TYXZlKENvbXBvc2l0ZSB2YWxpZGF0b3JHcm91cCkgeworCQkJR3JpZERhdGEgZ2Q7CisJCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOworCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOworCQkJX2F1dG9TYXZlID0gbmV3IEJ1dHRvbih2YWxpZGF0b3JHcm91cCwgU1dULkNIRUNLKTsKKwkJCV9hdXRvU2F2ZS5zZXRMYXlvdXREYXRhKGdkKTsKKwkJCV9hdXRvU2F2ZS5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuUHJlZlBhZ2VfYWx3YXlzX3NhdmUpOworCQkJX2F1dG9TYXZlLnNldFNlbGVjdGlvbihfZ2xvYmFsUHJlZmVyZW5jZXMuc2F2ZUF1dG9tYXRpY2FsbHkpOworCQkJX2F1dG9TYXZlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQkJLy8gZG8gbm90IGluY3JlbWVudCB0aGUgX2NoYW5nZUNvdW50IGFzIHRoaXMgYnkgaXRzZWxmIHNob3VsZCBub3QgdHJpZ2dlciBhIGJ1aWxkIHByb21wdAorCQkJCQlfZ2xvYmFsUHJlZmVyZW5jZXMuc2F2ZUF1dG9tYXRpY2FsbHkgPSBfYXV0b1NhdmUuZ2V0U2VsZWN0aW9uKCk7CisJCQkJCV9hdXRvU2F2ZS5zZXRGb2N1cygpOworCQkJCX0KKwkJCX0pOworCQl9CisKKwkJcHJpdmF0ZSB2b2lkIGFkZFN1c3BlbmQoQ29tcG9zaXRlIHZhbGlkYXRvckdyb3VwKSB7CisJCQlHcmlkRGF0YSBnZDsKKwkJCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CisJCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7CisJCQkKKwkJCV9zdXNwZW5kID0gbmV3IEJ1dHRvbih2YWxpZGF0b3JHcm91cCwgU1dULkNIRUNLKTsKKwkJCV9zdXNwZW5kLnNldExheW91dERhdGEoZ2QpOworCQkJX3N1c3BlbmQuc2V0VGV4dChWYWxVSU1lc3NhZ2VzLkRJU0FCTEVfVkFMSURBVElPTik7CisJCQlfc3VzcGVuZC5zZXRTZWxlY3Rpb24oX2dsb2JhbFByZWZlcmVuY2VzLmRpc2FibGVBbGxWYWxpZGF0aW9uKTsKKwkJCV9zdXNwZW5kLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQkJX3N1c3BlbmQuc2V0Rm9jdXMoKTsKKwkJCQkJX3ZhbGlkYXRvcnNUYWJsZS5zZXRFbmFibGVkKCFfc3VzcGVuZC5nZXRTZWxlY3Rpb24oKSk7CisJCQkJCV9lbmFibGVBbGxCdXR0b24uc2V0RW5hYmxlZCghX3N1c3BlbmQuZ2V0U2VsZWN0aW9uKCkpOworCQkJCQlfZGlzYWJsZUFsbEJ1dHRvbi5zZXRFbmFibGVkKCFfc3VzcGVuZC5nZXRTZWxlY3Rpb24oKSk7CisJCQkJCV92YWxpZGF0b3JMaXN0LnJlZnJlc2goKTsKKwkJCQl9CisJCQl9KTsKKwkJfQorCisJCXByaXZhdGUgdm9pZCBhZGRPdmVycmlkZShDb21wb3NpdGUgdmFsaWRhdG9yR3JvdXApIHsKKwkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CisJCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7CisJCQkKKwkJCV9vdmVycmlkZSA9IG5ldyBCdXR0b24odmFsaWRhdG9yR3JvdXAsIFNXVC5DSEVDSyk7CisJCQlfb3ZlcnJpZGUuc2V0TGF5b3V0RGF0YShnZCk7CisJCQlfb3ZlcnJpZGUuc2V0VGV4dChWYWxVSU1lc3NhZ2VzLlBSRUZfQlVUVE9OX09WRVJSSURFKTsKKwkJCV9vdmVycmlkZS5zZXRFbmFibGVkKHRydWUpOworCQkJX292ZXJyaWRlLnNldFNlbGVjdGlvbihfZ2xvYmFsUHJlZmVyZW5jZXMub3ZlcnJpZGUpOworCQkJX292ZXJyaWRlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQkJX2dsb2JhbFByZWZlcmVuY2VzLm92ZXJyaWRlID0gX292ZXJyaWRlLmdldFNlbGVjdGlvbigpOworCQkJCQlfb3ZlcnJpZGUuc2V0Rm9jdXMoKTsKKwkJCQkJCisJCQkJfQorCQkJfSk7CisJCX0KKworCQlwcm90ZWN0ZWQgTWVudSBjcmVhdGVDb250ZXh0TWVudSgpIHsKKwkJCWZpbmFsIE1lbnUgbWVudSA9IG5ldyBNZW51KF92YWxpZGF0b3JzVGFibGUuZ2V0U2hlbGwoKSwgU1dULlBPUF9VUCk7CisJCQlmaW5hbCBNZW51SXRlbSBtYW51YWxJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5DSEVDSyk7CisJCQltYW51YWxJdGVtLnNldFRleHQoVmFsVUlNZXNzYWdlcy5QUkVGX01OVV9NQU5VQUwpOworCQkJZmluYWwgTWVudUl0ZW0gYnVpbGRJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5DSEVDSyk7CisJCQlidWlsZEl0ZW0uc2V0VGV4dChWYWxVSU1lc3NhZ2VzLlBSRUZfTU5VX0JVSUxEKTsKKwkJCWZpbmFsIE1lbnVJdGVtIHNldHRpbmdzSXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuUFVTSCk7CisJCQlzZXR0aW5nc0l0ZW0uc2V0VGV4dChWYWxVSU1lc3NhZ2VzLlBSRUZfTU5VX1NFVFRJTkdTKTsKKworCQkJY2xhc3MgTWVudUl0ZW1MaXN0ZW5lciBleHRlbmRzIFNlbGVjdGlvbkFkYXB0ZXIgeworCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQkJTWVudUl0ZW0gbWVudUl0ZW0gPSAoTWVudUl0ZW0pIGUuZ2V0U291cmNlKCk7CisJCQkJCWludCBpbmRleCA9IG1lbnUuaW5kZXhPZihtZW51SXRlbSkgKyAxOworCQkJCQljb2x1bW5DbGlja2VkKGluZGV4KTsKKwkJCQl9CisJCQl9CisJCQlNZW51SXRlbUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE1lbnVJdGVtTGlzdGVuZXIoKTsKKwkJCW1hbnVhbEl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOworCQkJYnVpbGRJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKKwkJCXNldHRpbmdzSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisKKwkJCW1lbnUuYWRkTWVudUxpc3RlbmVyKG5ldyBNZW51QWRhcHRlcigpIHsKKwkJCQlwdWJsaWMgdm9pZCBtZW51U2hvd24oTWVudUV2ZW50IGUpIHsKKwkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBfdmFsaWRhdG9yTGlzdC5nZXRTZWxlY3Rpb24oKTsKKwkJCQkJVmFsaWRhdG9yTXV0YWJsZSB2dyA9IChWYWxpZGF0b3JNdXRhYmxlKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7CisJCQkJCW1hbnVhbEl0ZW0uc2V0U2VsZWN0aW9uKHZ3LmlzTWFudWFsVmFsaWRhdGlvbigpKTsKKwkJCQkJYnVpbGRJdGVtLnNldFNlbGVjdGlvbih2dy5pc0J1aWxkVmFsaWRhdGlvbigpKTsKKwkJCQkJc2V0dGluZ3NJdGVtLnNldEVuYWJsZWQoaGFzU2V0dGluZ3ModncpKTsKKwkJCQl9CisJCQl9KTsKKworCQkJcmV0dXJuIG1lbnU7CisJCX0KKworCQlwcm90ZWN0ZWQgdm9pZCBjb2x1bW5DbGlja2VkKGludCBjb2x1bW5Ub0VkaXQpIHsKKwkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgX3ZhbGlkYXRvckxpc3QuZ2V0U2VsZWN0aW9uKCk7CisJCQlWYWxpZGF0b3JNdXRhYmxlIHZhbCA9IChWYWxpZGF0b3JNdXRhYmxlKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7CisKKwkJCXN3aXRjaCAoY29sdW1uVG9FZGl0KSB7CisJCQljYXNlIDE6CisJCQkJX2NoYW5nZUNvdW50Kys7CisJCQkJdmFsLnNldE1hbnVhbFZhbGlkYXRpb24oIXZhbC5pc01hbnVhbFZhbGlkYXRpb24oKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJX2NoYW5nZUNvdW50Kys7CisJCQkJdmFsLnNldEJ1aWxkVmFsaWRhdGlvbighdmFsLmlzQnVpbGRWYWxpZGF0aW9uKCkpOworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCWlmICh2YWwuaXNWMlZhbGlkYXRvcigpKXsKKwkJCQkJVmFsaWRhdG9yTXV0YWJsZSBuZXdWYWwgPSBuZXcgVmFsaWRhdG9yTXV0YWJsZSh2YWwpOworCQkJCQlGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgRmlsdGVyRGlhbG9nKF9zaGVsbCwgbmV3VmFsLCBudWxsKTsKKwkJCQkJaWYgKFdpbmRvdy5PSyA9PSBmZC5vcGVuKCkpeworCQkJCQkJX2NoYW5nZUNvdW50Kys7CisJCQkJCQluZXdWYWwgPSBmZC5nZXRWYWxpZGF0b3IoKTsKKwkJCQkJCWludCBpID0gZmluZGl0KHZhbCk7CisJCQkJCQlpZiAoaSAhPSAtMSlfdmFsaWRhdG9yc1tpXSA9IG5ld1ZhbDsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJaGFuZGxlT2xkRGVsZWdhdGUodmFsKTsKKwkJCQl9CisKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCQlfdmFsaWRhdG9yTGlzdC5yZWZyZXNoKCk7CisJCX0KKworCQlwcml2YXRlIGludCBmaW5kaXQoVmFsaWRhdG9yTXV0YWJsZSB2YWwpIHsKKwkJCWZvciAoaW50IGk9MDsgaTxfdmFsaWRhdG9ycy5sZW5ndGg7IGkrKylpZiAoX3ZhbGlkYXRvcnNbaV0gPT0gdmFsKXJldHVybiBpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJcHJpdmF0ZSB2b2lkIGhhbmRsZU9sZERlbGVnYXRlKFZhbGlkYXRvck11dGFibGUgdmFsKSB7CisJCQlpZiAoIXZhbC5pc1YxVmFsaWRhdG9yKCkpcmV0dXJuOworCQkJCisJCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSB2YWwuZ2V0Vm1kKCk7CisJCSAgICBpZiAoIXZtZC5pc0RlbGVnYXRpbmcoKSlyZXR1cm47CisJCSAgICAKKwkJICAgIFN0cmluZyBkZWxlZ2F0ZUlEID0gX2dsb2JhbENvbmZpZy5nZXREZWxlZ2F0ZVVuaXF1ZU5hbWUodm1kKTsKKwkJICAgIFNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKKwkJICAgIERlbGVnYXRpbmdWYWxpZGF0b3JQcmVmZXJlbmNlc0RpYWxvZyBkaWFsb2cgPSAKKwkJICAgIAluZXcgRGVsZWdhdGluZ1ZhbGlkYXRvclByZWZlcmVuY2VzRGlhbG9nKHNoZWxsLCB2bWQsIGRlbGVnYXRlSUQpOworCQkKKwkJICAgIGRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKKwkJICAgIGRpYWxvZy5jcmVhdGUoKTsKKwkJCisJCSAgICBpbnQgcmVzdWx0ID0gZGlhbG9nLm9wZW4oKTsKKwkgICAgICAgIGlmIChyZXN1bHQgPT0gV2luZG93Lk9LKXsKKwkgICAgICAgIAlfY2hhbmdlQ291bnQrKzsKKwkgICAgICAgIAlfZ2xvYmFsQ29uZmlnLnNldERlbGVnYXRlVW5pcXVlTmFtZSh2bWQsIGRpYWxvZy5nZXREZWxlZ2F0ZUlEKCkpOworCSAgICAgICAgfQorCQl9CisJCQorCQkvKioKKwkJICogRG9lcyB0aGlzIHZhbGlkYXRvciBoYXZlIGV4dHJhIHNldHRpbmdzIHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQ/CisJCSAqIEBwYXJhbSB2CisJCSAqIEByZXR1cm4gdHJ1ZSBpZiBpdCBkb2VzCisJCSAqLworCQlib29sZWFuIGhhc1NldHRpbmdzKFZhbGlkYXRvck11dGFibGUgdil7CisJCQlpZiAodi5pc1YyVmFsaWRhdG9yKCkpcmV0dXJuIHRydWU7CisJCQlpZiAodi5nZXREZWxlZ2F0aW5nSWQoKSAhPSBudWxsKXJldHVybiB0cnVlOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJcHJvdGVjdGVkIHZvaWQgdXBkYXRlV2lkZ2V0cygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKKwkJCS8vIE5lZWQgdG8gdXBkYXRlIGV2ZW4gdGhlIHdpZGdldHMgdGhhdCBkbyBub3QgY2hhbmdlIGJhc2VkIG9uIGFub3RoZXIKKwkJCS8vIHdpZGdldHMgYmVjYXVzZSBvZiBwZXJmb3JtRGVmYXVsdHMoKS4gSWYgcGVyZm9ybURlZmF1bHRzKCkgaXMKKwkJCS8vIHNlbGVjdGVkLCB0aGVuIHRoZSBwYWdlUHJlZmVyZW5jZXMgdmFsdWVzIGFyZSByZXNldCwgYW5kIHRoZXNlIHdpZGdldHMKKwkJCS8vIG1pZ2h0IGFsc28gbmVlZCB0byBiZSB1cGRhdGVkLgorCQkJdXBkYXRlQWxsV2lkZ2V0cygpOworCQkJdXBkYXRlSGVscCgpOworCQl9CisKKwkJcHJpdmF0ZSB2b2lkIHVwZGF0ZUFsbFdpZGdldHMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7CisJCQlfc3VzcGVuZC5zZXRTZWxlY3Rpb24oX2dsb2JhbFByZWZlcmVuY2VzLmRpc2FibGVBbGxWYWxpZGF0aW9uKTsKKwkJCV9hdXRvU2F2ZS5zZXRTZWxlY3Rpb24oX2dsb2JhbFByZWZlcmVuY2VzLnNhdmVBdXRvbWF0aWNhbGx5KTsKKwkJCV9jb25maXJtQnV0dG9uLnNldFNlbGVjdGlvbihfZ2xvYmFsUHJlZmVyZW5jZXMuY29uZmlybURpYWxvZyk7CisJCQlfb3ZlcnJpZGUuc2V0U2VsZWN0aW9uKF9nbG9iYWxQcmVmZXJlbmNlcy5vdmVycmlkZSk7CisJCQlfdmFsaWRhdG9yc1RhYmxlLnNldEVuYWJsZWQoIV9zdXNwZW5kLmdldFNlbGVjdGlvbigpKTsKKwkJCV9lbmFibGVBbGxCdXR0b24uc2V0RW5hYmxlZCghX3N1c3BlbmQuZ2V0U2VsZWN0aW9uKCkpOworCQkJX2Rpc2FibGVBbGxCdXR0b24uc2V0RW5hYmxlZCghX3N1c3BlbmQuZ2V0U2VsZWN0aW9uKCkpOworCQkJX3ZhbGlkYXRvckxpc3Quc2V0SW5wdXQoX3ZhbGlkYXRvcnMpOworCQkJX3ZhbGlkYXRvckxpc3QucmVmcmVzaCgpOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24geworCQkJX2dsb2JhbFByZWZlcmVuY2VzLmRpc2FibGVBbGxWYWxpZGF0aW9uID0gX3N1c3BlbmQuZ2V0U2VsZWN0aW9uKCk7CisJCQlfZ2xvYmFsUHJlZmVyZW5jZXMuc2F2ZUF1dG9tYXRpY2FsbHkgPSBfYXV0b1NhdmUuZ2V0U2VsZWN0aW9uKCk7CisJCQlWYWxNYW5hZ2VyIHZtID0gVmFsTWFuYWdlci5nZXREZWZhdWx0KCk7CisJCQlpbnQgY2hhbmdlcyA9IHZtLnJlcGxhY2UoX2dsb2JhbFByZWZlcmVuY2VzKTsKKwkJCWlmICgoY2hhbmdlcyAmIEdsb2JhbFByZWZlcmVuY2VzLkJ1aWxkQ2hhbmdlTWFzaykgIT0gMClfY2hhbmdlQ291bnQrKzsKKwkJCQorCQkJVmFsUHJlZk1hbmFnZXJHbG9iYWwgdnBtID0gVmFsUHJlZk1hbmFnZXJHbG9iYWwuZ2V0RGVmYXVsdCgpOworCQkJdnBtLnNhdmVQcmVmZXJlbmNlcyh2bS5nZXRHbG9iYWxQcmVmZXJlbmNlcygpLCBfdmFsaWRhdG9ycywgbnVsbCk7CisJCQlzYXZlVjFQcmVmZXJlbmNlcygpOworCQkJCisJCQlpZiAoX2NoYW5nZUNvdW50ID4gMCAmJiAKKwkJCQlNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihfc2hlbGwsIFZhbFVJTWVzc2FnZXMuUmVidWlsZFRpdGxlLCBWYWxVSU1lc3NhZ2VzLlJlYnVpbGRNc2cpKXsKKwkJCQkKKwkJCQlGdWxsQnVpbGRKb2IgZmJqID0gbmV3IEZ1bGxCdWlsZEpvYigpOworCQkJCWZiai5zY2hlZHVsZSgpOworCQkJfQorCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJCisJCS8qKgorCQkgKiBTYXZlIHRoZSBWMSBwcmVmZXJlbmNlcywgc28gdGhhdCB0aGUgb2xkIHZhbGlkYXRvcnMgY29udGludWUgdG8gd29yay4KKwkJICovCisJCXByaXZhdGUgdm9pZCBzYXZlVjFQcmVmZXJlbmNlcygpeworCQkJdHJ5IHsKKwkJCQlHbG9iYWxDb25maWd1cmF0aW9uIGdjID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKTsKKwkJCQlnYy5zZXREaXNhYmxlQWxsVmFsaWRhdGlvbihfZ2xvYmFsUHJlZmVyZW5jZXMuZGlzYWJsZUFsbFZhbGlkYXRpb24pOworCQkJCWdjLnNldEVuYWJsZWRNYW51YWxWYWxpZGF0b3JzKGdldEVuYWJsZWRNYW51YWxWYWxpZGF0b3JzKCkpOwkJCQkKKwkJCQlnYy5zZXRFbmFibGVkQnVpbGRWYWxpZGF0b3JzKGdldEVuYWJsZWRCdWlsZFZhbGlkYXRvcnMoKSk7CisJCisJCQkJZ2MucGFzc2l2YXRlKCk7CisJCQkJZ2Muc3RvcmUoKTsKKwkJCX0KKwkJCWNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpeworCQkJCVZhbGlkYXRpb25VSVBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZSk7CisJCQl9CQkJCisJCX0KKworCQkvKioKKwkJICogQW5zd2VyIGFsbCB0aGUgVjEgdmFsaWRhdG9ycyB0aGF0IGFyZSBtYW51YWxseSBlbmFibGVkLgorCQkgKiBAcmV0dXJuCisJCSAqLworCQlwcml2YXRlIFZhbGlkYXRvck1ldGFEYXRhW10gZ2V0RW5hYmxlZE1hbnVhbFZhbGlkYXRvcnMoKSB7CisJCQlMaXN0PFZhbGlkYXRvck1ldGFEYXRhPiBsaXN0ID0gbmV3IExpbmtlZExpc3Q8VmFsaWRhdG9yTWV0YURhdGE+KCk7CisJCQlmb3IgKFZhbGlkYXRvck11dGFibGUgdiA6IF92YWxpZGF0b3JzKXsKKwkJCQlpZiAodi5pc01hbnVhbFZhbGlkYXRpb24oKSAmJiB2LmlzVjFWYWxpZGF0b3IoKSlsaXN0LmFkZCh2LmdldFZtZCgpKTsKKwkJCX0KKwkJCVZhbGlkYXRvck1ldGFEYXRhW10gcmVzdWx0ID0gbmV3IFZhbGlkYXRvck1ldGFEYXRhW2xpc3Quc2l6ZSgpXTsKKwkJCWxpc3QudG9BcnJheShyZXN1bHQpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCisJCS8qKgorCQkgKiBBbnN3ZXIgYWxsIHRoZSBWMSB2YWxpZGF0b3JzIHRoYXQgYXJlIGVuYWJsZWQgZm9yIGJ1aWxkLgorCQkgKiBAcmV0dXJuCisJCSAqLworCQlwcml2YXRlIFZhbGlkYXRvck1ldGFEYXRhW10gZ2V0RW5hYmxlZEJ1aWxkVmFsaWRhdG9ycygpIHsKKwkJCUxpc3Q8VmFsaWRhdG9yTWV0YURhdGE+IGxpc3QgPSBuZXcgTGlua2VkTGlzdDxWYWxpZGF0b3JNZXRhRGF0YT4oKTsKKwkJCWZvciAoVmFsaWRhdG9yTXV0YWJsZSB2IDogX3ZhbGlkYXRvcnMpeworCQkJCWlmICh2LmlzQnVpbGRWYWxpZGF0aW9uKCkgJiYgdi5pc1YxVmFsaWRhdG9yKCkpbGlzdC5hZGQodi5nZXRWbWQoKSk7CisJCQl9CisJCQlWYWxpZGF0b3JNZXRhRGF0YVtdIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JNZXRhRGF0YVtsaXN0LnNpemUoKV07CisJCQlsaXN0LnRvQXJyYXkocmVzdWx0KTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRGVmYXVsdHMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7CisJCQlfY2hhbmdlQ291bnQrKzsKKwkJCVZhbGlkYXRvcltdIHZhbHMgPSBWYWxNYW5hZ2VyLmdldERlZmF1bHRWYWxpZGF0b3JzKCk7CisJCQlfdmFsaWRhdG9ycyA9IG5ldyBWYWxpZGF0b3JNdXRhYmxlW3ZhbHMubGVuZ3RoXTsKKwkJCWZvciAoaW50IGk9MDsgaTx2YWxzLmxlbmd0aDsgaSsrKV92YWxpZGF0b3JzW2ldID0gbmV3IFZhbGlkYXRvck11dGFibGUodmFsc1tpXSk7CisJCQl1cGRhdGVXaWRnZXRzKCk7CisJCQlnZXREZWZhdWx0c0J1dHRvbigpLnNldEZvY3VzKCk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIHBlcmZvcm1FbmFibGVBbGwoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7CisJCQlzZXRBbGxWYWxpZGF0b3JzKHRydWUpOworCQkJX2VuYWJsZUFsbEJ1dHRvbi5zZXRGb2N1cygpOworCQkJX3ZhbGlkYXRvckxpc3QucmVmcmVzaCgpOworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRGlzYWJsZUFsbCgpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKKwkJCXNldEFsbFZhbGlkYXRvcnMoZmFsc2UpOworCQkJX2Rpc2FibGVBbGxCdXR0b24uc2V0Rm9jdXMoKTsKKwkJCV92YWxpZGF0b3JMaXN0LnJlZnJlc2goKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCQorCQlwcml2YXRlIHZvaWQgc2V0QWxsVmFsaWRhdG9ycyhib29sZWFuIGJvb2wpeworCQkJX2NoYW5nZUNvdW50Kys7CisJCQlmb3IgKFZhbGlkYXRvck11dGFibGUgdiA6IF92YWxpZGF0b3JzKXsKKwkJCQl2LnNldEJ1aWxkVmFsaWRhdGlvbihib29sKTsKKwkJCQl2LnNldE1hbnVhbFZhbGlkYXRpb24oYm9vbCk7CisJCQl9CisJCX0KKworCQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVIZWxwKCkgeworLy8JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKF9zdXNwZW5kLCBDb250ZXh0SWRzLlZBTElEQVRJT05fUFJFRkVSRU5DRV9QQUdFX0RJU0FCTEVfQUxMX0VOQUJMRUQpOworCQl9CisKKwkJLyoKKwkJICogU3RvcmUgdGhlIGN1cnJlbnQgdmFsdWVzIG9mIHRoZSBjb250cm9scyBpbnRvIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgorCQkgKi8KKworCQlwdWJsaWMgQ29tcG9zaXRlIGdldENvbnRyb2woKSB7CisJCQlyZXR1cm4gX3BhZ2U7CisJCX0KKworCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQkJX2F1dG9TYXZlLmRpc3Bvc2UoKTsKKwkJCV9zdXNwZW5kLmRpc3Bvc2UoKTsKKwkJCV9kaXNhYmxlQWxsQnV0dG9uLmRpc3Bvc2UoKTsKKwkJCV9lbmFibGVBbGxCdXR0b24uZGlzcG9zZSgpOworCQkJX2xpc3RMYWJlbC5kaXNwb3NlKCk7CisJCQlfc3VzcGVuZC5kaXNwb3NlKCk7CisJCQlfdmFsaWRhdG9yTGlzdC5nZXRUYWJsZSgpLmRpc3Bvc2UoKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIGxvc2VGb2N1cygpIHsKKwkJfQorCisJCXB1YmxpYyB2b2lkIGdhaW5Gb2N1cygpIHsKKwkJfQorCX0KKworCS8qCisJICogQHNlZSBQcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhDb21wb3NpdGUpCisJICovCisJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgeworCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgSGVscENvbnRleHRJZHMuUHJlZmVyZW5jZVBhZ2UpOworCQl0cnkgeworCQkJX3NoZWxsID0gcGFyZW50LmdldFNoZWxsKCk7CisJCQlfcGFnZUltcGwgPSBuZXcgVmFsaWRhdG9yTGlzdFBhZ2UocGFyZW50KTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgeworCQkJX3BhZ2VJbXBsID0gbmV3IEludmFsaWRQYWdlKHBhcmVudCk7CisJCQlkaXNwbGF5QW5kTG9nRXJyb3IoVmFsVUlNZXNzYWdlcy5WQkZfRVhDX0lOVEVSTkFMX1RJVExFLCBWYWxVSU1lc3NhZ2VzLlZCRl9FWENfSU5URVJOQUxfUEFHRSwgZXhjKTsKKwkJfQorCisJCXJldHVybiBfcGFnZUltcGwuZ2V0Q29udHJvbCgpOworCX0KKworCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKKwl9CisKKwkvKioKKwkgKiBQZXJmb3JtcyBzcGVjaWFsIHByb2Nlc3Npbmcgd2hlbiB0aGlzIHBhZ2UncyBEZWZhdWx0cyBidXR0b24gaGFzIGJlZW4KKwkgKiBwcmVzc2VkLgorCSAqIDxwPgorCSAqIFRoaXMgaXMgYSBmcmFtZXdvcmsgaG9vayBtZXRob2QgZm9yIHN1YmNsYXNzZXMgdG8gZG8gc3BlY2lhbCB0aGluZ3Mgd2hlbgorCSAqIHRoZSBEZWZhdWx0cyBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUsIGJ1dCBzaG91bGQKKwkgKiBjYWxsIDxjb2RlPnN1cGVyLnBlcmZvcm1EZWZhdWx0czwvY29kZT4uCisJICogPC9wPgorCSAqLworCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKKwkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7CisKKwkJdHJ5IHsKKwkJCV9wYWdlSW1wbC5wZXJmb3JtRGVmYXVsdHMoKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgeworCQkJZGlzcGxheUFuZExvZ0Vycm9yKFZhbFVJTWVzc2FnZXMuVkJGX0VYQ19JTlRFUk5BTF9USVRMRSwgVmFsVUlNZXNzYWdlcy5WQkZfRVhDX0lOVEVSTkFMX1BBR0UsIGV4Yyk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBXaGVuIHRoZSB1c2VyIHByZXNzZXMgdGhlICJPSyIgb3IgIkFwcGx5IiBidXR0b24gb24gdGhlIFByb3BlcnRpZXMKKwkgKiBHdWlkZS9Qcm9wZXJ0aWVzIFBhZ2UsIHJlc3BlY3RpdmVseSwgc29tZSBwcm9jZXNzaW5nIGlzIHBlcmZvcm1lZCBieSB0aGlzCisJICogUHJvcGVydHlQYWdlLiBJZiB0aGUgcGFnZSBpcyBmb3VuZCwgYW5kIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHksIHRydWUgaXMKKwkgKiByZXR1cm5lZC4gT3RoZXJ3aXNlLCBmYWxzZSBpcyByZXR1cm5lZCwgYW5kIHRoZSBndWlkZSBkb2Vzbid0IGZpbmlzaC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7CisJCXRyeSB7CisJCQlyZXR1cm4gX3BhZ2VJbXBsLnBlcmZvcm1PaygpOworCQl9IAorCQljYXRjaCAoRXhjZXB0aW9uIGV4YykgeworCQkJZGlzcGxheUFuZExvZ0Vycm9yKFZhbFVJTWVzc2FnZXMuVkJGX0VYQ19JTlRFUk5BTF9USVRMRSwgVmFsVUlNZXNzYWdlcy5WQkZfRVhDX0lOVEVSTkFMX1BBR0UsIGV4Yyk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwkvKioKKwkgKiBTaW5jZSB0aGUgcGFnZXMgYXJlIGlubmVyIGNsYXNzZXMgb2YgYSBjaGlsZCBQcmVmZXJlbmNlUGFnZSwgbm90IGEKKwkgKiBQcmVmZXJlbmNlUGFnZSBpdHNlbGYsIERpYWxvZ1BhZ2UncyBhdXRvbWF0aWMgZGlzcG9zYWwgb2YgaXRzIGNoaWxkcmVuJ3MKKwkgKiB3aWRnZXRzIGNhbm5vdCBiZSB1c2VkLiBJbnN0ZWFkLCBkaXNwb3NlIG9mIGVhY2ggaW5uZXIgY2xhc3MnIHdpZGdldHMKKwkgKiBleHBsaWNpdGx5LgorCSAqLworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCXN1cGVyLmRpc3Bvc2UoKTsKKwkJdHJ5IHsKKwkJCWlmIChfcGFnZUltcGwgIT0gbnVsbCkgeworCQkJCV9wYWdlSW1wbC5kaXNwb3NlKCk7CisJCQkJX3BhZ2VJbXBsID0gbnVsbDsKKwkJCX0KKworCQkJLy8gVE9ETyBmaWd1cmUgb3V0IHdoYXQgdGhpcyB0aGluZyBkaWQKKwkJCS8vIEV4dGVuc2lvbk1hbmdlci5pbnN0YW5jZSgpLmdldERlbGVnYXRlKCkuZGlzcG9zZVByZWZlcmVuY2VQYWdlKCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKKwkJCWRpc3BsYXlBbmRMb2dFcnJvcihWYWxVSU1lc3NhZ2VzLlZCRl9FWENfSU5URVJOQUxfVElUTEUsIFZhbFVJTWVzc2FnZXMuVkJGX0VYQ19JTlRFUk5BTF9QQUdFLCBleGMpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGxvZ0Vycm9yKFRocm93YWJsZSBleGMpIHsKKwkJVmFsaWRhdGlvblVJUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihleGMpOworCX0KKworCS8qCisJICogcGFja2FnZSB2aXNpYmlsaXR5IGJlY2F1c2UgaWYgdGhpcyBtZXRob2QgaXMgcHJpdmF0ZSwgdGhlbiB0aGUgY29tcGlsZXIKKwkgKiBuZWVkcyB0byBjcmVhdGUgYSBzeW50aGV0aWMgYWNjZXNzb3IgbWV0aG9kIGZvciB0aGUgaW50ZXJuYWwgY2xhc3NlcywgYW5kCisJICogdGhhdCBjYW4gaGF2ZSBwZXJmb3JtYW5jZSBpbXBsaWNhdGlvbnMuCisJICovCisJdm9pZCBkaXNwbGF5QW5kTG9nRXJyb3IoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4YykgeworCQlsb2dFcnJvcihleGMpOworCQlkaXNwbGF5TWVzc2FnZSh0aXRsZSwgbWVzc2FnZSwgb3JnLmVjbGlwc2Uuc3d0LlNXVC5JQ09OX0VSUk9SKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZGlzcGxheU1lc3NhZ2UoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSwgaW50IGlJY29uVHlwZSkgeworCQlNZXNzYWdlQm94IG1lc3NhZ2VCb3ggPSBuZXcgTWVzc2FnZUJveChnZXRTaGVsbCgpLAorCQkJCW9yZy5lY2xpcHNlLnN3dC5TV1QuT0sgfCBpSWNvblR5cGUJfCBvcmcuZWNsaXBzZS5zd3QuU1dULkFQUExJQ0FUSU9OX01PREFMKTsKKwkJbWVzc2FnZUJveC5zZXRNZXNzYWdlKG1lc3NhZ2UpOworCQltZXNzYWdlQm94LnNldFRleHQodGl0bGUpOworCQltZXNzYWdlQm94Lm9wZW4oKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2Ujc2V0VmlzaWJsZShib29sZWFuKQorCSAqLworCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7CisJCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7CisKKwkJaWYgKF9wYWdlSW1wbCA9PSBudWxsKXJldHVybjsKKwkJaWYgKHZpc2libGUpX3BhZ2VJbXBsLmdhaW5Gb2N1cygpOworCQllbHNlIF9wYWdlSW1wbC5sb3NlRm9jdXMoKTsKKwl9CisKKwlwcm90ZWN0ZWQgQnV0dG9uIGdldERlZmF1bHRzQnV0dG9uKCkgeworCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdHNCdXR0b24oKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9WYWxpZGF0aW9uUHJvcGVydHlQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9WYWxpZGF0aW9uUHJvcGVydHlQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFhYmVlNAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkvdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1ZhbGlkYXRpb25Qcm9wZXJ0eVBhZ2UuamF2YQpAQCAtMCwwICsxLDg3MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb21tYW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmxheW91dC5HcmlkRGF0YUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TY3JvbGxlZENvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5NZW51QWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Sb3dMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnVJdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lc3NhZ2VCb3g7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlc1V0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eVBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkdsb2JhbENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUHJvamVjdENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxQcmVmTWFuYWdlclByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTXV0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxNYW5hZ2VyLlVzZVByb2plY3RQcmVmZXJlbmNlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5tb2RlbC5Qcm9qZWN0UHJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5WYWxpZGF0b3JNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnVpLkRlbGVnYXRpbmdWYWxpZGF0b3JQcmVmZXJlbmNlc0RpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC51aS5wbHVnaW4uVmFsaWRhdGlvblVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLmludGVybmFsLkhlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnVpLmludGVybmFsLkltYWdlTmFtZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udWkuaW50ZXJuYWwuVmFsVUlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi51aS5pbnRlcm5hbC5kaWFsb2cuRmlsdGVyRGlhbG9nOworCisvKioKKyAqIEZyb20gdGhpcyBwYWdlIHRoZSB1c2VyIGNhbiBjb25maWd1cmUgaW5kaXZpZHVhbCB2YWxpZGF0b3JzIG9uIGluZGl2aWR1YWwgcHJvamVjdHMuCisgKiAKKyAqIEBhdXRob3Iga2FyYXNpdWsKKyAqLworcHVibGljIGNsYXNzIFZhbGlkYXRpb25Qcm9wZXJ0eVBhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UgIHsKKworCXByaXZhdGUgSVZhbGlkYXRpb25QYWdlIF9wYWdlSW1wbDsKKwlwcml2YXRlIFNoZWxsIAkJCV9zaGVsbDsKKworCXB1YmxpYyBpbnRlcmZhY2UgSVZhbGlkYXRpb25QYWdlIHsKKwkJCisJCUNvbXBvc2l0ZSBjcmVhdGVQYWdlKENvbXBvc2l0ZSBwYXJlbnQpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworCQlib29sZWFuIHBlcmZvcm1PaygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworCQlib29sZWFuIHBlcmZvcm1EZWZhdWx0cygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworCQlDb21wb3NpdGUgZ2V0Q29udHJvbCgpOworCQl2b2lkIGRpc3Bvc2UoKTsKKwkJdm9pZCBsb3NlRm9jdXMoKTsKKwkJdm9pZCBnYWluRm9jdXMoKTsKKwl9CisKKwlwdWJsaWMgY2xhc3MgSW52YWxpZFBhZ2UgaW1wbGVtZW50cyBJVmFsaWRhdGlvblBhZ2UgeworCQkKKwkJcHJpdmF0ZSBDb21wb3NpdGUgcGFnZSA9IG51bGw7CisJCXByaXZhdGUgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG51bGw7CisJCXByaXZhdGUgR3JpZExheW91dCBsYXlvdXQgPSBudWxsOworCQlwcml2YXRlIExhYmVsIG1lc3NhZ2VMYWJlbCA9IG51bGw7CisKKwkJcHVibGljIEludmFsaWRQYWdlKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCXBhZ2UgPSBjcmVhdGVQYWdlKHBhcmVudCk7CisJCX0KKworCQkvKioKKwkJICogVGhpcyBwYWdlIGlzIGFkZGVkIHRvIHRoZSBQcm9wZXJ0aWVzIGd1aWRlIGlmIHNvbWUgaW50ZXJuYWwgcHJvYmxlbQorCQkgKiBvY2N1cnJlZDsgZm9yIGV4YW1wbGUsIHRoZSBoaWdobGlnaHRlZCBpdGVtIGluIHRoZSB3b3JrYmVuY2ggaXMgbm90CisJCSAqIGFuIElQcm9qZWN0IChhY2NvcmRpbmcgdG8gdGhpcyBwYWdlJ3MgcGx1Z2luLnhtbCwgdGhpcyBwYWdlIGlzIG9ubHkKKwkJICogdmFsaWQgd2hlbiBhbiBJUHJvamVjdCBpcyBzZWxlY3RlZCkuCisJCSAqLworCQlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZVBhZ2UoQ29tcG9zaXRlIHBhcmVudCkgeworCQkJbm9EZWZhdWx0QW5kQXBwbHlCdXR0b24oKTsKKworCQkJZmluYWwgU2Nyb2xsZWRDb21wb3NpdGUgc2MxID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlKHBhcmVudCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKKwkJCXNjMS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKKwkJCWNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc2MxLCBTV1QuTk9ORSk7CisJCQlzYzEuc2V0Q29udGVudChjb21wb3NpdGUpOworCQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKKworCQkJbWVzc2FnZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQkJbWVzc2FnZUxhYmVsLnNldFRleHQoVmFsVUlNZXNzYWdlcy5WQkZfRVhDX0lOVkFMSURfUkVHSVNURVIpOworCisJCQljb21wb3NpdGUuc2V0U2l6ZShjb21wb3NpdGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKSk7CisKKwkJCXJldHVybiBjb21wb3NpdGU7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRGVmYXVsdHMoKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCS8qKgorCQkgKiBTaW5jZSB0aGlzIHBhZ2Ugb2NjdXJzIHVuZGVyIGludmFsaWQgY2lyY3Vtc3RhbmNlcywgdGhlcmUgaXMgbm90aGluZworCQkgKiB0byBzYXZlLgorCQkgKi8KKwkJcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlwdWJsaWMgQ29tcG9zaXRlIGdldENvbnRyb2woKSB7CisJCQlyZXR1cm4gcGFnZTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCQltZXNzYWdlTGFiZWwuZGlzcG9zZSgpOworCQkJLy8gbGF5b3V0LmRpc3Bvc2UoKTsKKwkJCWNvbXBvc2l0ZS5kaXNwb3NlKCk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBsb3NlRm9jdXMoKSB7CisJCX0KKworCQlwdWJsaWMgdm9pZCBnYWluRm9jdXMoKSB7CisJCX0KKwl9CisKKwlwcml2YXRlIGZpbmFsIGNsYXNzIFZhbGlkYXRvckxpc3RQYWdlIGltcGxlbWVudHMgSVZhbGlkYXRpb25QYWdlIHsKKwkJcHJpdmF0ZSBDb21wb3NpdGUgCQlfcGFnZTsKKworCQlwcml2YXRlIFRhYmxlVmlld2VyIAlfdmFsaWRhdG9yTGlzdDsKKwkJcHJpdmF0ZSBCdXR0b24gCQkJX2VuYWJsZUFsbEJ1dHRvbjsKKwkJcHJpdmF0ZSBCdXR0b24gCQkJX2Rpc2FibGVBbGxCdXR0b247CisJCXByaXZhdGUgQnV0dG9uIAkJCV9vdmVycmlkZTsKKwkJcHJpdmF0ZSBCdXR0b24gCQkJX3N1c3BlbmQ7CisJCXByaXZhdGUgTGluawkJCV9jb25maWdMaW5rOworCQlwcml2YXRlIEJ1dHRvbgkJCV9hZGRWYWxpZGF0aW9uQnVpbGRlcjsKKwkJcHJpdmF0ZSBUYWJsZSAJCQlfdmFsaWRhdG9yc1RhYmxlOworCQlwcml2YXRlIFZhbGlkYXRvck11dGFibGVbXQkJX3ZhbGlkYXRvcnM7CisJCQorCQkvKiogTnVtYmVyIG9mIHRoaW5ncyB0aGF0IG1heSBoYXZlIGNoYW5nZWQuICovCisJCXByaXZhdGUgaW50CQkJCV9jaGFuZ2VzOworCisJCS8qKgorCQkgKiBUaGlzIGNsYXNzIGlzIHByb3ZpZGVkIGZvciB0aGUgQ2hlY2tib3hUYWJsZVZpZXdlciBpbiB0aGUKKwkJICogVmFsaWRhdGlvblByb3BlcnRpZXNQYWdlJFZhbGlkYXRvckxpc3RQYWdlIGNsYXNzLgorCQkgKi8KKwkJcHVibGljIGNsYXNzIFZhbGlkYXRpb25Db250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7CisJCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQkJfQorCisJCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgeworCQkJCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBWYWxpZGF0b3JNdXRhYmxlW10pIHsKKwkJCQkJcmV0dXJuIChWYWxpZGF0b3JNdXRhYmxlW10pIGlucHV0RWxlbWVudDsKKwkJCQl9CisJCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07CisJCQl9CisKKwkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgeworCQkJfQorCQl9CisKKwkJLyoqCisJCSAqIFRoaXMgY2xhc3MgaXMgcHJvdmlkZWQgZm9yCisJCSAqIFZhbGlkYXRpb25Qcm9wZXJ0aWVzUGFnZSRWYWxpZGF0b3JMaXN0UGFnZSdzIGNoZWNrYm94VGFibGVWaWV3ZXIKKwkJICogZWxlbWVudC4KKwkJICovCisJCXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKKwkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgeworCQkJCWlmIChlbGVtZW50ID09IG51bGwpcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCisJCQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFZhbGlkYXRvcikKKwkJCQkJcmV0dXJuICgoVmFsaWRhdG9yTXV0YWJsZSkgZWxlbWVudCkuZ2V0TmFtZSgpOworCQkJCWVsc2UKKwkJCQkJcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7CisJCQl9CisKKwkJCXByaXZhdGUgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIGltYWdlTmFtZSkgeworCQkJCWJvb2xlYW4gaXNEaXNhYmxlZCA9ICFfdmFsaWRhdG9yc1RhYmxlLmlzRW5hYmxlZCgpOworCQkJCWlmIChpc0Rpc2FibGVkKQorCQkJCQlpbWFnZU5hbWUgPSBpbWFnZU5hbWUgKyBJbWFnZU5hbWVzLmRpc2FibGVkOworCisJCQkJcmV0dXJuIFZhbGlkYXRpb25VSVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZShpbWFnZU5hbWUpOworCQkJfQorCisJCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgeworCQkJCVZhbGlkYXRvck11dGFibGUgdiA9IChWYWxpZGF0b3JNdXRhYmxlKSBlbGVtZW50OworCQkJCWlmIChjb2x1bW5JbmRleCA9PSAxKSB7CisJCQkJCXJldHVybiBnZXRJbWFnZSh2LmlzTWFudWFsVmFsaWRhdGlvbigpID8gSW1hZ2VOYW1lcy5va1RhYmxlCisJCQkJCQkJOiBJbWFnZU5hbWVzLmZhaWxUYWJsZSk7CisJCQkJfSBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSAyKSB7CisJCQkJCXJldHVybiBnZXRJbWFnZSh2LmlzQnVpbGRWYWxpZGF0aW9uKCkgPyBJbWFnZU5hbWVzLm9rVGFibGUKKwkJCQkJCQk6IEltYWdlTmFtZXMuZmFpbFRhYmxlKTsKKwkJCQl9IGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDMpIHsKKwkJCQkJaWYgKGhhc1NldHRpbmdzKHYpKXJldHVybiBnZXRJbWFnZShJbWFnZU5hbWVzLnNldHRpbmdzKTsKKwkJCQkJcmV0dXJuICBudWxsOworCQkJCX0KKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKworCQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKKwkJCQlpZiAoY29sdW1uSW5kZXggPT0gMClyZXR1cm4gKChWYWxpZGF0b3JNdXRhYmxlKSBlbGVtZW50KS5nZXROYW1lKCk7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCX0KKworCQlwdWJsaWMgVmFsaWRhdG9yTGlzdFBhZ2UoQ29tcG9zaXRlIHBhcmVudCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24geworCQkJX3BhZ2UgPSBjcmVhdGVQYWdlKHBhcmVudCk7CisJCX0KKworCQlwcml2YXRlIHZvaWQgc2V0dXBUYWJsZUNvbHVtbnMoVGFibGUgdGFibGUpIHsKKwkJCVRhYmxlQ29sdW1uIHZhbGlkYXRvckNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOworCQkJdmFsaWRhdG9yQ29sdW1uLnNldFRleHQoVmFsVUlNZXNzYWdlcy5WQUxJREFUT1IpOworCQkJdmFsaWRhdG9yQ29sdW1uLnNldFdpZHRoKDI0NSk7CisJCQlUYWJsZUNvbHVtbiBtYW51YWxDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5DRU5URVIpOworCQkJbWFudWFsQ29sdW1uLnNldFRleHQoVmFsVUlNZXNzYWdlcy5NQU5VQUwpOworCQkJbWFudWFsQ29sdW1uLnBhY2soKTsKKwkJCVRhYmxlQ29sdW1uIGJ1aWxkQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuQ0VOVEVSKTsKKwkJCWJ1aWxkQ29sdW1uLnNldFRleHQoVmFsVUlNZXNzYWdlcy5CVUlMRCk7CisJCQlidWlsZENvbHVtbi5wYWNrKCk7CisJCQlUYWJsZUNvbHVtbiBzZXR0aW5nc0NvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkNFTlRFUik7CisJCQlzZXR0aW5nc0NvbHVtbi5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuU0VUVElOR1MpOworCQkJc2V0dGluZ3NDb2x1bW4ucGFjaygpOworCQl9CisKKwkJcHVibGljIENvbXBvc2l0ZSBjcmVhdGVQYWdlKENvbXBvc2l0ZSBwYXJlbnQpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKKwkJCVZhbGlkYXRvcltdIHZhbHMgPSBWYWxNYW5hZ2VyLmdldERlZmF1bHQoKQorCQkJCS5nZXRWYWxpZGF0b3JzQ29uZmlndXJlZEZvclByb2plY3QoZ2V0UHJvamVjdCgpLCBVc2VQcm9qZWN0UHJlZmVyZW5jZXMuTXVzdFVzZSk7CisJCQlfdmFsaWRhdG9ycyA9IG5ldyBWYWxpZGF0b3JNdXRhYmxlW3ZhbHMubGVuZ3RoXTsKKwkJCWZvciAoaW50IGk9MDsgaTx2YWxzLmxlbmd0aDsgaSsrKV92YWxpZGF0b3JzW2ldID0gbmV3IFZhbGlkYXRvck11dGFibGUodmFsc1tpXSk7CisKKwkJCUNvbXBvc2l0ZSB2YWxpZGF0b3JHcm91cCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7CisKKwkJCUdyaWRMYXlvdXQgdmFsaWRhdG9yR3JvdXBMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQkJdmFsaWRhdG9yR3JvdXBMYXlvdXQubnVtQ29sdW1ucyA9IDI7CisJCQl2YWxpZGF0b3JHcm91cC5zZXRMYXlvdXQodmFsaWRhdG9yR3JvdXBMYXlvdXQpOworCQkJR3JpZERhdGFGYWN0b3J5LmZpbGxEZWZhdWx0cygpLmdyYWIodHJ1ZSwgdHJ1ZSkuYXBwbHlUbyh2YWxpZGF0b3JHcm91cCk7CisKKwkJCWFkZE92ZXJyaWRlKHZhbGlkYXRvckdyb3VwKTsKKwkJCWFkZENvbmZpZ0xpbmsodmFsaWRhdG9yR3JvdXApOworCQkJYWRkU3VzcGVuZCh2YWxpZGF0b3JHcm91cCk7CisJCQlhZGRWYWxpZGF0aW9uQnVpbGRlcih2YWxpZGF0b3JHcm91cCk7CisJCQluZXcgTGFiZWwodmFsaWRhdG9yR3JvdXAsIFNXVC5OT05FKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKKworCQkJTGFiZWwgbGlzdExhYmVsID0gbmV3IExhYmVsKHZhbGlkYXRvckdyb3VwLCBTV1QuTk9ORSk7CisJCQlHcmlkRGF0YSBsaXN0TGFiZWxEYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CisJCQlsaXN0TGFiZWxEYXRhLmhvcml6b250YWxTcGFuID0gMjsKKwkJCWxpc3RMYWJlbC5zZXRMYXlvdXREYXRhKGxpc3RMYWJlbERhdGEpOworCQkJbGlzdExhYmVsLnNldFRleHQoVmFsVUlNZXNzYWdlcy5QUkVGX1ZBTExJU1RfVElUTEUpOworCQkJCisJCQlfdmFsaWRhdG9yc1RhYmxlID0gbmV3IFRhYmxlKHZhbGlkYXRvckdyb3VwLCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKKwkJCVBvaW50IHByZWZlcnJlZFNpemUgPSBfdmFsaWRhdG9yc1RhYmxlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7CisJCQlHcmlkRGF0YUZhY3RvcnkuZmlsbERlZmF1bHRzKCkuZ3JhYih0cnVlLCB0cnVlKS5oaW50KHByZWZlcnJlZFNpemUpCisJCQkJLnNwYW4oMiwxKS5hcHBseVRvKF92YWxpZGF0b3JzVGFibGUpOworCisJCQlfdmFsaWRhdG9yc1RhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7CisJCQlfdmFsaWRhdG9yc1RhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKKworCQkJX3ZhbGlkYXRvckxpc3QgPSBuZXcgVGFibGVWaWV3ZXIoX3ZhbGlkYXRvcnNUYWJsZSk7CisJCQlfdmFsaWRhdG9yTGlzdC5zZXRMYWJlbFByb3ZpZGVyKG5ldyBWYWxpZGF0aW9uTGFiZWxQcm92aWRlcigpKTsKKwkJCV92YWxpZGF0b3JMaXN0LnNldENvbnRlbnRQcm92aWRlcihuZXcgVmFsaWRhdGlvbkNvbnRlbnRQcm92aWRlcigpKTsKKwkJCV92YWxpZGF0b3JMaXN0LnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkpOworCQkJc2V0dXBUYWJsZUNvbHVtbnMoX3ZhbGlkYXRvcnNUYWJsZSk7CisKKwkJCV92YWxpZGF0b3JMaXN0LnNldElucHV0KF92YWxpZGF0b3JzKTsKKwkJCV92YWxpZGF0b3JzVGFibGUuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgeworCisJCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgeworCQkJCQlpZiAoZS5idXR0b24gIT0gMSlyZXR1cm47CisKKwkJCQkJVGFibGVJdGVtIHRhYmxlSXRlbSA9IF92YWxpZGF0b3JzVGFibGUuZ2V0SXRlbShuZXcgUG9pbnQoZS54LCBlLnkpKTsKKwkJCQkJaWYgKHRhYmxlSXRlbSA9PSBudWxsIHx8IHRhYmxlSXRlbS5pc0Rpc3Bvc2VkKCkpIHsKKwkJCQkJCS8vIGl0ZW0gbm8gbG9uZ2VyIGV4aXN0cworCQkJCQkJcmV0dXJuOworCQkJCQl9CisJCQkJCWludCBjb2x1bW5OdW1iZXI7CisJCQkJCWludCBjb2x1bW5zQ291bnQgPSBfdmFsaWRhdG9yc1RhYmxlLmdldENvbHVtbkNvdW50KCk7CisJCQkJCWlmIChjb2x1bW5zQ291bnQgPT0gMCkgeworCQkJCQkJLy8gSWYgbm8gVGFibGVDb2x1bW4sIFRhYmxlIGFjdHMgYXMgaWYgaXQgaGFzIGEgc2luZ2xlIGNvbHVtbgorCQkJCQkJLy8gd2hpY2ggdGFrZXMgdGhlIHdob2xlIHdpZHRoLgorCQkJCQkJY29sdW1uTnVtYmVyID0gMDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWNvbHVtbk51bWJlciA9IC0xOworCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zQ291bnQ7IGkrKykgeworCQkJCQkJCVJlY3RhbmdsZSBib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKGkpOworCQkJCQkJCWlmIChib3VuZHMuY29udGFpbnMoZS54LCBlLnkpKSB7CisJCQkJCQkJCWNvbHVtbk51bWJlciA9IGk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWlmIChjb2x1bW5OdW1iZXIgPT0gLTEpcmV0dXJuOworCQkJCQl9CisKKwkJCQkJY29sdW1uQ2xpY2tlZChjb2x1bW5OdW1iZXIpOworCQkJCX0KKwkJCX0pOworCisJCQlfdmFsaWRhdG9yc1RhYmxlLnNldE1lbnUoY3JlYXRlQ29udGV4dE1lbnUoKSk7CisJCQlfdmFsaWRhdG9yc1RhYmxlLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKKworCQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgeworCQkJCQlzdXBlci5mb2N1c0dhaW5lZChlKTsKKwkJCQkJaWYgKF92YWxpZGF0b3JzVGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSA9PSAwKSB7CisJCQkJCQlfdmFsaWRhdG9yc1RhYmxlLnNlbGVjdCgwKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0pOworCQkJCisJCQlhZGRCdXR0b25zKHZhbGlkYXRvckdyb3VwKTsKKworCQkJLy8gSGF2ZSB0byBzZXQgdGhlIHRhYiBvcmRlciBvciBvbmx5IHRoZSBmaXJzdCBjaGVja2JveCBpbiBhCisJCQkvLyBDb21wb3NpdGUgY2FuIGJlIHRhYmJlZCB0by4gKFNlZW1zIHRvIGFwcGx5IG9ubHkgdG8gY2hlY2tib3hlcy4gSGF2ZSB0byB1c2UgdGhlCisJCQkvLyBhcnJvdyBrZXkgdG8gbmF2aWdhdGUgdGhlIGNoZWNrYm94ZXMuKQorCQkJdmFsaWRhdG9yR3JvdXAuc2V0VGFiTGlzdChuZXcgQ29udHJvbFtdIHsgX292ZXJyaWRlLCBfc3VzcGVuZH0pOworCisJCQl1cGRhdGVXaWRnZXRzKCk7CisKKwkJCWFwcGx5RGlhbG9nRm9udCh2YWxpZGF0b3JHcm91cCk7CisJCQl2YWxpZGF0b3JHcm91cC5zZXRTaXplKHZhbGlkYXRvckdyb3VwLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkpOworCisJCQlyZXR1cm4gdmFsaWRhdG9yR3JvdXA7CisJCX0KKworCQlwcml2YXRlIHZvaWQgYWRkQnV0dG9ucyhDb21wb3NpdGUgdmFsaWRhdG9yR3JvdXApIHsKKwkJCQorCQkJQ29tcG9zaXRlIGJ1dHRvbnMgPSBuZXcgQ29tcG9zaXRlKHZhbGlkYXRvckdyb3VwLCBTV1QuTk9ORSk7CisJCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOworCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOworCQkJYnV0dG9ucy5zZXRMYXlvdXQobmV3IFJvd0xheW91dCgpKTsKKwkJCQorCQkJX2VuYWJsZUFsbEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlBVU0gpOworCQkJX2VuYWJsZUFsbEJ1dHRvbi5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuUFJFRl9CVVRUT05fRU5BQkxFQUxMKTsKKwkJCV9lbmFibGVBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCQl0cnkgeworCQkJCQkJcGVyZm9ybUVuYWJsZUFsbCgpOworCQkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgeworCQkJCQkJZGlzcGxheUFuZExvZ0Vycm9yKFZhbFVJTWVzc2FnZXMuVkJGX0VYQ19JTlRFUk5BTF9USVRMRSxWYWxVSU1lc3NhZ2VzLlZCRl9FWENfSU5URVJOQUxfUEFHRSwgZXhjKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0pOworCisJCQlfZGlzYWJsZUFsbEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlBVU0gpOworCQkJX2Rpc2FibGVBbGxCdXR0b24uc2V0VGV4dChWYWxVSU1lc3NhZ2VzLlBSRUZfQlVUVE9OX0RJU0FCTEVBTEwpOworCQkJX2Rpc2FibGVBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCQl0cnkgeworCQkJCQkJcGVyZm9ybURpc2FibGVBbGwoKTsKKwkJCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKKwkJCQkJCWRpc3BsYXlBbmRMb2dFcnJvcihWYWxVSU1lc3NhZ2VzLlZCRl9FWENfSU5URVJOQUxfVElUTEUsIFZhbFVJTWVzc2FnZXMuVkJGX0VYQ19JTlRFUk5BTF9QQUdFLCBleGMpOworCQkJCQl9CisJCQkJfQorCQkJfSk7CisJCX0KKworCQlwcml2YXRlIHZvaWQgYWRkU3VzcGVuZChDb21wb3NpdGUgdmFsaWRhdG9yR3JvdXApIHsKKwkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CisJCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7CisJCQlfc3VzcGVuZCA9IG5ldyBCdXR0b24odmFsaWRhdG9yR3JvdXAsIFNXVC5DSEVDSyk7CisJCQlfc3VzcGVuZC5zZXRMYXlvdXREYXRhKGdkKTsKKwkJCV9zdXNwZW5kLnNldFRleHQoVmFsVUlNZXNzYWdlcy5ESVNBQkxFX1ZBTElEQVRJT04pOworCQkJX3N1c3BlbmQuc2V0U2VsZWN0aW9uKGdldFByb2plY3RQcmVmZXJlbmNlcygpLmdldFN1c3BlbmQoKSk7CisJCQlfc3VzcGVuZC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJCV9zdXNwZW5kLnNldEZvY3VzKCk7CisJCQkJCV9jaGFuZ2VzKys7CisJCQkJCWVuYWJsZURpc2FibGVXaWRnZXRzKCk7CisJCQkJCV92YWxpZGF0b3JMaXN0LnJlZnJlc2goKTsKKwkJCQl9CisJCQl9KTsKKwkJfQorCQkKKwkJcHJpdmF0ZSB2b2lkIGFkZENvbmZpZ0xpbmsoQ29tcG9zaXRlIHZhbGlkYXRvckdyb3VwKXsKKwkJCV9jb25maWdMaW5rID0gbmV3IExpbmsodmFsaWRhdG9yR3JvdXAsU1dULk5vbmUpOworCQkJR3JpZERhdGEgbGF5b3V0ID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKKwkJCV9jb25maWdMaW5rLnNldExheW91dERhdGEobGF5b3V0KTsKKwkJCV9jb25maWdMaW5rLnNldFRleHQoIjxBPiIrIC8vJE5PTi1OTFMtMSQKKwkJCQlWYWxVSU1lc3NhZ2VzLkNvbmZpZ1dzU2V0dGluZ3MrIjwvQT4iKTsgLy8kTk9OLU5MUy0xJAorCQkJX2NvbmZpZ0xpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgeworCQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfTk9fTElOSyA9ICJQcm9wZXJ0eUFuZFByZWZlcmVuY2VQYWdlLm5vbGluayI7IC8vJE5PTi1OTFMtMSQKKworCQkJCXB1YmxpYyB2b2lkIGRvTGlua0FjdGl2YXRlZChMaW5rIGUpIHsKKwkJCQkJU3RyaW5nIGlkID0gZ2V0UHJlZmVyZW5jZVBhZ2VJRCgpOworCQkJCQlQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKGdldFNoZWxsKCksIGlkLCBuZXcgU3RyaW5nW117aWR9LCBEQVRBX05PX0xJTkspLm9wZW4oKTsKKwkJCQkJdHJ5IHsKKwkJCQkJCXVwZGF0ZVdpZGdldHMoKTsKKwkJCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpZSkgeworCisJCQkJCX0KKwkJCQl9CisKKwkJCQlwcml2YXRlIFN0cmluZyBnZXRQcmVmZXJlbmNlUGFnZUlEKCkgeworCQkJCQlyZXR1cm4gIlZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZSI7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisKKwkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCQlkb0xpbmtBY3RpdmF0ZWQoKExpbmspIGUud2lkZ2V0KTsJCQkJCQorCQkJCX0KKworCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQkJZG9MaW5rQWN0aXZhdGVkKChMaW5rKSBlLndpZGdldCk7CQkJCQkKKwkJCQl9CisJCQl9KTsKKwkJCQorCQl9CisJCQorCQkvKioKKwkJICogSWYgdGhlIGN1cnJlbnQgcHJvamVjdCBkb2Vzbid0IGhhdmUgdGhlIHZhbGlkYXRpb24gYnVpbGRlciBjb25maWd1cmVkIG9uIGl0LCAKKwkJICogYW5kIHRoZSB1c2VyIGhhcyBhc2tlZCB1cyB0byBhZGQgYSBidWlsZGVyLCBhZGQgdGhlIGJ1aWxkZXIuIAorCQkgKiBPdGhlcndpc2UgcmV0dXJuIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcuCisJCSAqLworCQlwcml2YXRlIHZvaWQgYWRkQnVpbGRlcigpIHsKKwkJCWlmIChfYWRkVmFsaWRhdGlvbkJ1aWxkZXIgIT0gbnVsbCAmJiBfYWRkVmFsaWRhdGlvbkJ1aWxkZXIuZ2V0U2VsZWN0aW9uKCkpCisJCQkJVmFsaWRhdG9yTWFuYWdlci5hZGRQcm9qZWN0QnVpbGRWYWxpZGF0aW9uU3VwcG9ydChnZXRQcm9qZWN0KCkpOworCQl9CisKKwkJCisJCXByaXZhdGUgdm9pZCBhZGRWYWxpZGF0aW9uQnVpbGRlcihDb21wb3NpdGUgdmFsaWRhdG9yR3JvdXApIHsKKwkJCWlmIChoYXNWYWxpZGF0aW9uQnVpbGRlcigpKXJldHVybjsKKwkJCQorCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKKwkJCWdkLmhvcml6b250YWxTcGFuID0gMjsKKwkJCV9hZGRWYWxpZGF0aW9uQnVpbGRlciA9IG5ldyBCdXR0b24odmFsaWRhdG9yR3JvdXAsIFNXVC5DSEVDSyk7CisJCQlfYWRkVmFsaWRhdGlvbkJ1aWxkZXIuc2V0TGF5b3V0RGF0YShnZCk7CisJCQlfYWRkVmFsaWRhdGlvbkJ1aWxkZXIuc2V0VGV4dChWYWxVSU1lc3NhZ2VzLkFERF9WQUxJREFUSU9OX0JVSUxERVIpOworCQkJX2FkZFZhbGlkYXRpb25CdWlsZGVyLnNldFNlbGVjdGlvbihmYWxzZSk7CisJCX0KKwkJCQkKKwkJLyoqCisJCSAqIERvZXMgdGhpcyB2YWxpZGF0b3IgaGF2ZSBleHRyYSBzZXR0aW5ncyB0aGF0IGNhbiBiZSBjb25maWd1cmVkPworCQkgKiBAcGFyYW0gdgorCQkgKiBAcmV0dXJuIHRydWUgaWYgaXQgZG9lcworCQkgKi8KKwkJYm9vbGVhbiBoYXNTZXR0aW5ncyhWYWxpZGF0b3JNdXRhYmxlIHYpeworCQkJaWYgKHYuaXNWMlZhbGlkYXRvcigpKXJldHVybiB0cnVlOworCQkJaWYgKHYuZ2V0RGVsZWdhdGluZ0lkKCkgIT0gbnVsbClyZXR1cm4gdHJ1ZTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCS8qKgorCQkgKiBBbnN3ZXIgaWYgdGhpcyBwcm9qZWN0IGhhcyBhIHZhbGlkYXRvciBidWlsZGVyIGFzc2lnbmVkIHRvIGl0LgorCQkgKi8KKwkJcHJpdmF0ZSBib29sZWFuIGhhc1ZhbGlkYXRpb25CdWlsZGVyKCl7CisJCQl0cnkgeworCQkJCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBnZXRQcm9qZWN0KCkuZ2V0RGVzY3JpcHRpb24oKTsKKwkJCQlJQ29tbWFuZFtdIGNvbW1hbmRzID0gZGVzY3JpcHRpb24uZ2V0QnVpbGRTcGVjKCk7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb21tYW5kcy5sZW5ndGg7IGkrKykgeworCQkJCQlpZiAoY29tbWFuZHNbaV0uZ2V0QnVpbGRlck5hbWUoKS5lcXVhbHMoVmFsaWRhdGlvblBsdWdpbi5WQUxJREFUSU9OX0JVSUxERVJfSUQpKQorCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpeworCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGUpOworCQkJfQorCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKworCQlwcml2YXRlIHZvaWQgYWRkT3ZlcnJpZGUoQ29tcG9zaXRlIHZhbGlkYXRvckdyb3VwKSB7CisJCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOworLy8JCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7CisJCQlfb3ZlcnJpZGUgPSBuZXcgQnV0dG9uKHZhbGlkYXRvckdyb3VwLCBTV1QuQ0hFQ0spOworCQkJX292ZXJyaWRlLnNldExheW91dERhdGEoZ2QpOworCQkJX292ZXJyaWRlLnNldFRleHQoVmFsVUlNZXNzYWdlcy5MYWJlbEVuYWJsZVByb2plY3RTcGVjaWZpYyk7CisJCQlfb3ZlcnJpZGUuc2V0U2VsZWN0aW9uKGdldFByb2plY3RQcmVmZXJlbmNlcygpLmdldE92ZXJyaWRlKCkpOworCQkJX292ZXJyaWRlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQkJX292ZXJyaWRlLnNldEZvY3VzKCk7CisJCQkJCV9jaGFuZ2VzKys7CisJCQkJCVZhbE1hbmFnZXIgdm0gPSBWYWxNYW5hZ2VyLmdldERlZmF1bHQoKTsKKwkJCQkJaWYgKHZtLmdldEdsb2JhbFByZWZlcmVuY2VzKCkuZ2V0T3ZlcnJpZGUoKSl7CisvLwkJCQkJCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7CisvLwkJCQkJCVVzZVByb2plY3RQcmVmZXJlbmNlcyB1c2VQcm9qZWN0ID0gVXNlUHJvamVjdFByZWZlcmVuY2VzLk5vcm1hbDsKKy8vCQkJCQkJaWYgKF9vdmVycmlkZS5nZXRTZWxlY3Rpb24oKSl1c2VQcm9qZWN0ID0gVXNlUHJvamVjdFByZWZlcmVuY2VzLk11c3RVc2U7CisvLwkJCQkJCV92YWxpZGF0b3JzID0gY29weVZhbGlkYXRvcnModm0uZ2V0VmFsaWRhdG9yc0NvbmZpZ3VyZWRGb3JQcm9qZWN0KHByb2plY3QsIHVzZVByb2plY3QpKTsKKy8vCQkJCQkJX3ZhbGlkYXRvckxpc3Quc2V0SW5wdXQoX3ZhbGlkYXRvcnMpOworCQkJCQkJZW5hYmxlRGlzYWJsZVdpZGdldHMoKTsKKwkJCQkJCV92YWxpZGF0b3JMaXN0LnJlZnJlc2goKTsKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCU1lc3NhZ2VEaWFsb2cub3Blbldhcm5pbmcoX3NoZWxsLCBWYWxVSU1lc3NhZ2VzLlZhbGlkYXRpb24sIAorCQkJCQkJCVZhbFVJTWVzc2FnZXMuUHJvamVjdE92ZXJyaWRlc05vdEFsbG93ZWQpOwkJCQkJCQorCQkJCQl9CisJCQkJfQorCisJCQl9KTsKKwkJfQorCisJCXByb3RlY3RlZCBNZW51IGNyZWF0ZUNvbnRleHRNZW51KCkgeworCQkJZmluYWwgTWVudSBtZW51ID0gbmV3IE1lbnUoX3ZhbGlkYXRvcnNUYWJsZS5nZXRTaGVsbCgpLCBTV1QuUE9QX1VQKTsKKwkJCWZpbmFsIE1lbnVJdGVtIG1hbnVhbEl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULkNIRUNLKTsKKwkJCW1hbnVhbEl0ZW0uc2V0VGV4dChWYWxVSU1lc3NhZ2VzLlBSRUZfTU5VX01BTlVBTCk7CisJCQlmaW5hbCBNZW51SXRlbSBidWlsZEl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULkNIRUNLKTsKKwkJCWJ1aWxkSXRlbS5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuUFJFRl9NTlVfQlVJTEQpOworCQkJZmluYWwgTWVudUl0ZW0gc2V0dGluZ3NJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5QVVNIKTsKKwkJCXNldHRpbmdzSXRlbS5zZXRUZXh0KFZhbFVJTWVzc2FnZXMuUFJFRl9NTlVfU0VUVElOR1MpOworCisJCQljbGFzcyBNZW51SXRlbUxpc3RlbmVyIGV4dGVuZHMgU2VsZWN0aW9uQWRhcHRlciB7CisJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCQlNZW51SXRlbSBtZW51SXRlbSA9IChNZW51SXRlbSkgZS5nZXRTb3VyY2UoKTsKKwkJCQkJaW50IGluZGV4ID0gbWVudS5pbmRleE9mKG1lbnVJdGVtKSArIDE7CisJCQkJCWNvbHVtbkNsaWNrZWQoaW5kZXgpOworCQkJCX0KKwkJCX0KKwkJCU1lbnVJdGVtTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTWVudUl0ZW1MaXN0ZW5lcigpOworCQkJbWFudWFsSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisJCQlidWlsZEl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOworCQkJc2V0dGluZ3NJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKKworCQkJbWVudS5hZGRNZW51TGlzdGVuZXIobmV3IE1lbnVBZGFwdGVyKCkgeworCQkJCXB1YmxpYyB2b2lkIG1lbnVTaG93bihNZW51RXZlbnQgZSkgeworCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIF92YWxpZGF0b3JMaXN0LmdldFNlbGVjdGlvbigpOworCQkJCQlWYWxpZGF0b3JNdXRhYmxlIHZhbCA9IChWYWxpZGF0b3JNdXRhYmxlKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7CisJCQkJCW1hbnVhbEl0ZW0uc2V0U2VsZWN0aW9uKHZhbC5pc01hbnVhbFZhbGlkYXRpb24oKSk7CisJCQkJCWJ1aWxkSXRlbS5zZXRTZWxlY3Rpb24odmFsLmlzQnVpbGRWYWxpZGF0aW9uKCkpOworCQkJCQlzZXR0aW5nc0l0ZW0uc2V0RW5hYmxlZChoYXNTZXR0aW5ncyh2YWwpKTsKKwkJCQl9CisJCQl9KTsKKworCQkJcmV0dXJuIG1lbnU7CisJCX0KKworCQlwcm90ZWN0ZWQgdm9pZCBjb2x1bW5DbGlja2VkKGludCBjb2x1bW5Ub0VkaXQpIHsKKwkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgX3ZhbGlkYXRvckxpc3QuZ2V0U2VsZWN0aW9uKCk7CisJCQlWYWxpZGF0b3JNdXRhYmxlIHZhbCA9IChWYWxpZGF0b3JNdXRhYmxlKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7CisKKwkJCXN3aXRjaCAoY29sdW1uVG9FZGl0KSB7CisJCQljYXNlIDE6CisJCQkJdmFsLnNldE1hbnVhbFZhbGlkYXRpb24oIXZhbC5pc01hbnVhbFZhbGlkYXRpb24oKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJdmFsLnNldEJ1aWxkVmFsaWRhdGlvbighdmFsLmlzQnVpbGRWYWxpZGF0aW9uKCkpOworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCWlmICh2YWwuaXNWMlZhbGlkYXRvcigpKXsKKwkJCQkJVmFsaWRhdG9yTXV0YWJsZSBuZXdWYWwgPSBuZXcgVmFsaWRhdG9yTXV0YWJsZSh2YWwpOworCQkJCQlGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgRmlsdGVyRGlhbG9nKF9zaGVsbCwgbmV3VmFsLCBnZXRQcm9qZWN0KCkpOworCQkJCQlpZiAoV2luZG93Lk9LID09IGZkLm9wZW4oKSl7CisJCQkJCQlfY2hhbmdlcysrOworCQkJCQkJbmV3VmFsID0gZmQuZ2V0VmFsaWRhdG9yKCk7CisJCQkJCQlpbnQgaSA9IGZpbmRpdCh2YWwpOworCQkJCQkJaWYgKGkgIT0gLTEpX3ZhbGlkYXRvcnNbaV0gPSBuZXdWYWw7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCWhhbmRsZU9sZERlbGVnYXRlKHZhbCk7CisJCQkJfQorCisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQkJX3ZhbGlkYXRvckxpc3QucmVmcmVzaCgpOworCQl9CisKKwkJcHJpdmF0ZSBpbnQgZmluZGl0KFZhbGlkYXRvck11dGFibGUgdmFsKSB7CisJCQlmb3IgKGludCBpPTA7IGk8X3ZhbGlkYXRvcnMubGVuZ3RoOyBpKyspaWYgKF92YWxpZGF0b3JzW2ldID09IHZhbClyZXR1cm4gaTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQkKKwkJcHJpdmF0ZSB2b2lkIGhhbmRsZU9sZERlbGVnYXRlKFZhbGlkYXRvck11dGFibGUgdmFsKSB7CisJCQl0cnkgeworCQkJCWlmICghdmFsLmlzVjFWYWxpZGF0b3IoKSlyZXR1cm47CisJCQkJCisJCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gdmFsLmdldFZtZCgpOworCQkJICAgIGlmICghdm1kLmlzRGVsZWdhdGluZygpKXJldHVybjsKKwkJCSAgICAKKwkJCSAgICBHbG9iYWxDb25maWd1cmF0aW9uIGdjID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKTsKKwkJCSAgICBTdHJpbmcgZGVsZWdhdGVJRCA9IGdjLmdldERlbGVnYXRlVW5pcXVlTmFtZSh2bWQpOworCQkJICAgIFNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKKwkJCSAgICBEZWxlZ2F0aW5nVmFsaWRhdG9yUHJlZmVyZW5jZXNEaWFsb2cgZGlhbG9nID0gCisJCQkgICAgCW5ldyBEZWxlZ2F0aW5nVmFsaWRhdG9yUHJlZmVyZW5jZXNEaWFsb2coc2hlbGwsIHZtZCwgZGVsZWdhdGVJRCk7CisJCQkKKwkJCSAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7CisJCQkgICAgZGlhbG9nLmNyZWF0ZSgpOworCQkJCisJCQkgICAgaW50IHJlc3VsdCA9IGRpYWxvZy5vcGVuKCk7CisJCSAgICAgICAgaWYgKHJlc3VsdCA9PSBXaW5kb3cuT0speworCQkgICAgICAgIAlfY2hhbmdlcysrOworCQkgICAgICAgIAlnYy5zZXREZWxlZ2F0ZVVuaXF1ZU5hbWUodm1kLCBkaWFsb2cuZ2V0RGVsZWdhdGVJRCgpKTsKKwkJICAgICAgICB9CisJCQl9CisJCQljYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKXsKKwkJCQkKKwkJCX0KKwkJfQorCisJCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVdpZGdldHMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7CisJCQkvLyBOZWVkIHRvIHVwZGF0ZSBldmVuIHRoZSB3aWRnZXRzIHRoYXQgZG8gbm90IGNoYW5nZSBiYXNlZCBvbiBhbm90aGVyCisJCQkvLyB3aWRnZXRzIGJlY2F1c2Ugb2YgcGVyZm9ybURlZmF1bHRzKCkuIElmIHBlcmZvcm1EZWZhdWx0cygpIGlzIHNlbGVjdGVkLAorCQkJLy8gdGhlbiB0aGUgcGFnZVByZWZlcmVuY2VzIHZhbHVlcyBhcmUgcmVzZXQsIGFuZCB0aGVzZSB3aWRnZXRzCisJCQkvLyBtaWdodCBhbHNvIG5lZWQgdG8gYmUgdXBkYXRlZC4KKwkJCXVwZGF0ZUFsbFdpZGdldHMoKTsKKwkJCXVwZGF0ZUhlbHAoKTsKKwkJfQorCisJCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVdpZGdldHNGb3JEZWZhdWx0cygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKKwkJCV9zdXNwZW5kLnNldFNlbGVjdGlvbihmYWxzZSk7CisJCQlfb3ZlcnJpZGUuc2V0U2VsZWN0aW9uKGZhbHNlKTsKKwkJCWVuYWJsZURpc2FibGVXaWRnZXRzKCk7CisJCQlfdmFsaWRhdG9yTGlzdC5zZXRJbnB1dChfdmFsaWRhdG9ycyk7CisJCQlfdmFsaWRhdG9yTGlzdC5yZWZyZXNoKCk7CisJCX0KKworCQlwcml2YXRlIHZvaWQgdXBkYXRlQWxsV2lkZ2V0cygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKKwkJCV9zdXNwZW5kLnNldFNlbGVjdGlvbihnZXRQcm9qZWN0UHJlZmVyZW5jZXMoKS5nZXRTdXNwZW5kKCkpOworCQkJX292ZXJyaWRlLnNldFNlbGVjdGlvbihnZXRQcm9qZWN0UHJlZmVyZW5jZXMoKS5nZXRPdmVycmlkZSgpKTsKKwkJCWVuYWJsZURpc2FibGVXaWRnZXRzKCk7CisJCQlfdmFsaWRhdG9yTGlzdC5zZXRJbnB1dChfdmFsaWRhdG9ycyk7CisJCQlfdmFsaWRhdG9yTGlzdC5yZWZyZXNoKCk7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7CisJCQkKKwkJCWFkZEJ1aWxkZXIoKTsKKwkJCWZvciAoVmFsaWRhdG9yTXV0YWJsZSB2bSA6IF92YWxpZGF0b3JzKWlmICh2bS5pc0NoYW5nZWQoKSlfY2hhbmdlcysrOworCQkJaWYgKF9jaGFuZ2VzID09IDApcmV0dXJuIHRydWU7CisJCQkvLyBbMjEzNjMxXSB0aGlzIHdhcm5pbmcgc2hvdWxkIG9ubHkgYmUgc2hvd24gaWYgdGhlIHVzZXIgYWN0dWFsbHkgdHJpZWQgdG8gb3ZlcnJpZGUKKwkJCS8vIHRoZSB2YWxpZGF0b3JzCisJCQlpZiAoIVZhbE1hbmFnZXIuZ2V0RGVmYXVsdCgpLmdldEdsb2JhbFByZWZlcmVuY2VzKCkuZ2V0T3ZlcnJpZGUoKSAmJiBfb3ZlcnJpZGUuZ2V0U2VsZWN0aW9uKCkpeworCQkJCU1lc3NhZ2VEaWFsb2cub3Blbldhcm5pbmcoX3NoZWxsLCBWYWxVSU1lc3NhZ2VzLlZhbGlkYXRpb24sIFZhbFVJTWVzc2FnZXMuUHJvamVjdE92ZXJyaWRlc05vdEFsbG93ZWQpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCXVwZGF0ZVYxUHJvamVjdFNldHRpbmdzKCk7CisJCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOworCQkJUHJvamVjdFByZWZlcmVuY2VzIHBwID0gbmV3IFByb2plY3RQcmVmZXJlbmNlcyhwcm9qZWN0LCBfb3ZlcnJpZGUuZ2V0U2VsZWN0aW9uKCksIF9zdXNwZW5kLmdldFNlbGVjdGlvbigpLCBudWxsKTsKKwkJCVZhbFByZWZNYW5hZ2VyUHJvamVjdCB2cG0gPSBuZXcgVmFsUHJlZk1hbmFnZXJQcm9qZWN0KHByb2plY3QpOworCQkJdnBtLnNhdmVQcmVmZXJlbmNlcyhwcCwgX3ZhbGlkYXRvcnMpOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJCisJCS8qKgorCQkgKiBVcGRhdGUgdGhlIHZlcnNpb24gMSBwcm9qZWN0IHNldHRpbmdzLgorCQkgKi8KKwkJcHJpdmF0ZSB2b2lkIHVwZGF0ZVYxUHJvamVjdFNldHRpbmdzKCkgeworCQkJdHJ5IHsKKwkJCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwYyA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihnZXRQcm9qZWN0KCkpOworCQkJCXBjLnNldERvZXNQcm9qZWN0T3ZlcnJpZGUoX292ZXJyaWRlLmdldFNlbGVjdGlvbigpKTsKKwkJCQlwYy5zZXREaXNhYmxlQWxsVmFsaWRhdGlvbihfc3VzcGVuZC5nZXRTZWxlY3Rpb24oKSk7CisJCQl9CisJCQljYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKXsKKwkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlKTsKKwkJCX0JCQkKKwkJfQorCisJCS8qKgorCQkgKiBBbnN3ZXIgdGhlIHNwZWNpZmljIHByb2plY3QgcHJlZmVyZW5jZXMuIElmIHRoZSBwcm9qZWN0IGRpZG4ndCBoYXZlIGFueSBzcGVjaWZpYyBwcm9qZWN0CisJCSAqIHByZWZlcmVuY2VzLCB0aGVuIGNyZWF0ZSBhIGRlZmF1bHQgc2V0LgorCQkgKiBAcmV0dXJuCisJCSAqLworCQlwcml2YXRlIFByb2plY3RQcmVmZXJlbmNlcyBnZXRQcm9qZWN0UHJlZmVyZW5jZXMoKXsKKwkJCXJldHVybiBWYWxNYW5hZ2VyLmdldERlZmF1bHQoKS5nZXRQcm9qZWN0UHJlZmVyZW5jZXMoZ2V0UHJvamVjdCgpKTsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIHBlcmZvcm1EZWZhdWx0cygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKKwkJCVZhbGlkYXRvcltdIHZhbHMgPSBWYWxNYW5hZ2VyLmdldERlZmF1bHQoKQorCQkJCS5nZXRWYWxpZGF0b3JzQ29uZmlndXJlZEZvclByb2plY3QoZ2V0UHJvamVjdCgpLCBVc2VQcm9qZWN0UHJlZmVyZW5jZXMuTXVzdE5vdFVzZSk7CisJCQlfdmFsaWRhdG9ycyA9IG5ldyBWYWxpZGF0b3JNdXRhYmxlW3ZhbHMubGVuZ3RoXTsKKwkJCWZvciAoaW50IGk9MDsgaTx2YWxzLmxlbmd0aDsgaSsrKV92YWxpZGF0b3JzW2ldID0gbmV3IFZhbGlkYXRvck11dGFibGUodmFsc1tpXSk7CisKKwkJCV9jaGFuZ2VzKys7CisJCQl1cGRhdGVXaWRnZXRzRm9yRGVmYXVsdHMoKTsKKwkJCWdldERlZmF1bHRzQnV0dG9uKCkuc2V0Rm9jdXMoKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gcGVyZm9ybUVuYWJsZUFsbCgpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKKwkJCXNldEFsbFZhbGlkYXRvcnModHJ1ZSk7CisJCQlfZW5hYmxlQWxsQnV0dG9uLnNldEZvY3VzKCk7CisJCQlfdmFsaWRhdG9yTGlzdC5yZWZyZXNoKCk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCXByaXZhdGUgdm9pZCBzZXRBbGxWYWxpZGF0b3JzKGJvb2xlYW4gYm9vbCkgeworCQkJZm9yIChUYWJsZUl0ZW0gaXRlbSA6IF92YWxpZGF0b3JzVGFibGUuZ2V0SXRlbXMoKSkgeworCQkJCVZhbGlkYXRvck11dGFibGUgdmFsID0gKFZhbGlkYXRvck11dGFibGUpIGl0ZW0uZ2V0RGF0YSgpOworCQkJCXZhbC5zZXRNYW51YWxWYWxpZGF0aW9uKGJvb2wpOworCQkJCXZhbC5zZXRCdWlsZFZhbGlkYXRpb24oYm9vbCk7CisJCQl9CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRGlzYWJsZUFsbCgpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKKwkJCXNldEFsbFZhbGlkYXRvcnMoZmFsc2UpOworCQkJX2Rpc2FibGVBbGxCdXR0b24uc2V0Rm9jdXMoKTsKKwkJCV92YWxpZGF0b3JMaXN0LnJlZnJlc2goKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJcHJvdGVjdGVkIHZvaWQgdXBkYXRlSGVscCgpIHsKKy8vCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChfc3VzcGVuZCwgQ29udGV4dElkcy5WQUxJREFUSU9OX1BSRUZFUkVOQ0VfUEFHRV9ESVNBQkxFX0FMTF9FTkFCTEVEKTsKKwkJfQorCisJCS8qCisJCSAqIFN0b3JlIHRoZSBjdXJyZW50IHZhbHVlcyBvZiB0aGUgY29udHJvbHMgaW50byB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KKwkJICovCisKKwkJcHVibGljIENvbXBvc2l0ZSBnZXRDb250cm9sKCkgeworCQkJcmV0dXJuIF9wYWdlOworCQl9CisKKwkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJCV9vdmVycmlkZS5kaXNwb3NlKCk7CisJCQlfc3VzcGVuZC5kaXNwb3NlKCk7CisJCQlfY29uZmlnTGluay5kaXNwb3NlKCk7CisJCQlfZGlzYWJsZUFsbEJ1dHRvbi5kaXNwb3NlKCk7CisJCQlfZW5hYmxlQWxsQnV0dG9uLmRpc3Bvc2UoKTsKKwkJCV92YWxpZGF0b3JMaXN0LmdldFRhYmxlKCkuZGlzcG9zZSgpOworCQl9CisJCQorCQkvKioKKwkJICogRW5hYmxlIG9yIGRpc2FibGUgdGhlIHdpZGdldHMgYmFzZWQgb24gc29tZSB0b3AgbGV2ZWwgcHJlZmVyZW5jZXMuIAorCQkgKi8KKwkJcHJpdmF0ZSB2b2lkIGVuYWJsZURpc2FibGVXaWRnZXRzKCkgeworCQkJYm9vbGVhbiBnbG9iYWxPdmVycmlkZSA9IFZhbE1hbmFnZXIuZ2V0RGVmYXVsdCgpLmdldEdsb2JhbFByZWZlcmVuY2VzKCkuZ2V0T3ZlcnJpZGUoKTsKKwkJCWJvb2xlYW4gZW5hYmxlID0gIV9zdXNwZW5kLmdldFNlbGVjdGlvbigpICYgX292ZXJyaWRlLmdldFNlbGVjdGlvbigpICYgZ2xvYmFsT3ZlcnJpZGU7CisJCQlfc3VzcGVuZC5zZXRFbmFibGVkKF9vdmVycmlkZS5nZXRTZWxlY3Rpb24oKSAmIGdsb2JhbE92ZXJyaWRlKTsKKwkJCV92YWxpZGF0b3JzVGFibGUuc2V0RW5hYmxlZChlbmFibGUpOworCQkJX2VuYWJsZUFsbEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZSk7CisJCQlfZGlzYWJsZUFsbEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZSk7CisJCQlfY29uZmlnTGluay5zZXRFbmFibGVkKCFnbG9iYWxPdmVycmlkZSB8fCAhX292ZXJyaWRlLmdldFNlbGVjdGlvbigpKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIGxvc2VGb2N1cygpIHsKKwkJCS8vIFRoaXMgcGFnZSBkb2VzIG5vdCBuZWVkIHRvIGNhY2hlIGFueXRoaW5nIGJlZm9yZSBpdCBsb3NlcyBmb2N1cy4KKwkJfQorCisJCXB1YmxpYyB2b2lkIGdhaW5Gb2N1cygpIHsKKwkJfQorCX0KKworCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJdHJ5IHsKKwkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LCBIZWxwQ29udGV4dElkcy5Qcm9qZWN0UGFnZSk7CisJCQlfc2hlbGwgPSBwYXJlbnQuZ2V0U2hlbGwoKTsKKwkJCV9wYWdlSW1wbCA9IG5ldyBWYWxpZGF0b3JMaXN0UGFnZShwYXJlbnQpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7CisJCQlfcGFnZUltcGwgPSBuZXcgSW52YWxpZFBhZ2UocGFyZW50KTsKKwkJCWRpc3BsYXlBbmRMb2dFcnJvcihWYWxVSU1lc3NhZ2VzLlZCRl9FWENfSU5URVJOQUxfVElUTEUsIFZhbFVJTWVzc2FnZXMuVkJGX0VYQ19JTlRFUk5BTF9QQUdFLCBleGMpOworCQl9CisKKwkJcmV0dXJuIF9wYWdlSW1wbC5nZXRDb250cm9sKCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgeworCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKKworCQl0cnkgeworCQkJX3BhZ2VJbXBsLnBlcmZvcm1EZWZhdWx0cygpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7CisJCQlkaXNwbGF5QW5kTG9nRXJyb3IoVmFsVUlNZXNzYWdlcy5WQkZfRVhDX0lOVEVSTkFMX1RJVExFLCBWYWxVSU1lc3NhZ2VzLlZCRl9FWENfSU5URVJOQUxfUEFHRSwgZXhjKTsKKwkJfQorCX0KKworCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBfcGFnZUltcGwucGVyZm9ybU9rKCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKKwkJCWRpc3BsYXlBbmRMb2dFcnJvcihWYWxVSU1lc3NhZ2VzLlZCRl9FWENfSU5URVJOQUxfVElUTEUsIFZhbFVJTWVzc2FnZXMuVkJGX0VYQ19JTlRFUk5BTF9QQUdFLCBleGMpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCisJLyoqCisJICogU2luY2UgdGhlIHBhZ2VzIGFyZSBpbm5lciBjbGFzc2VzIG9mIGEgY2hpbGQgUHJlZmVyZW5jZVBhZ2UsIG5vdCBhCisJICogUHJlZmVyZW5jZVBhZ2UgaXRzZWxmLCBEaWFsb2dQYWdlJ3MgYXV0b21hdGljIGRpc3Bvc2FsIG9mIGl0cyBjaGlsZHJlbidzCisJICogd2lkZ2V0cyBjYW5ub3QgYmUgdXNlZC4gSW5zdGVhZCwgZGlzcG9zZSBvZiBlYWNoIGlubmVyIGNsYXNzJyB3aWRnZXRzCisJICogZXhwbGljaXRseS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlzdXBlci5kaXNwb3NlKCk7CisJCXRyeSB7CisJCQlpZiAoX3BhZ2VJbXBsICE9IG51bGwpIHsKKwkJCQlfcGFnZUltcGwuZGlzcG9zZSgpOworCQkJCV9wYWdlSW1wbCA9IG51bGw7CisJCQl9CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKKwkJCWRpc3BsYXlBbmRMb2dFcnJvcihWYWxVSU1lc3NhZ2VzLlZCRl9FWENfSU5URVJOQUxfVElUTEUsIFZhbFVJTWVzc2FnZXMuVkJGX0VYQ19JTlRFUk5BTF9QQUdFLCBleGMpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGxvZ0Vycm9yKFRocm93YWJsZSBleGMpIHsKKwkJVmFsaWRhdGlvblVJUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihleGMpOworCX0KKworCS8qCisJICogcGFja2FnZSB2aXNpYmlsaXR5IGJlY2F1c2UgaWYgdGhpcyBtZXRob2QgaXMgcHJpdmF0ZSwgdGhlbiB0aGUgY29tcGlsZXIKKwkgKiBuZWVkcyB0byBjcmVhdGUgYSBzeW50aGV0aWMgYWNjZXNzb3IgbWV0aG9kIGZvciB0aGUgaW50ZXJuYWwgY2xhc3NlcywgYW5kCisJICogdGhhdCBjYW4gaGF2ZSBwZXJmb3JtYW5jZSBpbXBsaWNhdGlvbnMuCisJICovCisJdm9pZCBkaXNwbGF5QW5kTG9nRXJyb3IoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4YykgeworCQlsb2dFcnJvcihleGMpOworCQlkaXNwbGF5TWVzc2FnZSh0aXRsZSwgbWVzc2FnZSwgb3JnLmVjbGlwc2Uuc3d0LlNXVC5JQ09OX0VSUk9SKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZGlzcGxheU1lc3NhZ2UoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSwgaW50IGlJY29uVHlwZSkgeworCQlNZXNzYWdlQm94IG1lc3NhZ2VCb3ggPSBuZXcgTWVzc2FnZUJveChnZXRTaGVsbCgpLAorCQkJb3JnLmVjbGlwc2Uuc3d0LlNXVC5PSyB8IGlJY29uVHlwZSB8IG9yZy5lY2xpcHNlLnN3dC5TV1QuQVBQTElDQVRJT05fTU9EQUwpOworCQltZXNzYWdlQm94LnNldE1lc3NhZ2UobWVzc2FnZSk7CisJCW1lc3NhZ2VCb3guc2V0VGV4dCh0aXRsZSk7CisJCW1lc3NhZ2VCb3gub3BlbigpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNzZXRWaXNpYmxlKGJvb2xlYW4pCisJICovCisJcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKKwkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKKworCQlpZiAoX3BhZ2VJbXBsID09IG51bGwpcmV0dXJuOworCQlpZiAodmlzaWJsZSlfcGFnZUltcGwuZ2FpbkZvY3VzKCk7CisJCWVsc2UgX3BhZ2VJbXBsLmxvc2VGb2N1cygpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNnZXREZWZhdWx0c0J1dHRvbigpCisJICovCisJcHJvdGVjdGVkIEJ1dHRvbiBnZXREZWZhdWx0c0J1dHRvbigpIHsKKwkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRzQnV0dG9uKCk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHNlbGVjdGVkIHByb2plY3QuCisJICovCisJcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7CisJCUlBZGFwdGFibGUgc2VsZWN0ZWRFbGVtZW50ID0gZ2V0RWxlbWVudCgpOworCQlpZiAoc2VsZWN0ZWRFbGVtZW50ID09IG51bGwpcmV0dXJuIG51bGw7CisJCWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdClyZXR1cm4gKElQcm9qZWN0KSBzZWxlY3RlZEVsZW1lbnQ7CisKKwkJT2JqZWN0IGFkYXB0ZWRPYmplY3QgPSBzZWxlY3RlZEVsZW1lbnQuZ2V0QWRhcHRlcihJUHJvamVjdC5jbGFzcyk7CisJCWlmIChhZGFwdGVkT2JqZWN0IGluc3RhbmNlb2YgSVByb2plY3QpcmV0dXJuIChJUHJvamVjdCkgYWRhcHRlZE9iamVjdDsKKwkJcmV0dXJuIG51bGw7CisKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCBhZTFhODkxLi44ZmIwZTE5IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTIsNyArMiw3IEBACiBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCiBCdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuNi5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiAxLjIuMTAucXVhbGlmaWVyCiBCdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbgogQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRvck1ldGFEYXRhLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRvck1ldGFEYXRhLmphdmEKaW5kZXggMGQwYjUxOC4uOTBkYTczOSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0b3JNZXRhRGF0YS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yTWV0YURhdGEuamF2YQpAQCAtMTk3LDcgKzE5NywxMSBAQAogCS8vIGNvbnRpbnVlcyB0byBuZXcgYW4gSVZhbGlkYXRpb25Db250ZXh0IGV2ZXJ5IHRpbWUgLSBSdXRoCiAJcHVibGljIElXb3JrYmVuY2hDb250ZXh0IGdldEhlbHBlcihJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CiAJCUlXb3JrYmVuY2hDb250ZXh0IGhlbHBlciA9IF9oZWxwZXIuZ2V0KCk7Ci0JCWlmIChoZWxwZXIgIT0gbnVsbClyZXR1cm4gaGVscGVyOworCQlpZiAoaGVscGVyICE9IG51bGwpeworCQkJSVByb2plY3Qgb2xkUHJvamVjdCA9IGhlbHBlci5nZXRQcm9qZWN0KCk7CisJCQlpZiAoKG9sZFByb2plY3QgPT0gbnVsbCkgfHwgIShvbGRQcm9qZWN0LmVxdWFscyhwcm9qZWN0KSkpaGVscGVyLnNldFByb2plY3QocHJvamVjdCk7CisJCQlyZXR1cm4gaGVscGVyOworCQl9CiAJCQogCQloZWxwZXIgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuY3JlYXRlSGVscGVyKF9oZWxwZXJDbGFzc0VsZW1lbnQsIF9oZWxwZXJDbGFzc05hbWUpOwogCQlpZiAoaGVscGVyID09IG51bGwpaGVscGVyID0gbmV3IFdvcmtiZW5jaENvbnRleHQoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvZGVsZWdhdGVzL1ZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2RlbGVnYXRlcy9WYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeS5qYXZhCmluZGV4IDA5YmM2M2YuLjNlYTAzNGYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvZGVsZWdhdGVzL1ZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5LmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9kZWxlZ2F0ZXMvVmFsaWRhdG9yRGVsZWdhdGVzUmVnaXN0cnkuamF2YQpAQCAtMTIsMTAgKzEyLDE3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmRlbGVnYXRlczsKIAogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuQ29uZmlndXJhdGlvbkNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwogCiAvKioKQEAgLTQwLDE5ICs0Nyw1NyBAQAogICAgKi8KICAgcHVibGljIHN0YXRpYyBWYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKICAgICBpZiAoX2luc3RhbmNlID09IG51bGwpIHsKLSAgICAgIF9pbnN0YW5jZSA9IG5ldyBWYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeSgpOwotICAgICAgVmFsaWRhdG9yRGVsZWdhdGVzUmVnaXN0cnlSZWFkZXIgcmVhZGVyID0gbmV3IFZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5UmVhZGVyKF9pbnN0YW5jZSk7Ci0gICAgICByZWFkZXIucmVhZFJlZ2lzdHJ5KCk7CisgICAgCVZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5IGluc3RhbmNlID0gbmV3IFZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5KCk7CisgICAgCVZhbGlkYXRvckRlbGVnYXRlc1JlZ2lzdHJ5UmVhZGVyIHJlYWRlciA9IG5ldyBWYWxpZGF0b3JEZWxlZ2F0ZXNSZWdpc3RyeVJlYWRlcihpbnN0YW5jZSk7CisgICAgCXJlYWRlci5yZWFkUmVnaXN0cnkoKTsKKyAgICAJaW5zdGFuY2UuaW5pdERlZmF1bHRzKCk7CisgICAgCV9pbnN0YW5jZSA9IGluc3RhbmNlOwogICAgIH0KIAogICAgIHJldHVybiBfaW5zdGFuY2U7CiAgIH0KIAogICAvKioKKyAgICogRGV0ZXJtaW5lIGlmIHRoZSBwcm9kdWN0IGRlZmluZWQgYW55IGRlZmF1bHQgZGVsZWdhdGUgdmFsaWRhdG9ycywgYnkgc2V0dGluZyB0aGUgb2xkCisgICAqIERFTEVHQVRFU19QUkVGRVJFTkNFIHByZWZlcmVuY2UgaW4gdGhlIGRlZmF1bHQgcHJlZmVyZW5jZSBzY29wZS4gSWYgdGhleSBkaWQsIHdlIHJlbWVtYmVyCisgICAqIHRoZW0sIHNvIHRoYXQgaWYgd2UgZXZlcnkgbmVlZCB0byByZXR1cm4gYSBkZWZhdWx0IGZvciB0aGUgZGVsZWdhdGluZyB2YWxpZGF0b3IsIHdlIGNhbiByZXR1cm4gdGhlIG9uZQorICAgKiB0aGF0IHRoZSBwcm9kdWN0IHJlcXVlc3RlZC4KKyAgICovCisgIHByaXZhdGUgdm9pZCBpbml0RGVmYXVsdHMoKSB7CisJICAJLy8gVGhpcyBjb2RlIHdhcyBjb3BpZWQgZnJvbSB0aGUgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24jZGVzZXJpYWxpemVEZWxlZ2F0ZXMoKSBtZXRob2QuIFRoZSBjb2RlIHdhcyBjb3BpZWQgYmVjYXVzZSB0aGlzCisJICAJLy8gY2hhbmdlIGlzIHBhcnQgb2YgYSBwYXRjaCBhbmQgSSBkaWRuJ3Qgd2FudCB0byBkaXN0dXJiIHRoZSBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiBjbGFzcy4KKwkgIAorCQlJRWNsaXBzZVByZWZlcmVuY2VzIHByZWZzID0gbmV3IERlZmF1bHRTY29wZSgpLmdldE5vZGUoVmFsaWRhdGlvblBsdWdpbi5QTFVHSU5fSUQpOworCQlTdHJpbmcgZGVsZWdhdGVQcmVmID0gcHJlZnMuZ2V0KCJERUxFR0FURVNfUFJFRkVSRU5DRSIsIG51bGwpOyAvLyROT04tTkxTLTEkCisJCWlmIChkZWxlZ2F0ZVByZWYgPT0gbnVsbClyZXR1cm47CisKKwkJaW50IGRlbGVnYXRlc0luZGV4ID0gZGVsZWdhdGVQcmVmLmluZGV4T2YoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5ERUxFR0FURV9WQUxJREFUT1JTKTsKKwkJU3RyaW5nIGRlbGVnYXRlcyA9IGRlbGVnYXRlUHJlZi5zdWJzdHJpbmcoZGVsZWdhdGVzSW5kZXggKyBDb25maWd1cmF0aW9uQ29uc3RhbnRzLkRFTEVHQVRFX1ZBTElEQVRPUlMubGVuZ3RoKCksIGRlbGVnYXRlUHJlZi5sZW5ndGgoKSk7CisKKwkJaWYgKGRlbGVnYXRlcyA9PSBudWxsKXJldHVybjsKKworCQlfZGVmYXVsdERlbGVnYXRlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oMTApOworCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihkZWxlZ2F0ZXMsIENvbmZpZ3VyYXRpb25Db25zdGFudHMuRUxFTUVOVF9TRVBBUkFUT1IpOworCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgeworCQkJU3RyaW5nIGRlbGVnYXRlQ29uZmlndXJhdGlvbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKKwkJCWludCBzZXBhcmF0b3JJbmRleCA9IGRlbGVnYXRlQ29uZmlndXJhdGlvbi5pbmRleE9mKENvbmZpZ3VyYXRpb25Db25zdGFudHMuREVMRUdBVEVTX1NFUEFSQVRPUik7CisvLwkJCVN0cmluZyB0YXJnZXRJRCA9IGRlbGVnYXRlQ29uZmlndXJhdGlvbi5zdWJzdHJpbmcoMCwgc2VwYXJhdG9ySW5kZXgpOworCQkJU3RyaW5nIGRlbGVnYXRlSUQgPSBkZWxlZ2F0ZUNvbmZpZ3VyYXRpb24uc3Vic3RyaW5nKHNlcGFyYXRvckluZGV4ICsgMSk7CisJCQlfZGVmYXVsdERlbGVnYXRlcy5hZGQoZGVsZWdhdGVJRCk7CisJCX0KKworCX0KKworLyoqCiAgICAqIFRoZSBtYXAgb2YgdGFyZ2V0IHZhbGlkYXRvciBpZCB0byBNYXAgb2YgZGVsZWdhdGVzIGJ5IGlkLgogICAgKi8KICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLFZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvcj4+IF9kZWxlZ2F0ZXNCeVRhcmdldCA9IAogCSAgbmV3IEhhc2hNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLFZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvcj4+KCk7CisgIAorICAvKioKKyAgICogVmFsaWRhdG9yIGlkcyB0aGF0IGhhdmUgYmVlbiBkZWZpbmVkIGJ5IHRoZSBwcm9kdWN0IHRvIGJlIHRoZSBkZWZhdWx0IHZhbGlkYXRvcnMsIGZvciBzb21lIG9mIHRoZSBkZWxlZ2F0aW5nIHZhbGlkdG9ycy4KKyAgICovCisgIHByaXZhdGUgU2V0PFN0cmluZz4gX2RlZmF1bHREZWxlZ2F0ZXM7CiAKICAgLyoqCiAgICAqIEFkZHMgYSBkZXNjcmlwdG9yIHRvIHRoZSByZWdpc3RyeS4KQEAgLTg4LDEyICsxMzMsMTkgQEAKIAogICAgIGlmIChkZWxlZ2F0ZXMgPT0gbnVsbClyZXR1cm4gbnVsbDsKIAorICAgIGlmIChfZGVmYXVsdERlbGVnYXRlcyAhPSBudWxsKXsKKyAgICAJZm9yIChWYWxpZGF0b3JEZWxlZ2F0ZURlc2NyaXB0b3IgdmRkIDogZGVsZWdhdGVzLnZhbHVlcygpKXsKKyAgICAJCVN0cmluZyBpZCA9IHZkZC5nZXRJZCgpOworICAgIAkJaWYgKF9kZWZhdWx0RGVsZWdhdGVzLmNvbnRhaW5zKGlkKSlyZXR1cm4gaWQ7CisgICAgCX0KKyAgICB9CisgICAgCiAgICAgLy8gVE9ETzogSW1wbGVtZW50IGEgZGVmYXVsdCBhdHRyaWJ1dGUgYW5kIHVzZSB0aGF0IHRvIGdldCB0aGUgZGVmYXVsdD8KICAgICAvLyBXaGF0IGhhcHBlbnMgaWYgdHdvIG9yIG1vcmUgZGVsZWdhdGVzIGNsYWltIHRvIGJlIHRoZSBkZWZhdWx0IG9uZT8KICAgICAvLyBGb3Igbm93LCBqdXN0IHBpY2sgdGhlIGZpcnN0IG9uZSBpbiB0aGUgbGlzdC4KIAogICAgIEl0ZXJhdG9yPFZhbGlkYXRvckRlbGVnYXRlRGVzY3JpcHRvcj4gZGVsZWdhdGVzSXRlcmF0b3IgPSBkZWxlZ2F0ZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQorICAgIAogICAgIGlmICghZGVsZWdhdGVzSXRlcmF0b3IuaGFzTmV4dCgpKXJldHVybiBudWxsOwogCiAgICAgcmV0dXJuIGRlbGVnYXRlc0l0ZXJhdG9yLm5leHQoKS5nZXRJZCgpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1ZhbGlkYXRpb25PcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9WYWxpZGF0aW9uT3BlcmF0aW9uLmphdmEKaW5kZXggMDQ1YmUxNy4uYzlmN2I1MyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1ZhbGlkYXRpb25PcGVyYXRpb24uamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvVmFsaWRhdGlvbk9wZXJhdGlvbi5qYXZhCkBAIC0xMTExLDE1ICsxMTExLDIyIEBACiAJICogPGNvZGU+cHJvY2VzczwvY29kZT4gYWxzbyBzZW5kcyBvdXRwdXQgdG8gdGhlIDxjb2RlPklQcm9ncmVzc01vbml0b3I8L2NvZGU+LCBhbmQgY2FsbHMKIAkgKiB0aGUgY3VycmVudCBWYWxpZGF0b3IgdG8gdmFsaWRhdGUgdGhlIHJlc291cmNlLgogCSAqIAotCSAqIFRvIHByb2Nlc3MgYSByZXNvdXJjZSwgdGhlcmUgYXJlIHNldmVyYWwgc3RlcHM6IDEuIGNoZWNrIGlmIHRoZSByZXNvdXJjZSBpcyByZWdpc3RlcmVkIGZvcgorCSAqIDxwPlRvIHByb2Nlc3MgYSByZXNvdXJjZSwgdGhlcmUgYXJlIHNldmVyYWwgc3RlcHM6PC9wPiAKKwkgKiA8cD4xLiBjaGVjayBpZiB0aGUgcmVzb3VyY2UgaXMgcmVnaXN0ZXJlZCBmb3IKIAkgKiB0aGlzIHZhbGlkYXRvciAoaS5lLiwgdGhlIHZhbGlkYXRvciBoYXMgZWl0aGVyIHNwZWNpZmllZCBpdCBpbiBhIGZpbHRlciwgb3IgaGFzIG5vdCBmaWx0ZXJlZAotCSAqIGl0IG91dCBleHBsaWNpdGx5KSAyLiBjYWxsIDxjb2RlPmlzVmFsaWRhdGlvblNvdXJjZTwvY29kZT4gb24gdGhlIGN1cnJlbnQgdmFsaWRhdG9yIHdpdGgKKwkgKiBpdCBvdXQgZXhwbGljaXRseSk8L3A+CisJICogCisJICogPHA+Mi4gY2FsbCA8Y29kZT5pc1ZhbGlkYXRpb25Tb3VyY2U8L2NvZGU+IG9uIHRoZSBjdXJyZW50IHZhbGlkYXRvciB3aXRoCiAJICogdGhlIGN1cnJlbnQgcmVzb3VyY2UuIFRoaXMgbWV0aG9kIHBlcmZvcm1zIGZ1cnRoZXIgZmlsdGVyaW5nIGJ5IHRoZSBWYWxpZGF0b3IgaXRzZWxmLCBpbgogCSAqIGFkZGl0aW9uIHRvIHRoZSBzdGF0aWMgZmlsdGVyaW5nIGRvbmUgYnkgdGhlIGZyYW1ld29yaywgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIGluCi0JICogcGx1Z2luLnhtbC4gMy4gSWYgdGhlIHJlc291cmNlIHBhc3NlcyBib3RoIGZpbHRlcnMsIGNhbGwgPGNvZGU+dmFsaWRhdGU8L2NvZGU+IG9uIHRoZQotCSAqIHZhbGlkYXRvciwgd2l0aCB0aGUgcmVzb3VyY2UuIDQuIFdoZW4gY29tcGxldGUgKGVpdGhlciBieSBmYWlsaW5nIHRvIHBhc3MgYSBmaWx0ZXIsIG9yIGJ5IHRoZQorCSAqIHBsdWdpbi54bWwuPC9wPiAKKwkgKiAKKwkgKiA8cD4zLiBJZiB0aGUgcmVzb3VyY2UgcGFzc2VzIGJvdGggZmlsdGVycywgY2FsbCA8Y29kZT52YWxpZGF0ZTwvY29kZT4gb24gdGhlCisJICogdmFsaWRhdG9yLCB3aXRoIHRoZSByZXNvdXJjZS48L3A+IAorCSAqIAorCSAqIDxwPjQuIFdoZW4gY29tcGxldGUgKGVpdGhlciBieSBmYWlsaW5nIHRvIHBhc3MgYSBmaWx0ZXIsIG9yIGJ5IHRoZQogCSAqIGNvbXBsZXRpb24gb2YgdGhlIDxjb2RlPnZhbGlkYXRlPC9jb2RlPiksIGluY3JlbWVudCB0aGUgSVByb2dyZXNzTW9uaXRvcidzIHN0YXR1cyBieSBvbmUKLQkgKiAoaS5lLiwgb25lIHJlc291cmNlIGhhcyBiZWVuIHByb2Nlc3NlZC4pCisJICogKGkuZS4sIG9uZSByZXNvdXJjZSBoYXMgYmVlbiBwcm9jZXNzZWQuKTwvcD4KIAkgKi8KIAlwcml2YXRlIGZpbmFsIHZvaWQgbGF1bmNoVmFsaWRhdG9yKFdvcmtiZW5jaFJlcG9ydGVyIHJlcG9ydGVyLCBJVmFsaWRhdG9yIHZhbGlkYXRvciwgVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBJV29ya2JlbmNoQ29udGV4dCBoZWxwZXIsIElGaWxlRGVsdGFbXSBkZWx0YSkgewogCQlpZiAocmVwb3J0ZXIgPT0gbnVsbClyZXR1cm47CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9WYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5qYXZhCmluZGV4IGRjYWVhODQuLjJhZGIzYmIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL1ZhbGlkYXRvci5qYXZhCkBAIC03NTIsNyArNzUyLDEyIEBACiAJCQkJVmFsaWRhdG9yTGF1bmNoZXIuZ2V0TGF1bmNoZXIoKS5zdGFydChoZWxwZXIsIHYsIHJlcG9ydGVyKTsKIAkJCX0KIAkJCWZpbmFsbHkgewotCQkJCWhlbHBlci5jbGVhbnVwKHJlcG9ydGVyKTsKKwkJCQl0cnkgeworCQkJCQl2LmNsZWFudXAocmVwb3J0ZXIpOworCQkJCX0KKwkJCQlmaW5hbGx5IHsKKwkJCQkJaGVscGVyLmNsZWFudXAocmVwb3J0ZXIpOworCQkJCX0KIAkJCX0KIAkJCQogCQkJdnIuaW5jcmVtZW50RXJyb3IocmVwb3J0ZXIuZ2V0U2V2ZXJpdHlIaWdoKCkpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvRGVwZW5kZW5jeUluZGV4LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9EZXBlbmRlbmN5SW5kZXguamF2YQppbmRleCBmZjI5ZGNhLi4zODg3MzhjIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9EZXBlbmRlbmN5SW5kZXguamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9EZXBlbmRlbmN5SW5kZXguamF2YQpAQCAtODQsNyArODQsNyBAQAogCXByaXZhdGUgRGVwZW5kcyBnZXRPckNyZWF0ZURlcGVuZHMoSVJlc291cmNlIGRlcGVuZGVudCwgSVJlc291cmNlIGRlcGVuZHNPbikgewogCQlTZXQ8RGVwZW5kcz4gc2V0ID0gZ2V0U2V0KF9kZXBlbmRlbnRzLCBkZXBlbmRlbnQpOwogCQlmb3IgKERlcGVuZHMgZCA6IHNldCl7Ci0JCQlpZiAoZC5nZXREZXBlbmRzT24oKS5lcXVhbHMoZGVwZW5kc09uKSkgcmV0dXJuIGQ7CisJCQlpZiAoZC5nZXREZXBlbmRzT24oKSAhPSBudWxsICYmIGQuZ2V0RGVwZW5kc09uKCkuZXF1YWxzKGRlcGVuZHNPbikpIHJldHVybiBkOwogCQl9CiAJCURlcGVuZHMgZCA9IG5ldyBEZXBlbmRzKGRlcGVuZGVudCwgZGVwZW5kc09uKTsKIAkJX2RpcnR5ID0gdHJ1ZTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL01hcmtlck1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL01hcmtlck1hbmFnZXIuamF2YQppbmRleCA1YzYxNTI5Li44Nzc2NTI1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9NYXJrZXJNYW5hZ2VyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvTWFya2VyTWFuYWdlci5qYXZhCkBAIC0xMDgsOCArMTA4LDE3IEBACiAJCXRyeSB7CiAJCQlob29rKHJlc291cmNlKTsgCiAJCQlJTWFya2VyW10gbWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKG51bGwsIHRydWUsIGRlcHRoKTsKKwkJCVN0cmluZyBtYXJrZXJUeXBlOwogCQkJZm9yIChJTWFya2VyIG1hcmtlciA6IG1hcmtlcnMpewotCQkJCWlmIChfbWFya2Vycy5jb250YWlucyhtYXJrZXIuZ2V0VHlwZSgpKSl7CisJCQkJdHJ5IHsKKwkJCQkJbWFya2VyVHlwZSA9IG1hcmtlci5nZXRUeXBlKCk7CisJCQkJfQorCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCisJCQkJeworCQkJCQkvL2lnbm9yZSB0aGUgbWFya2VyCisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJaWYgKF9tYXJrZXJzLmNvbnRhaW5zKG1hcmtlclR5cGUpKXsKIAkJCQkJbG9uZyBjcmVhdGVUaW1lID0gbWFya2VyLmdldENyZWF0aW9uVGltZSgpOwogCQkJCQlpZiAoY3JlYXRlVGltZSA8IG9wZXJhdGlvblN0YXJ0VGltZSl7CiAJCQkJCQl0cnkgewpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi92ZjIvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsTWFuYWdlci5qYXZhCmluZGV4IDNiMmQwNDEuLjkyMTRhMTkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24vdmYyL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbE1hbmFnZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uL3ZmMi9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxNYW5hZ2VyLmphdmEKQEAgLTI4LDYgKzI4LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VTdGF0dXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlVmlzaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CkBAIC05MTcsOSArOTE4LDE0IEBACiAJCXRyeSB7CiAJCQlpZiAodmFsVHlwZSA9PSBWYWxUeXBlLkJ1aWxkKXJlc291cmNlLnNldFNlc3Npb25Qcm9wZXJ0eShTdGF0dXNCdWlsZCwgdnApOwogCQkJZWxzZSBpZiAodmFsVHlwZSA9PSBWYWxUeXBlLk1hbnVhbClyZXNvdXJjZS5zZXRTZXNzaW9uUHJvcGVydHkoU3RhdHVzTWFudWFsLCB2cCk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSl7Ci0JCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlLCBJU3RhdHVzLldBUk5JTkcpOworCQl9IAorCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJICAgICAgICAvLyBJZiB0aGUgcmVzb3VyY2UgaXMgbm90IGZvdW5kLCBpdCBpcyBsaWtlbHkganVzdCBiZWVuIGRlbGV0ZWQgCisJICAgICAgICAvLyBhbmQgdGhlcmUgaXMgbm8gbmVlZCB0byBkbyBhbnl0aGluZy4gCisJICAgICAgICAvLyBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2OTAyMgorCSAgICAgICAgaWYgKCFlLmdldFN0YXR1cygpLmVxdWFscyhJUmVzb3VyY2VTdGF0dXMuUkVTT1VSQ0VfTk9UX0ZPVU5EKSkgeworCSAgICAgICAgICAgICAgICBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihlLCBJU3RhdHVzLldBUk5JTkcpOworCSAgICAgICAgfQogCQl9CiAJfQogCg==